Dubbo版本2.7.3.Release. 上一篇中分了Directory中经过RouteChain转化成Invoker,本篇文章介绍调用的第二步,Router 的实现。首先看下RouteFactory的扩展点,默认是没有,通过URL中protoco中的值选择使用对应的扩展点, Router 负责从多个 Invoker 中按路由规则选出子集,比如灰度、路由等 也就是说,第一步通过 Directory 选出当前可用的服务提供者,然后再通过 Router 按规则过滤出服务提供者的子集。


| 参数名称 | 含义 |
|---|---|
| condition:// | 表示路由规则类型,支持条件路由和脚本路由 |
| 0.0.0.0 | 表示对所有IP地址生效,如果只想对某个IP生效,则填入具体IP |
| com.foo.DemoService | 表示指定服务生效 |
| category=routers | 表示只对指定服务生效,必填 |
| dynamic=false | 表示该数据为持久化存储,当注册方退出时,数据依然保存在数据中心 |
| enable=true | 覆盖规则是否生效,可不填,默认生效 |
| force=false | 当路由结果为空时,是否强制执行,如果不强制执行,则路由结果为空的路由规则将自动失效 |
| runtime=false | 是否在每次调用时执行路由规则,否则只在提供者列表变更时预先执行并缓存结果,调用时直接从缓存中获取路由结果,如果使用参数路由,必须设置为true,注意设置会影响性能,默认是false |
| priority=1 | 路由规则的优先级,用于排序,优先级越大越靠钱执行,可不填,默认为0 |
| rule=URL.encode("host=10.20.153.10 => host = 10.20.153.11") | 表示路由规则的内容,必填 |
路由规则配置:
method = find* => host=192.168.3.201
- 这条配置说明调用所有find开头的方法都会被路由到IP为192.168.3.201的服务节点,
- => 之前的部分消费者匹配条件,将所有的参数和消费者的URL进行对比, 当消费者满足匹配 条件时,对该消费者执行后面的过滤规则.
- => 之后部分为提供者地址列表的过滤条件,将所有的参数和提供者的URL进行对比,消费者最终只获取过滤后的地址列表
- 如果匹配条件给空, 则表示用于所有的消费方, 如: => host != =192.168.3.201.
- 如果过滤条件为空,则表示禁止访问,如 host = =192.168.3.201=>.
整个规则的表达式的支持
usernmae,
host,
path等占位方式,也支持=、!=等条件,值可以是多个,用逗号分隔,如host=192.168.3.201,192.168.3.202,如果是以*号结尾, 则表示通配符,如host=192.168.3.* 表示匹配192.168.3.网段下所有的IP.
下面是ConditionRouter的实现,初始化rule时,会解析路由规则,通过分隔符“=>”, 前面是消 费着的过滤条件,后面是提供者过滤条件.



总结
今天就Dubbo的Route的路由配置和源码解析和执行的过程分析,下一篇会着重分析Invoker抽象的调用逻辑