Dubbo 服务暴露与引用的完整流程
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 的扩展极其灵活
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 谜思录!