这是一篇旧文,部分写在2018年,我从百度云的一个文件夹中翻了出来,附图和说明重新整理了一下。文中大多数图都是使用 draw.io 画的。

1 引言

其实早在 2014 年的 3 月 25 日,在 ThoughtWorks 工作的 Martin Fowler 和 James Lewis 就共
同提出了“Microservices”,也就是中文里说的“微服务”。
Google Trends 记录了“Microservices”这一词从 2014 年到 2020 年末在 Google
网页搜索的热度趋势,如下所示:

其实可以看到,微服务的热度已经在经历过一八年的极点之后慢慢降低,但无论如何,微服务依旧有很大的热度。另一方面,近几年阿里动作频繁,先是将 Dubbo 捐赠给 Apache, 并在之后推出了 SpringCloud Alibaba,可见阿里并没有放弃开源的影响力,Dubbo 依旧是一个非常值得研究的 RPC 框架。

2 Dubbo 工作原理

2.1 Dubbo 分层

Dubbo 分层

2.2 Dubbo 运行流程

大体上分为 4 个步骤:

  1. provider 注册到注册中心
  2. consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
  3. consumer 调用 provider
  4. consumer 和 provider 都异步通知监控中心

2.3 Dubbo 调用流程

2.4 Dubbo 注册到 ZooKeeper 时存储的信息


上面这张图来自 Dubbo 官方doc:Zookeeper 注册中心参考手册

在图中,我们可以看到 Zookeeper 的节点层级,自上而下是:

  • Root 层:根目录,可通过 <dubbo:registry group="dubbo" /> 的 "group" 设置 Zookeeper 的根节点,缺省使用 "dubbo" 。
  • Service 层:服务接口全名。
  • Type 层:分类。目前除了我们在图中看到的 "providers"( 服务提供者列表 ) "consumers"( 服务消费者列表 ) 外,还有 "routes"( 路由规则列表 ) 和 "configurations"( 配置规则列表 )。
  • URL 层:URL ,根据不同 Type 目录,下面可以是服务提供者 URL 、服务消费者 URL 、路由规则 URL 、配置规则 URL 。实际上 URL 上带有 "category" 参数,已经能判断每个 URL 的分类,但是 Zookeeper 是基于节点目录订阅的,所以增加了 Type 层。

实际上,服务消费者启动后,不仅仅订阅了 "providers" 分类,也订阅了 "routes"、"configurations" 分类。

流程说明:

  • 服务提供者启动时: 向 /dubbo/com.foo.BarService/providers 目录下写入自己的 URL 地址
  • 服务消费者启动时: 订阅 /dubbo/com.foo.BarService/providers 目录下的提供者 URL 地址。并向 /dubbo/com.foo.BarService/consumers 目录下写入自己的 URL 地址
  • 监控中心启动时: 订阅 /dubbo/com.foo.BarService 目录下的所有提供者和消费者 URL 地址。

2.5 Dubbo 的动态代理策略

如果有 dubbo 使用经验的读者,可能会立马就想起来,服务消费者引入的 jar 包中只有一个 interface,实现逻辑都封装在消费者端,这中间的过程就有动态代理的参与。

目前实现动态代理的工具类主要包括以下 4 种:

  • Javaassist
  • JDK 原生自带
  • CGLIB
  • ASM