前言
上一篇主要介绍了服务目录 Directory的相关部分,本篇就主要结合源码来说说服务路由 Router相关部分,当然了,这边我们主要关注点是它是如何过滤的。具体的源码分析也能参考官方博客。
Router
1.简介
这边可能要联系到Directory的相关内容,回想一下,在上一篇服务目录中RegistryDirectory类中的刷新操作中,其实也需要多次进行路由,目的也就是筛选出符合条件的Invoker。它整个调用的逻辑是这样的
1 | notify() ---> refreshInvoker() ---> toInvokers() ---> toMethodInvokers() |
其中toMethodInvokers()中也涉及到对router的调用。所以,这两个部分是相互穿插的,具体toMethodInvokers是怎么做的看源码实现就行,这边就不给出了。
2.源码分析
Router类主要有三个实现类,分别是ConditionRouter,MockInvokersSelector,ScriptRouter。这边主要介绍的是ConditionRouter条件路由。
ConditionRouter构造函数
1 | public ConditionRouter(URL url) { |
这里涉及到的一个解析方法parseRule()。方法比较复杂,涉及到用正则表达式去匹配,可以用官网给的例子来说明一下:
1 | private static Map<String, MatchPair> parseRule(String rule) |
最终condition中的内容是这样的
1 | { |
route()方法
1 |
|
所以总结来说,当我们配置了禁用的服务提供者后,根据路由信息就不会把它对应的invokers给添加进来,实现了过滤的目的。