Apache Curator是Apache ZooKeeper的Java / JVM客户端库,Apache ZooKeeper是一种分布式协调服务。Curator是在ZooKeeper原有的客户端基础上封装的更加易于使用的客户端,使用时比原生的客户端更加简单快捷,下面先简单介绍下Curator的基本操作。
1.创建客户端实例
一般创建客户端有两种方式一种直接CuratorFrameworkFactory直接new一个客户端实例
另一种采用build模式创建。特别提一下连接地址字符串:
单机下ip地址加上端口
例如"192.168.140.128:2181"
集群下以逗号隔开
例如"192.168.140.128:2181,192.168.140.129:2181,192.168.140.130:2181"
这个在zookeeper原生客户端连接方法有说明只是藏得比较深很难找,提到这个是希望大家不仅是知道这个,更应该在不知道的情况又没资料时知道如何解决问题。
创建完客户端需要调用start方法启动才能正常使用。
package framework;
import org.apache.curator.connection.StandardConnectionHandlingPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.framework.state.ConnectionStateListenerDecorator;
import org.apache.curator.framework.state.StandardConnectionStateErrorPolicy;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class CreateClientExamples{
public static CuratorFramework createSimple(String connectionString){
//重连策略
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
return CuratorFrameworkFactory.newClient(connectionString, retryPolicy);
}
//创建完客户端需要调用client.start()方法启动客户端
public static CuratorFramework createWithOptions(String connectionString,int connectionTimeoutMs, int sessionTimeoutMs){
//重连策略
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(1000, 3);
//连接时处理策略默认就是standardConnectionHandlingPolicy 如果没特殊需求都不需要设置
StandardConnectionHandlingPolicy standardConnectionHandlingPolicy = new StandardConnectionHandlingPolicy();
//默认的连接错误处理策略 没特需需求一般不设置
StandardConnectionStateErrorPolicy standardConnectionStateErrorPolicy = new StandardConnectionStateErrorPolicy();
return CuratorFrameworkFactory.builder()
.connectString(connectionString)
.retryPolicy(retryPolicy)
.connectionTimeoutMs(connectionTimeoutMs)
.sessionTimeoutMs(sessionTimeoutMs)
.connectionHandlingPolicy(standardConnectionHandlingPolicy)
.connectionStateErrorPolicy(standardConnectionStateErrorPolicy)
//添加连接事件监听器
.connectionStateListenerDecorator(new ConnectionStateListenerDecorator() {
@Override
public ConnectionStateListener decorateListener(CuratorFramework client, ConnectionStateListener actual) {
return null;
}
})
// etc. etc.
.build();
}
}
2.创建节点
创建节点很简单Curator很多方法都是采用这种流式API用起来很方便,需要提到的点是CreateMode创建节点模式,从字面意思就知道EPHEMERAL是创建一个临时节点不会永久保存,PERSISTENT持久化保存节点。另外一点是curator不支持递归创建节点节点必须以/代表根节点开始创建
例如/a 可以正常创建
/a/b/c 在前面节点不存在的情况下不能创建
自己可以采用递归实现这个功能。
public static void createEphemeral(CuratorFramework client, String path, byte[] payload) throws Exception {
client.create()
.withMode(CreateMode.EPHEMERAL)
.forPath(path, payload);
}
3.为节点设置数据
设置数据可以采用同步和异步的方式 异步方式可以添加监听器或者回调方法处理设置完成时的逻辑处理。
public static void setData(CuratorFramework client, String path, byte[] payload) throws Exception {
client.setData().forPath(path, payload);
}
public static void setDataAsync(CuratorFramework client, String path, byte[] payload,CuratorListener listener) throws Exception {
client.getCuratorListenable().addListener(listener);
client.setData().inBackground().forPath(path, payload);
}
public static void setDataAsyncWithCallback(CuratorFramework client, BackgroundCallback callback, String path,
byte[] payload) throws Exception {
client.setData().inBackground(callback).forPath(path, payload);
}
4.获取节点数据
public static byte[] getData(CuratorFramework client, String path) throws Exception {
client.getData().forPath(path);
}
5.删除节点
public static void delete(CuratorFramework client, String path) throws Exception {
client.delete().forPath(path);
}
6.支持事务操作
curator是可以支持事务操作。
public static Collection<CuratorTransactionResult> transaction(CuratorFramework client) throws Exception {
CuratorOp createOp = client.transactionOp().create().forPath("/a/b/c", "some data".getBytes());
CuratorOp setDataOp = client.transactionOp().create().forPath("/another/path", "other data".getBytes());
CuratorOp deleteOp = client.transactionOp().create().forPath("/yet/another/path");
Collection<CuratorTransactionResult> results = client.transaction().forOperations(createOp, setDataOp,
deleteOp);
for (CuratorTransactionResult result : results) {
System.out.println(result.getForPath() + " - " + result.getType());
}
return results;
}
7.总结
curator总体来看对于基本的操作是很简单的,基本是一些API的使用,除了上文提到的个别注意点,其余的可以根据实际需求选择合适的api完成。