SCG的Predicate是使用工厂方法模式来实现的,类关系如下。
SCG包括了很多内置的Predicate工厂,如下
在每个RoutePredicateFactory中都有一个Config
类,该类用于存储对应RoutePredicate的配置
AfterRoutePredicateFactory
匹配请求时间满足在配置时间之后的请求。
1 | json复制代码public class AfterRoutePredicateFactory |
代码很简单,获取到我们配置的时间,判断当前时间是否大于配置的时间。
Test
1 | json复制代码spring: |
当前时间16:11,小于我们配置的时间,当进行断言的时候,返回了true,表示符合条件。
当配置日期为27号时,则不符合条件,返回false,不匹配该路由。
1 | json复制代码spring: |
BeforeRoutePredicateFactory
匹配请求时间满足在配置时间之前的请求。与AfterRoutePredicateFactory
类似,不做过多阐述。
配置
1 | json复制代码spring: |
BetweenRoutePredicateFactory
匹配请求时间满足在配置时间之间的请求。与上边两种类似,不做过多阐述
配置
1 | json复制代码spring: |
CookieRoutePredicateFactory
匹配带有指定cookie的请求,key需要相等,value满足配置的正则表达式.
1 | json复制代码public class CookieRoutePredicateFactory |
配置
CookieRoutePredicateFactory需要配置两个参数,name和value,通过逗号分隔,value支持正则表达式。
1 | json复制代码spring: |
HeaderRoutePredicateFactory
匹配带有指定header的请求,key需要相等,value满足配置的正则表达式.与CookieRoutePredicateFactory类似,不过多阐述。
配置
1 | json复制代码spring: |
HostRoutePredicateFactory
匹配请求Host复合配置的正则表达式。可以配置多个
1 | json复制代码public class HostRoutePredicateFactory |
Test
1 | json复制代码spring: |
MethodRoutePredicateFactory
匹配指定HTTP Method的请求。
1 | json复制代码public enum HttpMethod { |
Test
1 | json复制代码spring: |
当时用GET请求时,断言失败。
PathRoutePredicateFactory
匹配复合配置Path的请求。
PathRoutePredicateFactory可以设置模板变量,模板变量会被放入ServerWebExchange的attributes中,可以供GatewayFilter使用。
1 | json复制代码public class PathRoutePredicateFactory |
配置
1 | json复制代码spring: |
QueryRoutePredicateFactory
匹配带有指定请求参数的请求。
可以只配置需要匹配的请求参数名称,也可以同时配置需要匹配的请求参数名称和请求参数值,请求参数值支持正则表达式。
1 | json复制代码public class QueryRoutePredicateFactory |
Test
1 | json复制代码spring: |
ReadBodyRoutePredicateFactory
用来检查请求体的内容的断言,属于测试版本,未来可能会更改,不做过多的阐述。
RemoteAddrRoutePredicateFactory
匹配请求客户端的IP符合指定的IP地址。可以配置IP段也可以通过逗号配置多个。
源代码没什么难度,就不多说了。
Test
1 | json复制代码spring: |
WeightRoutePredicateFactory
WeightRoutePredicateFactory
可以配置两个参数,group和weight
。
配置
1 | json复制代码spring: |
WeightRoutePredicateFactory
会对同一组内的路由进行权重计算,根据配置的权重进行访问。
上边的配置下,访问 http://localhost:8088/api/hello
的概率为20%,访问http://localhost:8089/api/hello
的概率为80%。
解析
WeightRoutePredicateFactory
的设计较为复杂且有趣。
1 | json复制代码public class WeightRoutePredicateFactory |
接下来解析第10行的weights是怎么来的,SCG定义了一个WebFilter(WeightCalculatorWebFilter
),会先对请求进行处理。
在RouteDefinitionRouteLocator#lookup
方法中,会在生成配置信息的时候发布一个PredicateArgsEvent
事件。
1 | json复制代码@SuppressWarnings("unchecked") |
在WeightCalculatorWebFilter
中监听了这个事件。
WeightCalculatorWebFilter
1 | json复制代码@Override |
在handle方法中会获取到发布事件的路由的ID,并且通过configurationService获取到路由的配置信息。
1 | json复制代码public void handle(PredicateArgsEvent event) { |
1 | json复制代码void addWeightConfig(WeightConfig weightConfig) { |
filter方法
此方法会被WebFilterChain调用。用来为当前请求添加group及路由,方便WeightRoutePredicateFactory
获取及匹配。
1 | json复制代码@Override |
总结
目前为止,2.2.6.RELEASE版本的SCG内置的RoutePredicateFactory
我们就解析完了,基本上能够满足我们平时的业务场景,也可以根据需要进行自定义。后边会解析GatewayFilterFactory。加油!
本文转载自: 掘金