在本项目中只是简单的引入的Spring Cloud GateWay的依赖,来实现路由跳转。

1.1、GateWay快速入门

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

  1. <properties>
  2. <java.version>1.8</java.version>
  3. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
  4. </properties>
  5. <dependencies>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-starter-gateway</artifactId>
  9. </dependency>
  10. <dependency>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-test</artifactId>
  13. <scope>test</scope>
  14. </dependency>
  15. </dependencies>
  16. <dependencyManagement>
  17. <dependencies>
  18. <dependency>
  19. <groupId>org.springframework.cloud</groupId>
  20. <artifactId>spring-cloud-dependencies</artifactId>
  21. <version>${spring-cloud.version}</version>
  22. <type>pom</type>
  23. <scope>import</scope>
  24. </dependency>
  25. </dependencies>
  26. </dependencyManagement>

关于Spring Cloud GateWay配置路由有两种方式,分别是注解和配置文件来进行配置。
注意这里的核心依赖是:

  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-gateway</artifactId>
  5. </dependency>
  6. </dependencies>

1.2、编程式

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

  1. @SpringBootApplication
  2. public class GatewayApplication {
  3. public static void main(String[] args) {
  4. SpringApplication.run( GatewayApplication.class, args );
  5. }
  6. @Bean
  7. public RouteLocator redirectRouteLocator(RouteLocatorBuilder builder) {
  8. return builder.routes()
  9. .route("path_router", r -> r.path("/get")
  10. .uri("http://httpbin.org"))
  11. .build();
  12. }
  13. }

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

1.3、配置文件方式

  1. server:
  2. port: 8080
  3. spring:
  4. cloud:
  5. gateway:
  6. routes:
  7. - id: path_route
  8. uri: http://httpbin.org
  9. predicates:
  10. - 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 的工作机制,在日常项目中我们可根据不同的需求,配置不同的路由转发策略,大部分使用场景只需要调整不同的配置信息即可实现

1.4、网关和注册中心

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

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

首先创建一个名叫 spring-cloud-gateway-eureka的maven 工程,作为父工程,然后创建一个eureka-server的springboot工程,作为注册中心,并且作为子项目。然后我们创建一个rest-provider-1的springboot工程,作为服务提供者,并且作为子项目。然后我们再创建一个rest-consumer-1的springboot工程,作为服务消费者,并且为子项目。然后我们再创建一个user的普通maven工程,并且提供一个简单的UserVo类。

  • UserVo类 ```java public class UserVo { private String nickname; private String age; private String address; private String job; }
  1. - 我们在rest-provider-1 中提供一个getUser服务:
  2. ```java
  3. @RestController
  4. public class ProviderController {
  5. private Logger log = LoggerFactory.getLogger(this.getClass());
  6. @RequestMapping(value = "/getUser",method = RequestMethod.POST)
  7. public ResponseEntity<Object> getUser(@RequestBody UserVo user) {
  8. log.info("provider中到getUser服务被调用了");
  9. user.setAddress(user.getAddress());
  10. user.setAge(user.getAge());
  11. user.setJob(user.getJob());
  12. user.setNickname(user.getNickname());
  13. return new ResponseEntity<Object>(user, HttpStatus.OK);
  14. }
  15. }
  • 在 rest-consumer-1 中使用feign消费我们 rest-provider-1 中提供的服务:

