自定义Predicate
思路
在SCG初始化解析中我们已经知道了Predicate是怎么根据我们的配置装配的。
以RemoteAddrRoutePredicateFactory
为例。
1 | json复制代码public class RemoteAddrRoutePredicateFactory |
RemoteAddrRoutePredicateFactory
继承了抽象类AbstractRoutePredicateFactory
,泛型为内部类Config
。
1 | json复制代码 @Override |
重写shortcutType
和shortcutFieldOrder
方法,这两个方法主要是用来定义Config的配置及生成方式,具体细节不再深叙,个人认为SCG的ShortcutType
设计的很不好理解。
1 | json复制代码@Override |
实现apply
方法,内部创建GatewayPredicate
匿名内部类。
1 | json复制代码public static class Config { |
根据Predicate功能定义内部类Config。
综上所述总结自定义Predicate要做的事情有如下几点:
- 类名称,以XXX开头,RoutePredicateFactory结尾。
- 定义内部Config类,内部定义Predicate所需配置。
- 继承了抽象类
AbstractRoutePredicateFactory
,泛型为内部类Config
- 重写
shortcutType
和shortcutFieldOrder
方法 - 实现
apply
方法,内部创建GatewayPredicate
匿名内部类。
自定义黑名单Predicate
实现
实现黑名单可以通过配置的IP或者IP段进行限制。当请求进入时,获取到当前请求的客户端的IP,判断是否与配置的黑名单匹配,匹配返回false即可。
具体的实现逻辑见下方代码即可,与SCG内置的RemoteAddrRoutePredicateFactory
类似
1 | json复制代码/** |
使用
1 | json复制代码spring: |
验证
启动SCG和一个本地服务并暴露接口为/api/hello,返回结果为hello world。在自定义的BlackRemoteAddrRoutePredicateFactory#test
中断点.
**环境:本机IP ** 169.254.183.16。配置限制IP为169.254.183.1/18
。此时我们的请求应该是会被拒绝返回404状态码的。
可以看到Predicate
获取到了我们的IP,并且匹配了我们配置的规则,因此返回false,表示不匹配该路由,因此返回404.
修改配置为其他IP段,比如169.254.183.18/32,此时我们的IP是不符合该规则的,因此会放行。
重启项目再次测试。
可以看到我们的IP并没有匹配配置的规则,返回true,表示可以走该路由。
上边我对“重启”重点标注了,每次修改规则都要重启项目才能生效,那么在实际用的时候,我们肯定想实现不重启就可以动态修改我们配置的规则,那么该怎么做呢?
我们可以通过将配置写到外部一个源中,比如DB中,通过类似Nacos一样定时发送一个刷新配置的事件去实现刷新Predicate配置。明天我们就来基于Redis来实现动态刷新配置的功能。
本文转载自: 掘金