Dubbo源码解读-Consumer消费端服务列表刷新

本文从Dubbo源码角度解析消费端服务列表刷新原理。先进行知识铺垫,介绍消费端注册监听事件。接着阐述服务列表刷新的流程概述和详细流程,包括不同协议处理、建立映射关系等。最后进行源码解析,涉及多个关键方法,帮助理解业务流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上篇我们介绍了Consumer消费端@Reference服务端引用流程,地址如下

Dubbo源码解读-Consumer消费端@Reference服务端引用流程-优快云博客

        本文主要针Dubbo消费端服务列表刷新原理,从dubbo源码角度进行解析。

        大家可以好好仔细读一下本文。有疑问欢迎留言。

        接着说明,读Dubbo源码最好是先对Spring源码有一定的了解。如果大家需要,我也可以针对Spring框架做一系列源码的解读专栏。

         不过不用担心,如果需要Spring的源码知识,文章中也会进行Spring源码铺垫介绍的。

        如果内容中有没描述清楚的,或者大家在阅读源代码有疑问的,欢迎留言,看到就会及时回复。

主要内容

  • 知识铺垫
  • 消费端服务列表刷

知识铺垫

        消费端@Reference依赖注入服务端时,会注册providers,configurators,routers三个节点的监听事件,当服务列表节点发生变化时,注册中心就会通知监听器。监听器为RegistryDirectory类,实现了NotifyListener。具体细节可跳转到

Dubbo源码解读-Consumer消费端@Reference服务端引用流程-优快云博客

消费端服务列表刷新

        consummer端的notify订阅事件(服务列表刷新)。整个细节过程是比较复杂的。因为好多同学为了应付面试或者觉得细节流程太繁琐或者复杂,只想弄清楚相对简练的过程。所以对细节流程做了一个流程概述的部分,方便大家理解大概过程,以及应对面试。更详细的过程可关注详细流程。

流程概述

  1. RegistryDirectory.notify(List<URL> invokerUrls)监听三个节点providers,configurators,routers
  2. 根据Url中的目录(category),设置具体协议url
    1. invokerUrls:dubbo协议:providers目录
    2. routerUrls:router协议:routes目录
    3. configuratorsUrl:overide协议:configurators
  3. 处理协议:
    1. routerUrls:routes目录变动
      1. 将协议专为Router对象,ConditionRouter对象。持有whenCondition和thenCondition
      2. 集合添加MockInvokersSelector和TagRouter两个router
    2. configuratorUrls(动态修改配置信息):configurators节点变动
      1. urls为List<Configurator>对象
      2. 将override协议中的属性合并到overrideDirectoryUrl中。
    3. invokerUrls:(providers节点变动,比如服务上线下线),dubbo协议.【其实就是生成DubboInvoker,建立了两个映射关系
      1. urlInvokerMap:建立url和invoker的映射关系
        1. 合并Url属性,消费端配置优先
        2. protocol.refer(serviceType, url):protocol执行链,最终DubboProtocol.refer()
          1. 创建NettyClient和handler连
          2. 创建DubboInvoker
      2. methodInvokerMap:建立服务中方法和invoker的映射关系

详细流程

  1. RegistryDirectory.notify(List<URL> invokerUrls)
  2. 根据Url中的目录(category),设置具体协议ur
    1. invokerUrls:dubbo协议:providers目录
    2. routerUrls:router协议:routes目录
    3. configuratorsUrl:overide协议:configurators
  3. 协议处理
    1. routerUrls(动态修改路由信息):router:协
      1. URls专为Router对象
        1. List<Router> routers = toRouters(routerUrls);
        2. 遍历Urls
          1. .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
          2. .获取router属性。值为condition
          3. 设置协议为cond
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜鸟long

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值