FeignService

  1. @FeignClient("rest-provider-1")
  2. public interface FeignService {
  3. @GetMapping("/getUser")
  4. ResponseEntity<Object> getUser(@RequestBody UserVo user);
  5. }
  • 消费 ```java @RestController public class ConsumerController { @Autowired FeignService feignService;

    @RequestMapping(value = “/getUser”,method = RequestMethod.POST) public ResponseEntity getUser(@RequestBody UserVo user) {

    1. Object result = feignService.getUser(user);
    2. return new ResponseEntity<Object>(result, HttpStatus.OK);

    } }

    1. **分别启动 eureka-serverrest-provider-1rest-consumer-1 然后通过postman 或者其它http请求工具、对 **http://localhost:8002/getUser 进行测试,返回下面结果,我们对准备工作就完成了。<br />![20190908120238775.png](https://cdn.nlark.com/yuque/0/2021/png/25363358/1638432715752-620cd7e0-69fd-48b0-af9f-8ab651c1ef2b.png#clientId=uf7372e9a-fe6e-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u8ab806e6&margin=%5Bobject%20Object%5D&name=20190908120238775.png&originHeight=978&originWidth=2044&originalType=binary&ratio=1&rotation=0&showTitle=false&size=147882&status=done&style=none&taskId=ufbda44ea-226e-49bf-a69a-887d5d48e38&title=)<br />![20190908120254416.png](https://cdn.nlark.com/yuque/0/2021/png/25363358/1638432733742-612c678b-457c-41a1-8451-e8d4ac8a7847.png#clientId=uf7372e9a-fe6e-4&crop=0&crop=0&crop=1&crop=1&from=ui&id=u4e0121fa&margin=%5Bobject%20Object%5D&name=20190908120254416.png&originHeight=1206&originWidth=2104&originalType=binary&ratio=1&rotation=0&showTitle=false&size=168221&status=done&style=none&taskId=u0930a819-c986-42bf-8fcc-e73ba2d5ef4&title=)<br />**然后创建eureka-gateway的springboot项目,作为子项目。**
    2. ```java
    3. <properties>
    4. <java.version>1.8</java.version>
    5. <spring-cloud.version>Greenwich.SR2</spring-cloud.version>
    6. </properties>
    7. <dependencies>
    8. <dependency>
    9. <groupId>org.springframework.boot</groupId>
    10. <artifactId>spring-boot-starter-web</artifactId>
    11. </dependency>
    12. <dependency>
    13. <groupId>org.springframework.cloud</groupId>
    14. <artifactId>spring-cloud-starter-gateway</artifactId>
    15. </dependency>
    16. <dependency>
    17. <groupId>org.springframework.cloud</groupId>
    18. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    19. </dependency>
    20. <dependency>
    21. <groupId>org.springframework.boot</groupId>
    22. <artifactId>spring-boot-devtools</artifactId>
    23. <scope>runtime</scope>
    24. <optional>true</optional>
    25. </dependency>
    26. <dependency>
    27. <groupId>org.springframework.boot</groupId>
    28. <artifactId>spring-boot-starter-test</artifactId>
    29. <scope>test</scope>
    30. </dependency>
    31. </dependencies>
    32. <dependencyManagement>
    33. <dependencies>
    34. <dependency>
    35. <groupId>org.springframework.cloud</groupId>
    36. <artifactId>spring-cloud-dependencies</artifactId>
    37. <version>${spring-cloud.version}</version>
    38. <type>pom</type>
    39. <scope>import</scope>
    40. </dependency>
    41. </dependencies>
    42. </dependencyManagement>
    • 创建好项目后,我们将eureka-gateway 注册到 eureka-server 中并且配置网关: ```yaml spring: application: name: eureka-gateway cloud: gateway:
      1. discovery:
      2. locator:
      3. enabled: true

    server: port: 8888

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

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

    1. - 上面gateway配置说明:
    2. ```properties
    3. spring.cloud.gateway.discovery.locator.enabled
    • 是否开启通过注册中心进行路由转发的功能,通过 serviceld 转发到服务,默认为 false.
      1. logging.level.org.springframework.cloud.gateway
      调整 gateway 包的log级别,以便排查问题。
      然后启动 eureka-gateway, 然后我们访问 http://localhost:1111/:

    20190908122837589.png
    看到都注册上去了后,我们用网关访问我们的服务http://localhost:8888/REST-CONSUMER-1/getUser 注意这里的服务名称必须大写,可以通过配置来支持小写。
    我们用postman 之类的工具,来发起请求:
    20190908123032816.png
    说明我们通过路由转发功能调用了 CONSUMER 的 hello 服务,并且我们在配置文件中只是配置了注册中心的地址,并没有配置具体的服务提供者信息。

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

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

    总结

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

    原文链接:https://blog.csdn.net/qwe86314/article/details/100607371