|  | 本文参考孙卫琴,杜聚宾所创作的<<Spring Cloud Alibaba微服务开发宝典>>一书,即将出版GateWay提供的内置断言工厂主要包括以下几种。(1)基于日期时间类型的断言工厂
 此类型的断言根据日期时间做判断,主要有三个:
 示例代码如下:AfterRoutePredicateFactory: 接收一个日期时间参数。判断请求的日期时间是否晚于指定的参数值。BeforeRoutePredicateFactory: 接收一个日期时间参数。判断请求的日期是否早于指定的参数值。BetweenRoutePredicateFactory: 接收两个日期时间参数。判断请求的日期时间是否在指定的时间段内。
 
 
 | #请求的时间是否在指定时间之后 - After=2022-07-12T17:23:34.789+08:00[Asia/Shanghai]
 
 #请求的时间是否在指定时间之前
 - Before=2022-07-15T17:23:34.789+08:00[Asia/Shanghai]
 
 #请求的时间是否在指定时间段之内
 - Between=2022-07-12T17:23:34.789+08:00[Asia/Shanghai],
 2022-07-12T17:23:34.789+08:00[Asia/Shanghai],
 | 
 (2)基于远程地址的断言工厂:RemoteAddrRoutePredicateFactory
 接收一个表示IP地址段的参数。判断发出请求的主机地址是否在指定的地址段内。示例代码如下:
 
 
 | - RemoteAddr=192.168.18.1/24 | 
 (3)基于Cookie的断言工厂:CookieRoutePredicateFactory
 接收两个参数:Cookie 名字和正则表达式。 判断请求中是否具有给定名字的Cookie,并且该Cookie的值是否与给定的正则表达式匹配。示例代码如下:
 
 
 | #判断是否有名字为username的Cookie,并且Cookie值是否为小写字母 - Cookie=username,+
 | 
 (4)基于HTTP请求头的断言工厂:HeaderRoutePredicateFactory
 接收两个参数:HTTP请求头中一个项的名字和正则表达式。判断HTTP请求头中是否具有给定名字的项,并且该项的值是否与给定的正则表达式匹配。示例代码如下:
 
 
 | #判断请求头中是否具有名字为X-Request-Id的项,并且该项的值为数字 - Header=X-Request-Id, \d+
 | 
 (5)基于远程主机的断言工厂:HostRoutePredicateFactory
 接收一个参数,表示主机名字的匹配模式。判断发出请求的主机的名字是否与给定的名字模式匹配。示例代码如下:
 
 
 | - Host=**.javathinker.net | 
 (6)基于HTTP请求方式的断言工厂:MethodRoutePredicateFactory
 接收一个参数,表示HTTP请求方式。判断请求方式是否为给定值。HTTP请求方式包括GET、POST、PUT和DELETE等。示例代码如下:
 
 
 | - Method=GET   #判断请求方式是否为GET | 
 (7)基于Path请求路径的断言工厂:PathRoutePredicateFactory
 接收一个参数,表示路径的匹配模式。判断请求的URI是否与给定的路径模式匹配。示例代码如下:
 
 
 (8)基于Query请求参数的断言工厂:QueryRoutePredicateFactory
 接收两个参数:请求参数名字和正则表达式。判断请求是否具有给定名字的请求参数,并且该请求参数的值是否与给定的正则表达式匹配。示例代码如下:
 
 
 | #判断是否具有username请求参数,并且值是否为Tom - Query=username,Tom
 | 
 (9)基于路由权重的断言工厂:WeightRoutePredicateFactory
 接收两个参数:组名和权重。对于同一个组内的路由按照权重进行转发。示例代码如下:
 
 
 | gateway: routes:
 - id: route1
 uri: lb://host1
 predicates:
 - Path=/product/**
 - Weight=product_group, 2  #20%的流量进入route1
 - id: route2
 uri: lb://host2
 predicates:
 #route1和route2的匹配路径一致,组一致,权重不同
 - Path=/product/**
 - Weight= product_group, 8  #80%的流量进入route2
 | 
 以上代码配置了两个路由:route1和route2,它们的Path匹配路径相同,都是/product/**,组都是product_group,但是权重不一样,分别是2和8。因此,对于路径和/product/**匹配的请求,20%的请求流量进入route1,80%的请求流量进入route2。
 
 
 
 程序猿的技术大观园:www.javathinker.net
 |  |