当前位置:首页 > 后端开发 > SpringCloud之GateWay快速入门

SpringCloud之GateWay快速入门

4个月前 (05-17)72

在本项目中只是简单的引入的Spring Cloud GateWay的依赖,来实现路由跳转,更复杂的使用将会在下一篇文章中教大家使用。

GateWay 快速入门

首先我们创建一个简单的SpringBoot工程,pom依赖如下:

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

关于Spring Cloud GateWay 配置路由有两种方式,分别是注解和配置文件来进行配置。

注意这里的核心依赖是:

<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>
</dependencies>

编程式

首先我们在启动类中使用@Bean来注入RouteLocator来配置路由,完整配置如下:

@SpringBootApplication
public class GatewayApplication {
     

    public static void main(String[] args) {
     
        SpringApplication.run( GatewayApplication.class, args );
    }

    @Bean
    public RouteLocator redirectRouteLocator(RouteLocatorBuilder builder) {
     
        return builder.routes()
                .route("path_router", r -> r.path("/get")
                .uri("http://httpbin.org"))
                .build();
    }

}

上面这段配置的意思是,配置了一个 id 为 path_route 的路由规则,当访问地址 http://localhost:8080/get 时会自动转发到地址:http://httpbin.org/get 。配置完成启动项目即可在浏览器访问进行测试,当我们访问地址http://localhost:8080/get 时页面展示如下信息:
SpringCloud之GateWay快速入门 _ Java侠

配置文件方式

在resource 中使用.properties或者.yml,这里我用yml来演示,首先在application.yml中配置如下参数:

server:
  port: 8080
spring:
  cloud:
    gateway:
      routes:
        - id: path_route
          uri: http://httpbin.org
          predicates:
            - Path=/get

分别来解释下上面配置的作用:

  1. id:我们自定义的路由 ID,保持唯一,代码中就是 route() 方法的第一个参数。
  2. uri:需要转发的目标服务地址,r -> r.path("/get").uri("http://httpbin.org") 代码使用了函数时编程简化代码。
  3. predicates:路由条件,Predicate 接受一个输入参数,返回一个布尔值结果。该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与,或,非)。
  4. filters:过滤规则,本示例暂时没用。

配置完成之后我们把上启动类中的中的RouteLocator 配置全部注销掉, 然后重新启动,访问http://localhost:8080/get ,返回信息和上述返回的结果一致,这说明了通过配置的方式也可以到达路由转发的功能。在实际项目中为了方便维护,推荐使用配置文件的方式来配置。

两个 hello world 版的示例都体验完之后,基本可以了解 Spring Cloud GateWay 的工作机制,在日常项目中我们可根据不同的需求,配置不同的路由转发策略,大部分使用场景只需要调整不同的配置信息即可实现。

网关和注册中心

上面两种转发方式只适合在单一的项目中使用,如果在微服务架构中就会存在一个致命的问题,微服务架构中服务提供者是动态变化的,所以不能直接将目标服务器地址写在配置文件中。那么在微服务架构中如何解决这个问题呢,这个时候就需要和注册中心来配置使用,本文以 Eureka 和 Spring Cloud Gateway 为例给大家讲解。

当网关和注册中心结合起来使用时,把网关当作一个客户端注册到注册中心,然后网关从注册中心获取所有服务,并自动为这些服务提供路由转发功能。Spring Cloud Gateway 提供了此功能,在项目中只需要简单配置即可达到这样的效果,接下来进行演示。

首先我们创建一个名叫spring-cloud-gateway-eureka的maven工程, 做为父工程,然后创建一个eureka-server 的SpringBoot工程,做为注册中心,并且做为子项目。然后我们创建一个rest-provider-1的SpringBoot工程,做为服务提供者,并且做为子项目。然后我们再创建一个rest-consumer-1的SpringBoot工程,做为服务消费者,并且做为子项目。 对于eureka和provider以及consumer的创建我就不阐述了,非常的简单。不清楚的可以参考最下面的源码。 然后我们再创建一个user的普通maven工程,并且提供一个简单的UserVo类。

下面是UserVO内容:

public class UserVo {
     
     private String nickname;
     private String age;
     private String address;
     private String job;
 }

省略get/set方法

我们在rest-provier-1中提供一个getUser服务,服务编写如下:

@RestController
public class ProviderController {
     
    private Logger log = LoggerFactory.getLogger(this.getClass());
    @RequestMapping(value = "/getUser",method = RequestMethod.POST)
    public ResponseEntity<Object> getUser(@RequestBody UserVo user) {
     
        log.info("provider中到getUser服务被调用了");
        user.setAddress(user.getAddress());
        user.setAge(user.getAge());
        user.setJob(user.getJob());
        user.setNickname(user.getNickname());
        return new ResponseEntity<Object>(user, HttpStatus.OK);
    }
}

再rest-consumer-1 中使用feign消费我们rest-provier-1 中提供的服务:
FeignService

@FeignClient("rest-provider-1")
public interface FeignService {
     
    @GetMapping("/getUser")
    ResponseEntity<Object> getUser(@RequestBody UserVo user);
}

消费

@RestController
public class ConsumerController {
     
    @Autowired
    FeignService feignService;

    @RequestMapping(value = "/getUser",method = RequestMethod.POST)
    public ResponseEntity<Object> getUser(@RequestBody UserVo user) {
     
       Object result =  feignService.getUser(user);
        return new ResponseEntity<Object>(result, HttpStatus.OK);
    }
}

