聊聊 Dubbo 与微服务
这是一篇旧文,部分写在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 分层
2.2 Dubbo 运行流程
大体上分为 4 个步骤:
- provider 注册到注册中心
- consumer 从注册中心订阅服务,注册中心会通知 consumer 注册好的服务
- consumer 调用 provider
- 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