ZooKeeper 在RPC服务框架Dubbo中的使用
Dubbo简介
Dubbo是阿里巴巴于2011年10月正式开源的一个由Java语言编写的分布式服务框架。
Dubbo是一个提供高性能和透明化的远程服务调用方案和基于服务框架展开的完整SOA服务治理方案。
Dubbo的核心部分包含三块:
-
远程通信:提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型、序列化,以及“请求-响应”模式的信息交换方式。
-
集群容错:提供基于接口方法的远程过程透明调用,包括多协议的支持,以及对软负载均衡、失败容错、地址路由和动态配置等集群特性的支持。
-
自动发现:提供基于注册中心的目录服务,使服务消费方能动态地查找服务提供方,使地址透明,使服务提供方可以平滑地增加或减少机器。
注册中心是RPC框架最核心的模块之一,用于服务的注册和订阅。
- 服务提供方注册
- 服务消费方订阅
在Dubbo的实现中,对注册中心模块进行了抽象封装,因此可以基于其提供的外部接口来实现各种不同类型的注册中心。
注册中心的实现方式:
- 数据库
- ZooKeeper
- Redis
ZooKeeper 是一个树形结构的目录服务,支持变更推送,因此非常适合作为Dubbo服务的注册中心。
Zookeeper 节点设计
Zookeeper上服务的节点设计:
/dubbo
:这是Dubbo在ZooKeeper上创建的根节点。/dubbo/com.jeiker.UserService
:这是服务节点,代表了Dubbo的一个服务。/dubbo/com.jeiker.UserService/providers
:这是服务提供者的根节点,其子节点代表了每一个服务的真正提供者。/dubbo/com.jeiker.UserService/consumers
:这是服务消费者的根节点,其子节点代表了每一个服务的真正消费者。
ZooKeeper 工作流程
结合上图,以com.jeiker.UserService
这个服务为例,来说明 Dubbo 基于 ZooKeeper 实现的注册中心的步骤。
1.服务提供者
服务提供者会在初始化启动时:
- 首先在 ZooKeeper 的
/dubbo/com.jeiker.UserService/providers
节点下创建一个子节点。 - 写入自己的URL地址,这就代表了“com.jeiker.UserService”这个服务的一个提供者。
2.服务消费者
服务消费者会在启动时:
-
读取并订阅 ZooKeeper 上
/dubbo/com.jeiker.UserService/providers
节点下的所有子节点。 -
解析出所有提供者的URL地址来作为该服务地址列表,然后发起正常调用。
-
同时,服务消费都还会在 ZooKeeper 的
/dubbo/com.jeiker.UserService/consumers
节点下创建一个临时节点 -
并写入自己的URL地址,这就代表了
com.jeiker.UserService
这个服务的一个消费者。
3.监控中心
监控中心是 Dubbo 中服务治理体系的重要一部分,它需要知道一个服务的所有提供者和消费者(订阅者),及其变化情况。
监控中心在启动时:
-
通过ZooKeeper 的
/dubbo/com.jeiker.UserService
节点来获取所有提供者和消费者的URL地址。 -
并注册Watcher来监听其子节点的变化。
ZooKeeper 设计分析
所有提供者在ZooKeeper上创建的节点都是临时节点,利用的是临时节点的生命周期和客户端会话相关特性,来感知服务提供者的变化。
一旦服务提供者所有的机器出现故障导致该提供者无法对外提供服务时,该临时节点就会自动从ZooKeeper上删除,这样服务的消费者和监控中心都能感知到服务提供者的变化。
在ZooKeeper节点结构设计上,以服务名和类型(角色类型)作为节点路径,符合Dubbo订阅和通知的需求,这样保证了以服务为粒度的变更通知,通知范围易于控制,即使在服务和提供者和消费者变更频繁的情况下,也不会对ZooKeeper 造成太大的性能影响。