欢迎访问Spring Cloud中国社区

《重新定义Spring Cloud实战》由Spring Cloud中国社区倾力打造,基于Spring Cloud的Finchley.RELEASE版本,本书内容宽度足够广、深度足够深,而且立足于生产实践,直接从生产实践出发,包含大量生产实践的配置。欢迎加微信Software_King进群答疑,国内谁在使用Spring Cloud?欢迎登记

Spring Cloud Gateway的After路由断言工厂

xujin · 5年前 · 4144 ·

摘要:本篇文章主要介绍了Spring Cloud Gateway核心概念和After路由断言,因为比较简单所以就抛砖引玉,旨在帮助大家快速入门Spring Cloud Gateway,欢迎大家加我微信Software_King,进入Spring Cloud中国社区微信群交流。

1.Spring Cloud Gateway核心概念

网关简单的说就是提供一个对外统一的API入口和出口,统管企业对外的所有API出口。一般来说,网关对外暴露的URL或者接口信息,我们统称之为路由信息。如果研发过网关中间件,或者使用或了解过ZUUL的,网关的核心肯定是Filter以及Filter Chain(Filter责任链)。Spring Cloud Gateway也具有路由信息和Filter。下面介绍一下Spring Cloud gateway中最重要的几个概念:

  • 路由(route):路由是网关最基础的部分,路由信息由一个ID、一个目的url、一组断言工厂和一组Filter组成。如果路由断言工厂为真,则说明请求的Url和配置的路由匹配。
  • 断言(Predicate): java 8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring 5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。
  • 过滤器(filter):一个标准的Spring webFilter。Spring Cloud Gateway中的Filter分为两种类型的Filter,分别是Gateway Filter和Global Filter.网关 Filter实例是由Spring 框架中的网关Filter的特殊工厂构造。request在转发到目前服务之前,response在返回到调用端之前都可以被修改或者自定义。

2.什么是After路由断言

After Route Predicate Factory带有一个UTC时间格式的时间参数,当请求进来的当前时间在路由断言工厂之后会成功匹配,否则不能成功匹配。

3.After路由断言工厂的案例

3.1 引入pom依赖

pom.xml依赖配置如下所示:

  1. <properties>
  2. <spring-cloud.version>Finchley.M9</spring-cloud.version>
  3. </properties>
  4. <dependencyManagement>
  5. <dependencies>
  6. <dependency>
  7. <groupId>org.springframework.cloud</groupId>
  8. <artifactId>spring-cloud-dependencies</artifactId>
  9. <version>${spring-cloud.version}</version>
  10. <type>pom</type>
  11. <scope>import</scope>
  12. </dependency>
  13. </dependencies>
  14. </dependencyManagement>
  15. <dependencies>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-actuator</artifactId>
  19. </dependency>
  20. <dependency>
  21. <groupId>org.springframework.cloud</groupId>
  22. <artifactId>spring-cloud-starter-gateway</artifactId>
  23. </dependency>
  24. <dependency>
  25. <groupId>org.springframework.boot</groupId>
  26. <artifactId>spring-boot-devtools</artifactId>
  27. <scope>runtime</scope>
  28. </dependency>
  29. <dependency>
  30. <groupId>org.springframework.boot</groupId>
  31. <artifactId>spring-boot-starter-test</artifactId>
  32. <scope>test</scope>
  33. </dependency>
  34. <dependency>
  35. <groupId>org.springframework.boot</groupId>
  36. <artifactId>spring-boot-starter-webflux</artifactId>
  37. </dependency>
  38. </dependencies>
  39. <build>
  40. <plugins>
  41. <plugin>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-maven-plugin</artifactId>
  44. </plugin>
  45. </plugins>
  46. </build>
  47. <repositories>
  48. <repository>
  49. <id>spring-snapshots</id>
  50. <name>Spring Snapshots</name>
  51. <url>https://repo.spring.io/snapshot</url>
  52. <snapshots>
  53. <enabled>true</enabled>
  54. </snapshots>
  55. </repository>
  56. <repository>
  57. <id>spring-milestones</id>
  58. <name>Spring Milestones</name>
  59. <url>https://repo.spring.io/milestone</url>
  60. <snapshots>
  61. <enabled>false</enabled>
  62. </snapshots>
  63. </repository>
  64. </repositories>
  65. <pluginRepositories>
  66. <pluginRepository>
  67. <id>spring-snapshots</id>
  68. <name>Spring Snapshots</name>
  69. <url>https://repo.spring.io/snapshot</url>
  70. <snapshots>
  71. <enabled>true</enabled>
  72. </snapshots>
  73. </pluginRepository>
  74. <pluginRepository>
  75. <id>spring-milestones</id>
  76. <name>Spring Milestones</name>
  77. <url>https://repo.spring.io/milestone</url>
  78. <snapshots>
  79. <enabled>false</enabled>
  80. </snapshots>
  81. </pluginRepository>
  82. </pluginRepositories>

3.2 application.yml文件配置:

  1. server:
  2. port: 8081
  3. spring:
  4. cloud:
  5. gateway:
  6. routes:
  7. - id: after_route
  8. uri: http://xujin.org
  9. predicates:
  10. - After=2018-03-18T17:32:58.129+08:00[Asia/Shanghai]
  11. logging:
  12. level:
  13. org.springframework.cloud.gateway: TRACE
  14. org.springframework.http.server.reactive: DEBUG
  15. org.springframework.web.reactive: DEBUG
  16. reactor.ipc.netty: DEBUG
  17. management.endpoints.web.exposure.include: '*'

Spring Cloud Gateway提供两种方式去配置After路由断言工厂,这里介绍的是yml文件的配置方式。

3.3 等价的@Bean配置

  1. @Bean
  2. public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
  3. ZonedDateTime minusTime = LocalDateTime.now().minusDays(1).atZone(ZoneId.systemDefault());
  4. return builder.routes()
  5. .route("after_route", r -> r.after(minusTime)
  6. .uri("http://xujin.org"))
  7. .build();
  8. }

Spring Cloud Gateway提供两种方式去配置After路由断言工厂,这里介绍的是@Bean的配置方式。不管通过yml文件配置或者通过@Bean的方式配置是等价的。

3.4 测试如下:

访问http://localhost:8081/成功转发到http://xujin.org