【原创】Curator使用
Curator:Netflix 提供的 Zookeeper 客户端框架及其应用
概述:
Curator 是由 Netflix 开源的一套基于 Zookeeper 的客户端框架,旨在解决使用 Zookeeper 面临的底层细节问题,尤其是扩展性与其他客户端实现之间的差异。它的设计目标是简化在应用程序中与 Zookeeper 的交互,从而更高效地执行任务相关的业务逻辑,例如分布式锁、指派者、协调算法等。
Curator 带来了模块化的操作支持,同时提供了一套干净且易于使用的 API,使得开发者能够轻松地管理和操作 Zookeeper 服务,而无需深究其底层复杂性。
基本操作 API:
Curator 框架提供了丰富的基础 API,用于实现 Zookeeper 的主要操作:
1. 创建会话:通过连接字符串和重试策略来创建断开后自动尝试连接的服务会话。
```java
// 使用重试策略创建会话
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", 5000, 5000, retryPolicy);
// 或使用 fluent API 创建会话便捷方式
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("192.168.128.129:2181")
.sessionTimeoutMs(5000)
.connectionTimeoutMs(5000)
.retryPolicy(retryPolicy)
.namespace("base")
.build();
client.start();
```
2. 创建数据节点:
```java
client.create().creatingParentContainersIfNeeded()
.withMode(CreateMode.PERSISTENT)
.forPath("/nodeA", "init".getBytes());
```
3. 删除数据节点:
```java
client.delete().guaranteed()
.deletingChildrenIfNeeded()
.withVersion(10086)
.forPath("/nodeA");
```
4. 读取数据节点:
提供两种方式读取节点数据:
按原始字节返回:
```java
byte[] bytes = client.getData().forPath("/nodeA");
System.out.println(new String(bytes));
```
同时获取 Stat 信息:
```java
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath("/nodeA");
```
5. 修改数据节点:
```java
client.setData().withVersion(10086)
.forPath("/nodeA", "data".getBytes());
```
6. 执行事务:
在多个节点操作间提供一致性:
```java
CuratorFramework client = ... // 假设已初始化 client
client.inTransaction()
.check().forPath("/nodeA")
.and() // 实施后续操作
.create().withMode(CreateMode.EPHEMERAL).forPath("/nodeB", "init".getBytes())
.and()
.create().withMode(CreateMode.EPHEMERAL).forPath("/nodeC", "init".getBytes())
.and()
.commit();
```
7. 其他操作:
检查内存是否存在节点:
```java
client.checkExists().forPath("/nodeA");
```
获取节点的子节点列表:
```java
client.getChildren().forPath("/nodeA");
```
通过 Curator,开发者可以更加专注于应用逻辑的实现,而无需过多关注 Zookeeper 的底层操作细节,显著提升了开发效率和系统的稳定性。