curator框架的基本使用

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完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值