Dubbo 的 @DubboService@DubboReference 背后,一次 RPC 调用经历了怎样的服务暴露和服务引用过程?

一、Dubbo 的核心架构

  • 1.1 服务提供者 Provider、服务消费者 Consumer、注册中心 Registry、监控中心 Monitor
  • 1.2 URL 驱动模型——一切皆 URL
  • 1.3 三层模型——Business / RPC / Remoting

二、服务暴露流程

  • 2.1 ServiceBean.onApplicationEvent()——Spring 容器启动后触发
  • 2.2 export()doExport()doExportUrls()
  • 2.3 本地暴露——exportLocal(),Injvm 协议
  • 2.4 远程暴露——doExportUrlsFor1Protocol()
  • 2.5 注册到注册中心——registry.register()
  • 2.6 启动 Netty Server——openServer()

三、服务引用流程

  • 3.1 ReferenceBean.getObject()——FactoryBean 模式
  • 3.2 init()createProxy()
  • 3.3 本地引用 vs 远程引用
  • 3.4 远程引用——refer() 订阅注册中心
  • 3.5 RegistryDirectory——监听提供者变化
  • 3.6 创建 Netty Client——connect()

四、代理生成

  • 4.1 服务端代理——ProxyFactory.getInvoker(),包装成 Invoker
  • 4.2 消费端代理——ProxyFactory.getProxy(),生成动态代理
  • 4.3 JavassistProxyFactory vs JdkProxyFactory

五、注册中心交互

  • 5.1 服务提供者注册——临时节点(ephemeral)
  • 5.2 服务消费者订阅——Watch 机制
  • 5.3 服务下线通知——消费者端自动剔除
  • 5.4 Nacos / ZooKeeper 两种注册中心的差异

六、负载均衡策略

  • 6.1 Random——随机,按权重
  • 6.2 RoundRobin——轮询
  • 6.3 LeastActive——最少活跃调用数
  • 6.4 ConsistentHash——一致性哈希
  • 6.5 自定义负载均衡策略

七、总结

  • 服务暴露和引用是 Dubbo 的两大核心流程
  • URL 驱动模型使得 Dubbo 的扩展极其灵活