Predicate介绍
Spring Cloud Gateway将路由作为Spring WebFlux HandlerMapping
基础架构的一部分进行匹配。Spring Cloud Gateway包括许多内置的路由断言工厂。所有这些断言都与HTTP请求的不同属性匹配。您可以将多个路由断言工厂与逻辑and
语句结合使用。
常用的Predicate:
常用的Predicate
演示项目搭建参考:【SpringCloud】Gateway路由配置(十七),演示请求使用curl命令
1、After Route Predicate
所述After断言
有一个参数,一个datetime
(其是Java ZonedDateTime
)。该断言匹配在指定日期时间之后发生的请求。下面的示例配置路由后断言:
例子1. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: after_route 6 uri: http://localhost:80017 predicates: 8 - After=2020-04-20T23:57:57.308+08:00[Asia/Shanghai]
这路由符合2020年4月20日23:57时区时间(上海)之后的任何请求。
测试请求命令:curl http://localhost:9527/payment/get/1
2、Before Route Predicate
所述Before断言
有一个参数,一个datetime
(其是Java ZonedDateTime
)。该断言匹配在指定之前发生的请求datetime
。以下示例配置了路由前断言:
例子2. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: before_route 6 uri: http://localhost:80017 predicates: 8 - Before=2020-04-21T23:57:57.308+08:00[Asia/Shanghai]
这路由符合2020年4月21日23:57时区时间(上海)之前的任何请求。
3、Between Route Predicate
该Between断言
有两个参数,datetime1
并且datetime2
这是Java ZonedDateTime
对象。该断言匹配在之后datetime1
和之前发生的请求datetime2
。该datetime2
参数必须是后datetime1
。以下示例配置了路由之间的断言:
例子3. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: between_route 6 uri: http://localhost:8001 7 predicates: 8 - Between=2020-04-20T23:57:57.308+08:00[Asia/Shanghai], 2020-04-21T23:57:57.308+08:00[Asia/Shanghai]
4、Cookie Route Predicate
所述Cookie断言
采用两个参数,该cookie name
和regexp
(其是Java正则表达式)。该断言匹配具有给定名称且其值与正则表达式匹配的cookie。以下示例配置Cookie路由断言:
例子4. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: cookie_route 6 uri: http://localhost:8001 7 predicates: 8 - Cookie=username, xiaoming
此路由匹配具有名称为username与xiaoming正则表达式匹配的cookie的请求。
测试请求命令:curl http://localhost:9527/payment/get/1 --cookie "username=xiaoming"
5、Header Route Predicate
所述Header断言
采用两个参数,报头name
和一个regexp
(其是Java正则表达式)。该断言与具有给定名称且其值与正则表达式匹配的标头匹配。以下示例配置标头路由断言:
例子5. application.yml
1 spring:
2 cloud:
3 gateway:
4 routes:
5 - id: header_route
6 uri: http://localhost:8001
7 predicates:
8 - Header=X-Request-Id, d+
如果请求具有名为X-Request-Id
其值与d+
正则表达式匹配的标头(即,其值为一个或多个数字),则此路由匹配。
测试请求命令:curl http://localhost:9527/payment/get/1 -H "X-Request-Id:123"
6、Host Route Predicate
该Host断言
需要一个参数:主机名的列表patterns
。该模式是带有.
分隔符的Ant样式的模式。断言与Host
匹配模式的标头匹配。以下示例配置主机路由断言:
例子6. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: host_route 6 uri: http://localhost:8001 7 predicates: 8 - Host=**.x.com
如果请求具有这种路由匹配Host
用的头值**.x.com
测试请求命令:curl http://localhost:9527/payment/get/1 -H "Host:demo1.x.com"
7、Method Route Predicate
所述Method断言
需要methods
的参数,它是一个或多个参数:HTTP方法来匹配。以下示例配置方法路由断言:
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: method_route 6 uri: http://localhost:8001 7 predicates: 8 - Method=GET
测试请求命令:curl http://localhost:9527/payment/get/1 -X GET
8、Path Route Predicate
该Path断言
有两个参数:春天的列表PathMatcher
patterns
和一个可选的标志叫matchOptionalTrailingSeparator
。以下示例配置路径路由断言:
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: path_route 6 uri: http://localhost:8001 7 predicates: 8 - Path=/payment/get/**
测试请求命令:curl http://localhost:9527/payment/get/1
9、Query Route Predicate
所述Query断言
采用两个参数:所要求的param
和可选的regexp
(其是Java正则表达式)。以下示例配置查询路由断言:
例子9. application.yml
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: query_route 6 uri: http://localhost:8001 7 predicates: 8 - Query=green
如果请求包含green
查询参数,则前面的路由匹配。
测试请求命令:curl http://localhost:9527/payment/get/1?green=1
10、RemoteAddr Route Predicate
所述RemoteAddr
断言需要的列表sources
,其是CIDR的表示法(IPv4或IPv6)的字符串,如192.168.0.1/16
(其中192.168.0.1
是一个IP地址和16
一个子网掩码)。以下示例配置一个RemoteAddr路由谓词:
1 spring: 2 cloud: 3 gateway: 4 routes: 5 - id: query_route 6 uri: http://localhost:8001 7 predicates: 8 - RemoteAddr=192.168.1.1/24
请求测试命令:curl http://192.168.1.4:9527/payment/get/1
11、Weight Route Predicate
该Weight断言
有两个参数:group
和weight
(一个int)。权重是按组计算的。以下示例配置权重路由断言:
例子11. application.yml
1 spring: 2 gateway: 3 discovery: 4 routes: 5 - id: weight_high 6 uri: http://localhost:8001 7 predicates: 8 - Weight=group1, 8 9 - id: weight_low 10 uri: http://localhost:8002 11 predicates: 12 - Weight=group1, 2
这条路线会将大约80%的流量转发到http://localhost:8001,将大约20%的流量转发到http://localhost:8001
请求测试命令:curl http://localhost:9527/payment/get/1