SpringCloud gateway配置predicates的匹配规则
需求
通过gateway的route规则,实现分组流量配置
资源
一个nacos,一个gateway ,一个服务app(部署双实例group-1,group-2),实现特定条件下往分组一和分组二流量切换。
方案
1 配置文件
- nacos 默认配置即可
- gateway 配置
server:port: 8062spring:application:name: api-gatewaycloud:gateway:routes:- id: id-group-grepuri: lb://app-group-2predicates:- Header=X-VERSION, v2 # 匹配Header中X-VERSION为v2的请求# - Query=type, mobile2 # 匹配包含type=mobile参数的请求# - Host=192.168.0.73 #这里配置域名 IP貌似不管用# - RemoteAddr=192.168.0.73,192.168.2.0/24,127.0.0.1 # 不建议配置IP 有匹配范围的风险以及IP变化风险# - Cookie=userType, premium # 匹配包含特定Cookie的请求 没试- Path=/app/**# - Weight=app-group,1filters:- StripPrefix=1 - id: app-group-produri: lb://app-group-1predicates:- Header=X-VERSION, v1 # 匹配Header中X-VERSION为v2的请求# - Query=type, mobile1 # 匹配包含type=mobile参数的请求# - Host=192.168.0.73 #这里配置域名 IP貌似不管用# - RemoteAddr=192.168.0.73,192.168.2.0/24,127.0.0.1 # 不建议配置IP 有匹配范围的风险以及IP变化风险# - Cookie=userType, premium # 匹配包含特定Cookie的请求- Path=/app/**# - Weight=app-group,1filters:- StripPrefix=1
- app-group-2:127.0.0.1:8082
写一个测试Controller 打印 hello world22222
@RequestMapping(value = "", method = RequestMethod.GET)public ResultServer<String> hello() {System.out.println("我是group-22222");return new ResultServer().success("hello world22222");}
server:port: 8082 spring:application:name: app-group-2
- app-group-1:127.0.0.1:8081 写一个测试Controller 打印 hello world11111
@RequestMapping(value = "", method = RequestMethod.GET)public ResultServer<String> hello() {System.out.println("我是group-22222");return new ResultServer().success("hello world11111");}
server:port: 8081 spring:application:name: app-group-1
2 启动四个服务,
- nacos 127.0.0.1:8848
- gateway 127.0.0.1:8209
- app-group-2:127.0.0.1:8082
- app-group-1:127.0.0.1:8081
Nacos的注册情况
验证Header
- 证明Header是管用的。
验证Query
证明Query是管用的。
host和别的我就不验证了,实际生产不太能用的到
除非部署一套灰度的前端环境,这样可以
1 指定灰度环境的为 grey.*****.com 走灰度分组
2 指定生产环境的为 prod.*****.com 走生产分组
注意
1 网关路由的配置我是放在了nacos上边,完整的gateway配置文件为;
server:port: 8062spring:application:name: api-gatewaymain:allow-bean-definition-overriding: trueprofiles:active: devcloud:nacos:discovery:server-addr: 127.0.0.1:8848namespace: devconfig:server-addr: 127.0.0.1:8848file-extension: yamlnamespace:devshared-configs[0]:data-id: ${spring.application.name}-route.yamlrefresh: trueusername: @nacos.username@password: @nacos.password@logging:level:com.alibaba.nacos.client.*: WARN
2 predicates 应该是只支持一种类型,要么header 要么query,如果配置两个,直接就抛异常了。
3 如果设置了断言,那么权重配比也要去掉,否则会覆盖断言配置,依旧走权重的配置
# - Weight=app-group,1。
参考文献
https://docs.spring.io/spring-cloud-gateway/reference/4.1-SNAPSHOT/spring-cloud-gateway/request-predicates-factories.html