以 Invoker 为中心,从 Cluster, Directory, Router, LoadBalance,来解析各个接口。
Router
Router 负责从多个 Invoker 中按路由规则选出子集,比如读写分离,应用隔离等。下图是dubbo-admin的配置界面。
路由用于灰度发布等业务场景。根据官网描述,目前路由有3种:ConditionRouter, MockInvokersSelector, ScriptRouter。
ScriptRouter:脚本路由规则 支持 JDK 脚本引擎的所有脚本,比如:javascript, jruby, groovy 等,通过 type=javascript 参数设置脚本类型,缺省为 javascript。
MockInvokersSelector:一般dubbo-admin没有配置时候会走这条路线,在微服务架构之Dubbo集群容错(2)有介绍,一般的调用没有设置mock,会在getNormalInvokers方法中的hasMockProviders判断中就返回了;若果设置mock后,就将设置为mock的invoker返回。
ConditionRouter:即条件路由,主要根据dubbo管理控制台配置的路由规则来过滤相关的invoker, 当我们对路由规则点击启用的时候, 就会触发RegistryDirectory类之前提到的notify方法。在RegistryDirectory的notify方法中有这样的几行代码
|
|
|
|
|
|
其中如何理解ConditionRouter处理流程呢?首先我们要知道基于条件表达式的规则
|
|
规则:
“=>”之前的为消费者匹配条件,所有参数和消费者的URL进行对比,当消费者满足匹配条件时,对该消费者执行后面的过滤规则。
“=>”之后为提供者地址列表的过滤条件,所有参数和提供者的URL进行对比,消费者最终只拿到过滤后的地址列表。
如果匹配条件为空,表示对所有消费方应用,如:=> host != 10.20.153.11
如果过滤条件为空,表示禁止访问,如:host = 10.20.153.10 =>
白名单:host != 10.20.153.10,10.20.153.11 =>
黑名单:host = 10.20.153.10,10.20.153.11 =>
表达式:
参数支持:
服务调用信息,如:method, argument 等 (暂不支持参数路由)
URL本身的字段,如:protocol, host, port 等
以及URL上的所有参数,如:application, organization 等
条件支持:
等号”=”表示”匹配”,如:host = 10.20.153.10
不等号”!=”表示”不匹配”,如:host != 10.20.153.10
值支持:
以逗号”,”分隔多个值,如:host != 10.20.153.10,10.20.153.11
以星号“”结尾,表示通配,如:host != 10.20.
以美元符开头,表示引用消费者参数,如:host = $host
然后到了refreshInvoker(List
|
|
|
|