Gateway 内置 Predicate 格式配置
概述
本文针对 Spring Cloud Gateway 框架中断言(Predicate)类型在 Yaml 文件和以 JSON 数据格式中的配置进行整理。其中 JSON 格式数据类型在动态路由时需使用到,如动态读取数据库中保存的 JSON 格式的路由数据。
类型
Path
Path
表示请求路径正则匹配Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: path_route
uri: http://127.0.0.1:8080
predicates:
- Path=/server-a/**,/server-b/**
- 动态路由的
JSON
格式
{
"id": "path_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Path",
"args": {
"_genkey_0": "/server-a/**",
"_genkey_1": "/server-b/**"
}
}
]
}
tips
:其中args
中值对应的key
,即_genkey_0
可以任意定义值,查看源码读取该配置可知,源码通过args.values()
获取配置的所有值,所以此处key
的命名可任意命名。
Method
Method
表示匹配指定的请求方式Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: method_route
uri: http://127.0.0.1:8082
predicates:
- Method=GET,POST
- 动态路由的
JSON
格式
{
"id": "method_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Method",
"args": {
"_genkey_0": "GET",
"_genkey_1": "POST"
}
]
}
tips
:此类型args
中的key
同Path
类型一样,可任意命名。
After
After
表示路由在指定时间之后生效Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: after_route
uri: http://127.0.0.1:8082
predicates:
- After=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
- 动态路由的
JSON
格式
{
"id": "after_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "After",
"args": {
"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
}
}
]
}
tips
:After
类型中,args
对应值的key
只能为datetime
,此处可在源码AfterRouterPredicateFactory
类中找到。
Before
Before
表示路由在指定时间之前有效Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: before_route
uri: http://127.0.0.1:8080
predicates:
- Before=2021-08-16T07:36:00.000+08:00[Asia/Shanghai]
- 动态路由的
JSON
格式
{
"id": "before_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Before",
"args": {
"datetime": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]"
}
}
]
}
tips
:Before
类型中,args
对应值的key
只能为datetime
,此处可在源码BeforeRouterPredicateFactory
类中找到。
Between
Between
表示路由在指定时间之间有效Yaml
配置文件
spring:
application:
name: hello-gateway
cloud:
gateway:
routes:
- id: between_route
uri: http://127.0.0.1:8082
predicates:
- Between=2021-08-16T07:36:00.000+08:00[Asia/Shanghai], 2021-08-16T08:15:00.000+08:00[Asia/Shanghai]
- 动态路由的
JSON
格式
{
"id": "path_route_addr",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Between",
"args": {
"datetime1": "2021-08-16T07:36:00.000+08:00[Asia/Shanghai]",
"datetime2": "2021-08-16T08:18:00.000+08:00[Asia/Shanghai]"
}
}
]
}
tips
:Between
类型中,args
对应值的key
只能为datetime1
和datetime2
,此处可在源码BetweenRouterPredicateFactory
类中找到。
Cookie
Cookie
表示cookie
中存在指定名称,并且对应的值符合指定正则表达式,才算匹配成功Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: cookie_route
uri: https://127.0.0.1:8080
predicates:
- Cookie=session, fly
- 动态路由的
JSON
格式
{
"id": "cookie_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Cookie",
"args": {
"name": "session",
"regexp": "fly"
}
}
]
}
Header
Header
表示header
中存在指定名称,并且对应的值符合指定正则表达式,才算匹配成功Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: header_route
uri: https://example.org
predicates:
- Header=X-Request-Id, \d+
- 动态路由的
JSON
格式
{
"id": "header_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Header",
"args": {
"header": "X-Request-Id",
"regexp": "\\d+"
}
}
]
}
Host
Host
表示请求的host要和指定的字符串匹配,并且对应的值符合指定正则表达式,才算匹配成功,可以同时指定多个host匹配表达式,下面的例子给了两个,其中第一个指定了端口:Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: host_route
uri: http://127.0.0.1:8082
predicates:
- Host=localhost:8080,localhost:8081
- 动态路由的
JSON
格式
{
"id": "header_route",
"uri": "http://127.0.0.1:8080",
"predicates":[
{
"name": "Host",
"args": {
"_genkey_0": "localhost:8080",
"_genkey_0": "localhost:8081"
}
}
]
}
Query
Query
表示在请求中要带有指定的参数,且该参数的值需等于配置的值或匹配正则表达式,才算匹配成功Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: query_route
uri: http://127.0.0.1:8080
predicates:
- Query=name, fly
- 动态路由的
JSON
格式
{
"id": "query_route",
"uri": "http://127.0.0.1:8082",
"predicates":[
{
"name": "Query",
"args": {
"param": "name",
"regexp": "fly"
}
}
]
}
RemoteAddr
RemoteAddr
表示匹配指定来源的请求Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: remoteaddr_route
uri: http://127.0.0.1:8080
predicates:
- RemoteAddr=192.168.0.1
```.
- 动态路由的`JSON`格式
```json
{
"id": "remoteaddr_route",
"uri": "http://127.0.0.1:8080",
"predicates":[
{
"name": "RemoteAddr",
"args": {
"_genkey_0": "192.168.0.1"
}
}
]
}
Weight
Weight
表示按照权重将请求分发到不同的位置Yaml
配置文件
spring:
cloud:
gateway:
routes:
- id: weight_high
uri: http://127.0.0.1:8080
predicates:
- Weight=group1, 8
- 动态路由的
JSON
格式
{
"id": "remoteaddr_route",
"uri": "http://127.0.0.1:8080",
"predicates":[
{
"name": "Weight",
"args": {
"weight.group": "group1",
"weight.weight":"8"
}
}
]
}
总结
综上所述,只有四种类型的args
值的key
可任意命名,分别为Path
、Method
、Host
、RemoteAddr
四种类型,其余类型的key
命名固定。
以上即是 gateway 网关断言所有类型的 yaml 和 json 格式数据格式,希望对有需要的小伙伴有所帮助。