分别启动eureka-server 、 rest-provider-1、rest-consumer-1 然后通过postman 或者其它http请求工具、对http://localhost:8002/getUser 进行测试,返回下面结果,我们对准备工作就完成了。

SpringCloud之GateWay快速入门 _ Java侠
SpringCloud之GateWay快速入门 _ Java侠

然后我们创建eureka-gateway的SpringBoot项目,做为子项目。

eureka-gateway依赖如下:

<properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

创建好项目后,我们将eureka-gateway注册到eureka-server中,并且配置网关:

spring:
  application:
    name: eureka-gateway
  cloud:
    gateway:
      discovery:
        locator:
          enabled: true
          
server:
  port: 8888

eureka:
  client:
    service-url:
      defaultZone: http://localhost:1111/eureka/

logging:
  level:
    org.springframework.cloud.gateway: debug

上面gateway配置说明:

spring.cloud.gateway.discovery.locator.enabled

是否开启通过注册中心进行路由转发的功能,通过 serviceId 转发到服务,默认为 false。

logging.level.org.springframework.cloud.gateway

调整 gateway 包的 log 级别,以便排查问题。

然后启动eureka-gateway,然后我们访问http://localhost:1111/
SpringCloud之GateWay快速入门 _ Java侠
看到都注册上去了后,我们用网关访问我们的服务http://localhost:8888/REST-CONSUMER-1/getUser 注意这里的服务名称必须大写,可以通过配置来支持小写。

我们用postman 之类的工具,来发起请求:
SpringCloud之GateWay快速入门 _ Java侠

响应结果如下:
SpringCloud之GateWay快速入门 _ Java侠

说明我们通过路由转发功能调用了 CONSUMER 的 hello 服务,并且我们在配置文件中只是配置了注册中心的地址,并没有配置具体的服务提供者信息。

通过上面的实验说明 Spring Cloud Gateway 和 Eureka 已经深度融合,只需要在 Gateway 中配置好注册中心的地址,即可代理注册中心的所有服务提供者,省掉了中间繁琐的配置。

注意访问的格式是这样的:http://网关地址:端口/服务中心注册 serviceId/具体的 url

总结

本节课为大家演示了如何使用 Spring Cloud Gateway。Spring Cloud Gateway 默认有两种使用方式,一种是通过编码的方式来实现,一种是通过配置文件的方式来实现,推荐使用配置文件的方式来使用,便于后期修改维护。Spring Cloud Gateway 支持和注册中心结合起来使用,只要将 Spring Cloud Gateway 注册到注册中心,即可自动代理注册中心中的所有服务,简化路由配置和使用方式。

源码地址

微服务网关快速实践: github
微服务网关调用服务:github

作者:代码忘烦恼
来源链接:https://blog.csdn.net/qwe86314/article/details/100607371

标签: Gateway

“SpringCloud之GateWay快速入门” 的相关文章

Spring Cloud Gateway简单使用

Spring Cloud Gateway简单使用

一、引子 2年前有幸使用过一次Spring Cloud (1.5.9),1.* 集成的是ZUUL做网关。终于在2年后,这次果断使用Spring Cloud Gateway。 区...

spring cloud gateway 负载均衡流程

网关被扫描后会注册四个核心配置类,当然在配置类中仍然有各种流程中需要的bean后面会详细解释。 l  GatewayAutoConfiguration  网关基...

如何通过Gateway网关进行限流操作?

如何通过Gateway网关进行限流操作?

在高并发的系统中,往往需要在系统中做限流,一方面是为了防止大量的请求使服务器过载,导致服务不可用,另一方面是为了防止网络攻击。 1. 常见限流...

SpringCloudGateway实现网关限流 二种方式

SpringCloudGateway实现网关限流 二种方式

欢迎大家进群,一起探讨学习 微信公众号,每天给大家提供技术干货 博主技术笔记 博主网站地址1 博主网站地址2...

Spring Cloud 使用 GateWay

Spring Cloud 使用 GateWay

GateWay简介 Spring Cloud GateWay是Spring Cloud的一个全新项目,目标是取代Netflix Zuul,它基于Spring5.0+Sp...

【Gateway】网关Gateway全局过滤器和局部过滤器的实现

1. 全局过滤器: 无差别拦截所有经过网关 的请求 实现GlobalFilter接口,可以通过@Order注解或者Ordered接口指定...

springcloud gateway网关多路由配置访问404解决方案

首先说说我遇到的情况,我是在gateway网关服务中配置了3个路由分别访问到不同的模块,然而第一个配置的路由可以正常访问,之后添加2个路由一直是40...

Nginx 502 Bad Gateway 错误的原因及解决方法

Nginx 502 Bad Gateway 错误的原因及解决方法

项目启动时,莫名其妙网站访问不了,502 Bad Gateway 百度原因:502 Bad Gateway错误通常是互联网上服务器之间的网络错误 简言之:...

Gateway + Oauth2 + Security认证与授权 [更新中]

Gateway + Oauth2 + Security认证与授权 [更新中]

Gateway + Oauth2 + Security认证与授权 讲道理,Security是目前知道的框架中最难掌握的一个框架,我接下来的学习目标都将围绕它而展开,...

微服务之Gateway,Config,Bus,Stream,Sleuth

微服务之Gateway,Config,Bus,Stream,Sleuth

Gateway网关 提供一种简单而有效的方式对API进行路由,以及提供强大的过滤器的功能。(webflux是一种异步非阻塞的框架),也算是一种...