概述

Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等技术开发的网关,它旨在为微服务架构提供一种简单有效的统一的 API 路由管理方式。

Spring Cloud Gateway 作为 Spring Cloud 生态系统中的网关,目标是替代 Netflix Zuul,其不仅提供统一的路由方式,并且基于 Filter 链的方式提供了网关基本的功能,例如:安全、监控、埋点和限流等。

Spring Cloud Gateway 的特征:
• 基于 Spring Framework 5,Project Reactor 和 Spring Boot 2.0
• 动态路由
• Predicates 和 Filters 作用于特定路由
• 集成 Hystrix 断路器
• 集成 Spring Cloud DiscoveryClient
• 易于编写的 Predicates 和 Filters
• 限流
• 路径重写

术语

• Route(路由):这是网关的基本构建块。它由一个 ID,一个目标 URI,一组断言和一组过滤器定义。如果断言为真,则路由匹配。
• Predicate(断言):这是一个 Java 8 的 Predicate。输入类型是一个 ServerWebExchange。我们可以使用它来匹配来自 HTTP 请求的任何内容,例如 headers 或参数。
• Filter(过滤器):这是 org.springframework.cloud.gateway.filter.GatewayFilter的实例,我们可以使用它修改请求和响应。

工作流程

image.png
客户端向 Spring Cloud Gateway 发出请求。然后在 Gateway Handler Mapping 中找到与请求相匹配的路由,将其发送到 Gateway Web Handler。Handler 再通过指定的过滤器链来将请求发送到我们实际的服务执行业务逻辑,然后返回。过滤器之间用虚线分开是因为过滤器可能会在发送代理请求之前(“pre”)或之后(“post”)执行业务逻辑。

快速入门

创建一个名称为 spring-cloud-gateway 的pom项目,pom 内容如下。
4.0.0

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>com.gallenzhang</groupId>
  7. <artifactId>spring-cloud-parent</artifactId>
  8. <version>1.0.0-SNAPSHOT</version>
  9. <relativePath />
  10. </parent>
  11. <groupId>com.gallenzhang</groupId>
  12. <artifactId>spring-cloud-gateway</artifactId>
  13. <version>1.0.0-SNAPSHOT</version>
  14. <name>spring-cloud-gateway</name>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.cloud</groupId>
  18. <artifactId>spring-cloud-starter-gateway</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  23. </dependency>
  24. </dependencies>
  25. <build>
  26. <plugins>
  27. <plugin>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-maven-plugin</artifactId>
  30. </plugin>
  31. </plugins>
  32. </build>
  33. </project>

配置文件application.yml 内容如下:

  1. server:
  2. port: 8800
  3. spring:
  4. application:
  5. name: spring-cloud-gateway #服务之间的调用都是根据这个 name
  6. cloud:
  7. gateway:
  8. discovery:
  9. locator:
  10. enabled: true
  11. lower-case-service-id: true
  12. routes:
  13. - id: provider_route
  14. uri: lb://spring-cloud-provider
  15. predicates:
  16. - Path=/provider/**
  17. filters:
  18. - StripPrefix=1
  19. - id: test_route
  20. uri: https://www.google.com.hk
  21. predicates:
  22. - Path=/google
  23. filters:
  24. - StripPrefix=1
  25. eureka:
  26. client:
  27. register-with-eureka: false
  28. serviceUrl:
  29. defaultZone: http://localhost:8000/eureka/
  30. logging:
  31. level:
  32. org.springframework.cloud.gateway: debug

配置说明:

  • spring.cloud.gateway.discovery.locator.enabled :是否与服务注册于发现组件进行结合,通过 serviceId 转发到具体的服务实例。默认为 false,设为 true 便开启通过服务中心的自动根据 serviceId 创建路由的功能。
  • spring.cloud.gateway.routes : 用于配合具体的路由规则,是一个数组。这里我创建了两个路由,其中一个 id 为 test_route 的路由,这个配置是将匹配的请求转发到 https://www.google.com.hk
  • 网关服务监听 8800 端口
  • 指定注册中心的地址,以便使用服务发现功能
  • 调整相关包的 log 级别,以便排查问题

动类添加@EnableEurekaClient 注解

  1. @SpringBootApplication
  2. @EnableEurekaClient
  3. public class SpringCloudGatewayApplication {
  4. public static void main(String[] args) {
  5. SpringApplication.run(SpringCloudGatewayApplication.class, args);
  6. }
  7. }
  1. 启动spring-cloud-eureka服务
  2. 启动三个spring-cloud-provider服务实例(端口号分别为:8100、8101、8102),可参见上一篇SpringCloud 快速入门
  3. 启动 spring-cloud-gateway服务,网关服务监听端口号为8800
    访问Eureka ,spring-cloud-provider已经有三个实例注册上去了。

    总结

    本文简单的介绍了一下SpringCloud Gateway,并实现了一本简单的网关服务。介绍了结合注册中心Eureka为微服务提供默认的路由,还有如何通过通过配置文件和API自定义路由。SpringCloud Gateway使用方式非常灵活,项目开发中可以根据实际情况自由组合使用。SpringCloud Gateway 还有许多高阶实用功能,比如:自定义Filter、熔断和限流,更多技巧参考官方文档 https://cloud.spring.io/spring-cloud-gateway/reference/html/

文章示例代码已经放到GitHub上:https://github.com/gallenzhang/spring-cloud-example/tree/master/spring-cloud-gateway

参考

Spring Cloud Gateway(路由)
Spring Cloud GateWay 服务化和过滤器