Gateway 网关之 Predicate 断言
Posted Alay
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Gateway 网关之 Predicate 断言相关的知识,希望对你有一定的参考价值。
启动 Gateway 日志中会打印 加载的断言
(官网介绍:https://cloud.spring.io/spring-cloud-gateway/reference/html/#gateway-request-predicates-factories)
Loaded RoutePredicateFactory [After]
Loaded RoutePredicateFactory [Before]
Loaded RoutePredicateFactory [Between]
Loaded RoutePredicateFactory [Cookie]
Loaded RoutePredicateFactory [Header]
Loaded RoutePredicateFactory [Host]
Loaded RoutePredicateFactory [Method]
Loaded RoutePredicateFactory [Path]
Loaded RoutePredicateFactory [Query]
Loaded RoutePredicateFactory [ReadBody]
Loaded RoutePredicateFactory [RemoteAddr]
Loaded RoutePredicateFactory [Weight]
Loaded RoutePredicateFactory [CloudFoundryRouteService]
Predicate 是一个函数式接口
GatewayPredicate 是一个接口,实现类:
配置时命名规则为 前缀单词 XxxRoutePredicateFactory 命名为 Xxx,如:PathRoutePredicateFactory 配置时命名为 : Path
配置示例:
cloud: gateway: discovery: locator: enabled: true # 开启当前项目服务注册与发现功能, lower-case-service-id: true # 把服务名转换为小写,Eureka中默认都是大写 routes: - id: demo #自定义唯一标识,只要不重复即可 # lb:loadBalance 负载均衡 server-name 代理项目的名 uri: lb://server-name # 路径规则,命名需要遵循,XxxRoutePredicateFactory 命名:Xxx,简单类型配置简化书写 # predicates: Path=/demo/**,/a/**,/b/** # 或者完整书写 predicates: # 对应类型的命名前缀 - name: Path # 对应可配置的参数集合 args: # args 为 Map<String,String> 类型,Map类型配置 key: value key: value # PathRoutePredicateFactory 类中 内部类Config 类属性为 List<String> patterns,即可泛型为简单类型可以用","分隔如下: - patterns=/a/**,/b/** # 配置请求头断言 - name: Header args: # 如校验请求头必须携带客户端来源: Origin=ios-App,regexp正则表达式 - header: Origin regexp: IOS-App - header: My-Hearder regexp: my-hearder-value.* # 命名规则: filters: # 定义一个过滤器,格式:过滤器名称=参数 或者 name: 名字 args: 参数 - StripPrefix=1 # 转发后忽略第一层
Query
设置必须包含的参数名。
下面两种写法等效。都表示路径满足 /demo/** 同时包含参数abc。
Path 和 Query 是断言。abc是请求参数名称。
在浏览器中输入: http://localhost:9000/demo/one?abc=jqk
predicates: Path=/demo/**,Query=abc
predicates:
- Path=/demo/**
- Query=abc
设置参数的值:
abc请求参数名称。jqk. 是abc的值,是一个正则表达式。在正则表达式中点(.)表示匹配任意一个字符。所以当请求参数abc=jqka或abc=jqkw能满足断言条件。
在断言中赋值使用逗号(,)赋值因为Query后面已经有等号,在值内容中不能在出现等号语法。
predicates:
- Query=abc,jqk.
Header:
表示请求头中必须包含的内容,参数名和参数值之间依然使用逗号,参数值要使用正则表达式,如果Header只有一个值表示请求头中必须包含的参数。如果有两个值,第一个表示请求头必须包含的参数名,第二个表示请求头参数对应值
predicates: - Header=Connection,keep-alive - Header=Cache-Control,max-age=0
两个参数:一个属性名称,一个正则表达式,这个属性的值和正则表达式匹配成功才会执行路由
- Header=X-Request-Id, \\d+ : 请求头要有 X-Request-Id ,并且值为 整数
执行测试:
curl http://localhost:11001/socket --H "X-Request-Id=1234"
Method:
Method表示请求方式。支持多个值,使用逗号分隔,表示多个值之间为 or 条件,如下: 表示 请求方式 为: GET 或者 POST
predicates:
- Method=GET,POST
RemoteAddr:
允许访问的客户端地址。要注意使用127.0.0.1而不要使用localhost
predicates:
- RemoteAddr=127.0.0.1,192.168.0.*
Host
匹配请求参数中Host参数的值。满足Ant模式(之前在Spring Security中学习过)可以使用
predicates:
- Host=127.0.0.1:9000
Cookie:
要求请求中包含指定Cookie名和满足特定正则要求的值。Cookie必须有两个值,第一个Cookie包含的参数名,第二个表示参数对应的值,正则表达式。不支持一个参数写法:
predicates:
- Cookie=age,.*
通过 curl 命令进行访问
Cookie Route Predicate 需要两个参数,一个是 cookieName,一个是正则表达式,路由会通过 CookieName 值 和正则表达式去匹配,如果匹配上就执行路由,否则不执行路由
curl http://localhost:11001/socket --cookie "age=18"
Before:
在指定时间点之前
predicates:
- Before=2020-01-31T18:00:00.000+08:00[Asia/Shanghai]
After
限定什么时间之后路由可以生效
routes: # 路由ID,没有固定的规则要求,但要求唯一性,建议配合服务名 - id: netty-socket # 匹配后提供服务的路由地址 uri: lb://braineex-search predicates: # 断言,路径相匹配的才进行路由 - Path=/socket/** - After=2020-12-23T14:06:18.250+08:00[Asia/Shanghai]
Between
时间区间范围内有效
- Between=2020-12-23T14:06:18.250+08:00[Asia/Shanghai],2021-12-23T14:06:18.250+08:00[Asia/Shanghai]
Weight
多版本服务发布的时候,偶尔使用。v1.0+v1.1两个版本同时发布服务。内容一致,实现机制不同。发布两个不同命名的服务集群。使用Gateway做负载均衡。
负载均衡中权重。同一个组中URI进行负载均衡。
语法:Weight=组名,负载均衡权重
在注册两个服务,这个服务(项目)是相同的,应用程序名分别叫做demo-one和demo-two。
Gateway在路由匹配时demo-one将占20%,demo-two将占80%
routes: - id: suiyi uri: lb://demo-one predicates: - Path=/demo/** - Weight=group,2 filters: StripPrefix=1 - id: suiyi2 uri: lb://demo-two predicates: - Path=/demo/** - Weight=group,8 filters: StripPrefix=1
本文来自博客园,作者:Vermeer,转载请注明原文链接:https://www.cnblogs.com/Alay/p/15150489.html
以上是关于Gateway 网关之 Predicate 断言的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud 统一网关Gateway -- 为什么需要网关Gateway快速入门路由断言工厂(Route Predicate Factory)
Spring Cloud Alibaba - 24 Gateway-路由断言(Predicate)过滤器(Filter)初体验