zookeeper简单使用+工具类
Zookeeper是一种分布式协调服务,旨在帮助构建可靠的分布式系统。它提供了一组原语,用于协调不同进程之间的通信和同步。Zookeeper可以用于各种分布式应用程序,例如分布式锁,配置管理,队列等。
Zookeeper的核心概念是znode,它是一种特殊的节点,类似于文件系统中的目录或文件。每个znode都有一个名称和一个关联的数据。Zookeeper维护了一个分层的znode命名空间,类似于文件系统中的目录树。通过创建,删除和更新znode,应用程序可以实现在不同进程之间共享状态的协调。
Zookeeper还提供了一些特殊的znode,例如临时节点和顺序节点,用于实现分布式锁和队列等功能。
Zookeeper使用一种称为“Zab”的协议来保持数据的一致性。Zab协议确保在分布式系统中的所有节点之间,只有一个节点是主节点,其余节点都是从节点。主节点负责处理所有写操作,然后将结果复制到所有从节点。这种方式可以保证系统在任何时候都具有一致的状态。
永久节点和临时节点
Zookeeper中,永久节点和临时节点的不同点在于它们的生命周期和用途。
- 生命周期:
- 永久节点:一旦创建,节点将一直存在直到被显式删除。即使客户端和Zookeeper Server之间的连接断开,节点也会一直存在于Zookeeper Server上。
- 临时节点:当创建临时节点的客户端和Zookeeper Server短暂的失去连接时,节点会被自动删除。如果客户端与Zookeeper Server之间的连接恢复,则节点将重新出现在Zookeeper Server上。
- 用途:
- 永久节点:用于存储永久性的数据,例如配置信息、元数据等。
- 临时节点:用于表示在线客户端的状态,例如任务调度节点、任务执行状态、队列中的元素等。
因此,开发人员在使用Zookeeper时需要根据实际需求选择永久节点或临时节点来存储数据。
有序节点和无序节点
Zookeeper中,有序节点和无序节点的不同点在于它们的节点名称和排序方式。
- 节点名称:
- 无序节点:节点名称由用户指定,Zookeeper会检查该名称是否已经存在,如果已存在则会报错。节点名称可以是任何字符串。
- 有序节点:节点名称由Zookeeper自动分配,节点名称的格式为指定节点名称后跟着一个序号,例如:/myapp/node00001。在分配节点名称时,Zookeeper会根据节点编号的大小来排序节点。
- 排序方式:
- 无序节点:节点无法进行排序,只能根据节点名称进行查找。
- 有序节点:节点根据节点编号的大小进行排序,可以通过节点的编号来查找节点,而不是通过节点的名称。
有序节点在实际应用中,常用于实现队列或者锁等功能,因为有序节点总是能够保证执行的先后顺序。而无序节点通常用于存储配置信息等,因为修改、删除等操作较频繁,使用有序节点会带来一定的复杂度。
Springboot集成
Curator是一个Zookeeper客户端库,提供了一组简单易用的API,可以帮助开发者更容易地与Zookeeper进行交互。Curator也提供了一些实用的特性,例如重试机制、选举、分布式锁等,可以帮助开发者构建可靠的分布式应用程序。
application.properties
1 |
|
CuratorConfig.java
1 |
|
工具类
通过以下工具类实现对zookeeper节点的增删改查
1 |
|
监听改动
要通过Curator来监听Zookeeper上的目录,可以使用Curator提供的CuratorCache类。CuratorCache类可以监听一个目录下的所有子节点,并且可以自动处理节点的新增、删除、更新等事件。下面是一个使用CuratorCache类监听Zookeeper上目录的示例代码:
1 |
|
简单实现分布式锁
InterProcessMutex是Zookeeper中提供的一种分布式锁实现方式。它基于Zookeeper的有序节点的特性实现,通过在Zookeeper上创建一个有序节点来代表锁,并通过检查该节点的前一个节点是否存在来控制锁的获取和释放。
InterProcessMutex的主要方法包括:
- acquire():获取锁,如果锁处于可用状态,则获取锁,在锁被释放之前将一直阻塞。
- acquire(long time, TimeUnit unit):尝试获取锁,最多阻塞指定的时间,如果成功获取锁则返回true,否则返回false。
- release():释放锁,如果当前线程持有锁,则释放锁。
1 |
|