简介
Curator是Netflix公司开源的一套Zookeeper客户端框架。了解过Zookeeper原生API都会清楚其复杂度。Curator帮助我们在其基础上进行封装、实现一些开发细节,包括接连重连、反复注册Watcher和NodeExistsException等。目前已经作为Apache的顶级项目出现,是最流行的Zookeeper客户端之一。从编码风格上来讲,它提供了基于Fluent的编程风格支持。
除此之外,Curator还提供了Zookeeper的各种应用场景:Recipe、共享锁服务、Master选举机制和分布式计数器等。
maven 依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.0.0</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.0.0</version>
</dependency>
Curator 客户端实例的创建
- 使用工厂类CuratorFrameworkFactory 的静态newClient()方法
- 使用工厂类CuratorFrameworkFactory 的静态builder构造者方
package com.gpdi.operatingunit.test.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
/**
* @description:客户端实例创建工厂
* @author: Lxq
* @date: 2020/1/12 22:19
*/
public class ClientFactory {
/**
* @param connectionString zk的连接地址
* @return CuratorFramework 实例
*/
public static CuratorFramework createSimeple(String connectionString) {
/**
* 重试策略:第一次重试等待1s,第二次重试等待2s,第三次重试等待4s
* 第一个参数:等待时间的基础单位,单位为毫秒
* 第二个参数:最大的重试次数
*/
ExponentialBackoffRetry retry = new ExponentialBackoffRetry(1000, 3);
/**
*获取CuratorFrameworkFactory 实例最简单的方式
* 第一个参数:zk的连接地址
* 第二个参数: 重试策略
*/
return CuratorFrameworkFactory.newClient(connectionString, retry);
}
public static CuratorFramework createWithOptions(
String connectionString, RetryPolicy retryPolicy,
int connectionTimeoutMs, int sessionTimeoutMs) {
// 使用builder 方法创建 CuratorFramework 实例
return CuratorFrameworkFactory.builder()
.connectString(connectionString)
.retryPolicy(retryPolicy)
.connectionTimeoutMs(connectionTimeoutMs)
.sessionTimeoutMs(sessionTimeoutMs)
.build();
}
}
通过Curator 创建ZNode 节点
package com.gpdi.operatingunit.test.curator;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.utils.CloseableUtils;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
import java.util.List;
/**
* @description: 节点CRUD
* @author: Lxq
* @date: 2020/1/12 23:39
*/
public class OperatingNode {
private static final String Zk_ADDRESS = "localhost:2181";
private static String zkPath = "/test/CRUD/node-1";
/**
* 创建一个永久性节点信息
*/
public static void createPersistentnode() {
CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
client.start();
//
try {
String data = "hello";
byte[] payload = data.getBytes("UTF-8");
client.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)
.forPath(zkPath, payload);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseableUtils.closeQuietly(client);
}
}
/**
* 读取节点信息
*/
public static void readNode() {
CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
try {
// 启动客户端实例,连接服务器
client.start();
Stat stat = client.checkExists().forPath(zkPath);
if (stat != null) {
// 读取节点信息
byte[] payload = client.getData().forPath(zkPath);
String data = new String(payload, "UTF-8");
System.out.println(data);
String parentPath = "/test";
List<String> children = client.getChildren().forPath(parentPath);
children.forEach(r -> System.out.println(r));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseableUtils.closeQuietly(client);
}
}
/**
* 修改节点信息
*/
public static void updateNode() {
CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
try {
client.start();
String data = "HelloWork";
byte[] payload = data.getBytes("UTF-8");
client.setData().forPath(zkPath, payload);
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseableUtils.closeQuietly(client);
}
}
/**
* 删除节点信息
*/
public static void deleteNode() {
CuratorFramework client = ClientFactory.createSimeple(Zk_ADDRESS);
try {
client.start();
client.delete().forPath(zkPath);
// 删除后查看结果
String parentPath = "/test";
List<String> children = client.getChildren().forPath(parentPath);
children.forEach(c -> System.out.println(c));
} catch (Exception e) {
e.printStackTrace();
} finally {
CloseableUtils.closeQuietly(client);
}
}
}