我们先来看看Router的继承体系图

从图中可以看出,他有三个实现类,分别是ConditionRouter,MockInvokersSelector,ScriptRouter
MockInvokersSelector在dubbo源码解析-集群容错架构设计中提到这里就暂时不多做叙述
ScriptRouter在dubbo的测试用例中就有用到,这个类的源码不多,也就124行.引用官网的描述
脚本路由规则 支持 JDK 脚本引擎的所有脚本,比如:javascript, jruby, groovy 等,通过 type=javascript 参数设置脚本类型,缺省为 javascript。
当然看到这里可能你可能还是没有感觉出这个类有什么不可替代的作用,你注意一下这个类中有个ScriptEngine的属性,那么我可以举一个应用场景给你
假如有这么个表达式如下:
doubled = (1+1-(2-4)*2)/24;//没有问题 "(1+1-(2-4)*2)/24"//但是假如这个表达式是这样的字符串格式,或者更复杂的运算,那么你就不好处理了,然后这个ScriptEngine类的eval方法就能很好处理这类字符串表达式的问题
本篇主要讲讲ConditionRouter(条件路由),条件路由主要就是根据dubbo管理控制台配置的路由规则来过滤相关的invoker,当我们对路由规则点击启用的时候,就会触发RegistryDirectory类的notify方法


其实我觉得看技术类文章更重要的是看分析的思路,看的是思考过程,比如为什么这个notify方法传入的是List<URL>呢?如果看过我前两篇dubbo源码解析dubbo源码解析-集群容错架构设计和dubbo源码解析-directory就明白,我的分析过程都是以官方文档为依据,所以这个问题的答案自然也在官方文档.下面引用一段官网文档的描述
所有配置最终都将转换为 URL 表示,并由服务提供方生成,经注册中心传递给消费方,各属性对应 URL 的参数,参见配置项一览表中的 "对应URL参数" 列
其实对于Router来说,我们最关心的就是他是怎么过滤的.所以下面这些流程代码我们先走一遍


这个条件路由有一个特点,就是他的getUrl是有值的,同时这里分享一个IDEA中debug查看表达式内容的技巧,比如router.getUrl()表达式的值,如下图所示

从这里我们看到,此时实现类是ConditionRouter,由于接下来的逻辑如果直接让大家看源码图可能不够清晰,所以我又把这个核心的筛选过程用了一个高清无码图,并且用序号标注


最后的筛选结果如下,因为我们在管理后台配置了禁用192.168.56.2,所以最后添加进invokers的就只有192.168.56.3


作者:肥朝
链接:https://www.jianshu.com/p/278e782eef85
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
新版本增加org.apache.dubbo.rpc.cluster.RouterChain#route
/**
*
* @param url
* @param invocation
* @return
*/
public List> route(URL url, Invocation invocation) {
List> finalInvokers =invokers;
for (Router router :routers) {
finalInvokers = router.route(finalInvokers, url, invocation);
}
return finalInvokers;
}
网友评论