Spring Cloud Gateway的Before路由断言工厂

× 文章目录
  1. 1. Spring Cloud Gateway核心概念
  2. 2. 什么是Before路由断言
  3. 3. Before路由断言工厂的案例
    1. 3.1 引入pom依赖
    2. 3.2 application.yml文件配置:
    3. 3.3 等价的@Bean配置
    4. 3.4 测试如下:

摘要:在上本篇文章Spring Cloud Gateway的After路由断言工厂介绍了Spring Cloud Gateway核心概念和After路由断言,本文简单介绍Before路由断言工厂。因为比较简单所以就抛砖引玉,旨在帮助大家快速入门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. 什么是Before路由断言

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

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

3.1 引入pom依赖

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

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

3.2 application.yml文件配置:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
server:
port: 8082
spring:
cloud:
gateway:
routes:
- id: before_route
uri: http://xujin.org
predicates:
- Before=2022-03-13T00:54:30.877+08:00[Asia/Shanghai]
logging:
level:
org.springframework.cloud.gateway: TRACE
org.springframework.http.server.reactive: DEBUG
org.springframework.web.reactive: DEBUG
reactor.ipc.netty: DEBUG
management.endpoints.web.exposure.include: '*'

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

3.3 等价的@Bean配置

1
2
3
4
5
6
7
8
9
10
11
12
13
@Bean
public RouteLocator customRouteLocator(RouteLocatorBuilder builder) {
ZonedDateTime datetime = LocalDateTime.now().plusDays(1).atZone(ZoneId.systemDefault());
//@formatter:off
return builder.routes()
.route("before_route", r -> r.before(datetime)
.uri("http://xujin.org"))
.build();
//@formatter:on
}

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

3.4 测试如下:

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

如果您觉得文章不错,可以打赏我喝一杯咖啡!