上篇我们介绍了Consumer消费端@Reference服务端引用流程,地址如下
Dubbo源码解读-Consumer消费端@Reference服务端引用流程-优快云博客
本文主要针Dubbo消费端服务列表刷新原理,从dubbo源码角度进行解析。
大家可以好好仔细读一下本文。有疑问欢迎留言。
接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。
不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。
如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。
主要内容
- 知识铺垫
- 消费端服务列表刷
知识铺垫
消费端@Reference依赖注入服务端时,会注册providers,configurators,routers三个节点的监听事件,当服务列表节点发生变化时,注册中心就会通知监听器。监听器为RegistryDirectory类,实现了NotifyListener。具体细节可跳转到
Dubbo源码解读-Consumer消费端@Reference服务端引用流程-优快云博客
消费端服务列表刷新
consummer端的notify订阅事件(服务列表刷新)。整个细节过程是比较复杂的。因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂,只想弄清楚相对简练的过程。所以对细节流程做了一个流程概述的部分,方便大家理解大概过程,以及应对面试。更详细的过程可关注详细流程。
流程概述
- RegistryDirectory.notify(List<URL> invokerUrls)监听三个节点providers,configurators,routers
- 根据Url中的目录(category),设置具体协议url
- invokerUrls:dubbo协议:providers目录
- routerUrls:router协议:routes目录
- configuratorsUrl:overide协议:configurators
- 处理协议:
- routerUrls:routes目录变动
- 将协议专为Router对象,ConditionRouter对象。持有whenCondition和thenCondition
- 集合添加MockInvokersSelector和TagRouter两个router
- configuratorUrls(动态修改配置信息):configurators节点变动
- urls为List<Configurator>对象
- 将override协议中的属性合并到overrideDirectoryUrl中。
- invokerUrls:(providers节点变动,比如服务上线下线),dubbo协议.【其实就是生成DubboInvoker,建立了两个映射关系】
- urlInvokerMap:建立url和invoker的映射关系
- 合并Url属性,消费端配置优先
- protocol.refer(serviceType, url):protocol执行链,最终DubboProtocol.refer()
- 创建NettyClient和handler连
- 创建DubboInvoker
- methodInvokerMap:建立服务中方法和invoker的映射关系
详细流程
- RegistryDirectory.notify(List<URL> invokerUrls)
- 根据Url中的目录(category),设置具体协议ur
- invokerUrls:dubbo协议:providers目录
- routerUrls:router协议:routes目录
- configuratorsUrl:overide协议:configurators
- 协议处理
- routerUrls(动态修改路由信息):router:协
- URls专为Router对象
- List<Router> routers = toRouters(routerUrls);
- 遍历Urls
- .route://0.0.0.0/com.xiangxue.jack.service.UserService?category=routers&dynamic=false&enabled=true&force=false&name=routeTest&priority=0&router=condition&rule=method+=+queryUser+=>+provider.cluster+=+failover+&+provider.host+=+192.168.90.126+&+provider.protocol+=+dubbo&runtime=false
- .获取router属性。值为condition
- 设置协议为cond
- URls专为Router对象
- routerUrls(动态修改路由信息):router:协