Dubbo的服务引用的流程

Dubbo的服务引用流程主要包括配置初始化、代理创建、注册中心订阅及网络连接四个核心阶段,具体流程如下:


一、入口触发与配置初始化

  1. 触发入口
    通过ReferenceConfig.get()方法触发服务引用流程,该方法内部调用init()进行配置校验(如接口名、协议合法性等)。
  2. 配置组装
    加载注册中心地址(如ZK/Nacos),将服务接口、协议、超时参数等封装为URL格式的Map,为后续代理创建提供元数据。

二、动态代理创建与调用链封装

  1. 生成Invoker调用链
    • 通过Protocol.refer()(如RegistryProtocol)根据URL选择具体协议(Dubbo/HTTP)。
    • 构建责任链式Invoker:依次添加监控、重试、超时等Filter(如TimeoutFilter),形成多层装饰的调用链。
  2. 动态代理生成
    • ProxyFactory(默认使用Javassist)创建服务接口的代理对象,屏蔽远程调用细节,使消费者可本地化调用。
    • 代理逻辑:拦截方法调用,将参数封装为RPC请求,通过Invoker调用链转发。

三、注册中心订阅与服务发现

  1. 订阅服务变更
    • 向注册中心(如ZK)发起订阅,监听providers节点(服务提供者列表)、configurators节点(路由规则)的变化。
    • 注册中心实时推送提供者地址的增删事件。
  2. 刷新服务列表
    • 通过RegistryDirectory接收变更通知,动态更新本地可用服务列表。
    • 新服务提供者加入时,自动创建Netty长连接并封装为DubboInvoker

四、网络连接与客户端初始化

  1. 建立通信连接
    • 根据提供者地址列表,通过Exchangers.connect()创建Netty客户端(默认单连接,可配置多连接)。
  2. 负载均衡与集群容错
    • 调用时通过集群模块(Cluster)选择具体Invoker,结合策略(如随机RandomLoadBalance)路由到目标服务。
    • 失败时按容错策略(如FailoverCluster自动重试)处理。

五、引用时机与优化

  1. 懒汉式 vs 饿汉式
    • 懒汉式(默认):服务首次被注入或调用时触发引用,减少启动开销。
    • 饿汉式:配置init=true时,Spring容器初始化阶段通过afterPropertiesSet()提前引用。
  2. 本地引用优化
    若消费者与提供者在同一JVM,直接走本地调用,避免网络传输。

流程总结

graph LR
A[ReferenceConfig.get()] --> B[配置校验与URL组装]
B --> C[Protocol.refer生成Invoker链]
C --> D[注册中心订阅服务变更]
D --> E[创建Netty客户端连接]
E --> F[ProxyFactory生成代理对象]
F --> G[调用时负载均衡与容错]

关键设计点

  • 代理模式 + 责任链实现透明化远程调用;
  • 观察者模式监听注册中心动态更新服务列表;
  • 策略模式支持灵活的路由与容错机制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

代码的余温

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

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

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

打赏作者

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

抵扣说明:

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

余额充值