Zookeeper 的功能很强大,应用场景很多,结合我们实际工作中使用 Dubbo 框架的情况,Zookeeper 主要是做注册中心用。
- 基于 Dubbo 框架开发的提供者、消费者都向 Zookeeper 注册自己的 URL ,消费者还能拿到并订阅提供者的注册 URL ,以便在后续程序的执行中去调用提供者。
- 而提供者发生了变动,也会通过 Zookeeper 向订阅的消费者发送通知。
当然,Zookeeper 能提供的不仅仅如此,再例如:
统一命名服务。
命名服务是指通过指定的名字来获取资源或服务的地址,利用zk创建一个全局的路径,即时唯一的路径,这个路径就可以作为一个名字,指向集群中机器或者提供服务的地址,又或者一个远程的对象等。
分布式锁服务。
这个比较好理解,Zookeeper 实现的分布式锁的可靠性会比 Redis 实现的CSDN_Stephen分布式锁高,当然相对来说,性能会低。
配置管理。
例如说,这个老哥的文章就详细介绍了 实现基于 Zookeeper 的 Spring Cloud Config 的实现,提供配置中心的服务。Spring Cloud Config Zookeeperhttps://blog.csdn.net/CSDN_Stephen/article/details/78856323
注册与发现。
是否有机器加入或退出
所有机器约定在父目录下创建临时目录节点,然后监听父目录节点下的子节点变化。一旦有机器挂掉,该机器与 ZooKeeper 的连接断开,其所创建的临时目录节点也被删除,所有其他机器都收到通知:某个节点被删除了。
Master 选举。
基于 Zookeeper 实现分布式协调,从而实现主从的选举。这个在 Kafka、Elastic-Job 等等中间件,都有所使用到。
分布式锁。
有了 ZooKeeper 的一致性文件系统,锁的问题变得容易。锁服务可以分成两类,一个是保持独占,另一个是控制时序。
- 1、保持独占,我们把 znode 看作是一把锁,通过 createZnode 的方式来实现。所有客户端都去创建 /distribute_lock 节点,最终成功创建的那个客户端也即拥有了这把锁。用完删除掉自己创建的 /distribute_lock 节点就释放出锁。
- 2、控制时序,/distribute_lock 已经预先存在,所有客户端在它下面创建临时顺序编号目录节点,和 Master 一样,编号最小的获得锁,用完删除,依次方便。
队列管理
两种类型的队列。
-
- 1、同步队列,当一个队列的成员都聚齐时,这个队列才可用,否则一直等待。在约定的目录下创建临时目录节点,监听节点数目是否是我们要求的数目。
- 2、队列按照 FIFO 方式进行入队和出队操作。和分布式锁服务中的控制时序的场景基本原理一致,入列有编号,出列按编号。创建 PERSISTENT_SEQUENTIAL 节点,创建成功时 Watcher 通知等待的队列,队列删除序列号最小的节点以消费。此场景下,znode 用于消息存储,znode 存储的数据就是消息队列中的消息内容,SEQUENTIAL 序列号就是消息的编号,按序取出即可。由于创建的节点是持久化的,所以不必担心队列消息丢失的问题。