本文针对 Spring Cloud Gateway 框架中断言(Predicate)类型在 Yaml 文件和以 JSON 数据格式中的配置进行整理。其中 JSON 格式数据类型在动态路由时需使用到,如动态读取数据库中保存的 JSON 格式的路由数据。
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表示匹配指定的请求方式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表示路由在指定时间之后生效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表示路由在指定时间之前有效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表示路由在指定时间之间有效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中存在指定名称,并且对应的值符合指定正则表达式,才算匹配成功Yaml配置文件spring: cloud: gateway: routes: - id: cookie_route uri: https://127.0.0.1:8080predicates: - Cookie=session, fly
JSON格式{ "id": "cookie_route", "uri": "http://127.0.0.1:8082", "predicates":[ { "name": "Cookie", "args": { "name": "session", "regexp": "fly" } } ]
}
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匹配表达式,下面的例子给了两个,其中第一个指定了端口: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表示在请求中要带有指定的参数,且该参数的值需等于配置的值或匹配正则表达式,才算匹配成功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表示匹配指定来源的请求Yaml配置文件spring: cloud: gateway: routes: - id: remoteaddr_route uri: http://127.0.0.1:8080predicates: - 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表示按照权重将请求分发到不同的位置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 格式数据格式,希望对有需要的小伙伴有所帮助。
下一篇:【蓝桥云课】进制