Curator框架 以及基本API如何操作

为了更好的实现java操作zookeeper服务器,后来出现Curator框架,非常的强大,目前已经是Apache的顶级项目,里面提供了更多丰富的操作,例如session超时重连、主从选举、分布式计数器、分布式锁等等适用于各种复杂的zookeeper场景的API封装。

maven依赖:

org.apache.curator

curator-framework

2.4.2

相关资料地址:http://curator.apache.org/curator-recipes/index.html

Curator框架中使用链式编程风格,易读性更强,使用工程方法创建连接对象。

1 使用CuratorFrameworkFactory的俩个静态工厂方法(参数不同)来实现:

参数1:connectString,连接串

参数2:retryPolicy,重试连接策略。有四种实现分别为:

ExponentialBackoffRetry、RetryNTimes、RetryOneTmes、  

参数3:sessionTimeoutMs 会话超时时间默认为60000ms

参数4:connectionTimeoutMs连接超时时间,默认为15000ms

注意:对于retryPolicy策略通过一个接口来让用户自定义实现。

2 创建节点 create方法,可选链式项:

creatingParentslfNeeded  (是否需要父节点) 如果需要递归创建

withMode  (模式)

forPath    (路径)

 withACL   (认证)

3 删除节点 delete方法,可选链式项:

deletingChildrenlfNeeded  如果需要删除递归删除

guaranteed    安全操作

withVersion   删除版本

forpath  (路径)

4 读取和修改数据getData、setData方法

5 异步绑定回调方法。比如创建节点时绑定一个回调函数,该回调函数可以

输出服务器的状态码以及服务器事件类型。还可以加入一个线程池进行优化

操作。

6 读取子节点方法 getchildren

7 判断节点是否存在方法 checkExists

package bjsxt.curator.base;

import java.util.List;

import java.util.concurrent.ExecutorService;

import java.util.concurrent.Executors;

import org.apache.curator.RetryPolicy;

import org.apache.curator.framework.CuratorFramework;

import org.apache.curator.framework.CuratorFrameworkFactory;

import org.apache.curator.framework.api.BackgroundCallback;

import org.apache.curator.framework.api.CuratorEvent;

import org.apache.curator.retry.ExponentialBackoffRetry;

import org.apache.zookeeper.CreateMode;

import org.apache.zookeeper.ZooKeeper.States;

import org.apache.zookeeper.data.Stat;

public class CuratorBase {

/** zookeeper地址 */

static final String CONNECT_ADDR = "192.168.1.121:2181,192.168.1.122:2181,192.168.1.123:2181";

/** session超时时间 */

static final int SESSION_OUTTIME = 5000;//ms

public static void main(String[] args) throws Exception {

//1 重试策略:初试时间为1s 重试10次

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 10);

//2 通过工厂创建连接

CuratorFramework cf = CuratorFrameworkFactory.builder()

.connectString(CONNECT_ADDR)

.sessionTimeoutMs(SESSION_OUTTIME)

.retryPolicy(retryPolicy)

// .namespace("super")

.build();

//3 开启连接

cf.start();

// System.out.println(States.CONNECTED);

// System.out.println(cf.getState());

// 新加、删除

/**

//4 建立节点 指定节点类型(不加withMode默认为持久类型节点)、路径、数据内容  creatingParentsIfNeeded 如果如要可以递归创建父节点  内容只支持字节数组

cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/super/c1","c1内容".getBytes());

//5 删除节点

cf.delete().guaranteed().deletingChildrenIfNeeded().forPath("/super");

*/

// 读取、修改

/**

//创建节点

// cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/super/c1","c1内容".getBytes());

// cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT).forPath("/super/c2","c2内容".getBytes());

//读取节点  读取的节点数据是byte类型

// String ret1 = new String(cf.getData().forPath("/super/c2"));

// System.out.println(ret1);

//修改节点

// cf.setData().forPath("/super/c2", "修改c2内容".getBytes());

// String ret2 = new String(cf.getData().forPath("/super/c2"));

// System.out.println(ret2);

*/

// 绑定回调函数

/**

ExecutorService pool = Executors.newCachedThreadPool(); //可缓存线程池

cf.create().creatingParentsIfNeeded().withMode(CreateMode.PERSISTENT)

.inBackground(new BackgroundCallback() {

@Override

public void processResult(CuratorFramework cf, CuratorEvent ce) throws Exception {

System.out.println("code:" + ce.getResultCode());

System.out.println("type:" + ce.getType());

System.out.println("线程为:" + Thread.currentThread().getName());

}

}, pool)

.forPath("/super/c3","c3内容".getBytes());

Thread.sleep(Integer.MAX_VALUE);

*/

// 读取子节点getChildren方法 和 判断节点是否存在checkExists方法

/**

List list = cf.getChildren().forPath("/super");  //返回相对路径

for(String p : list){

System.out.println(p);

}

Stat stat = cf.checkExists().forPath("/super/c3");

System.out.println(stat); //返回内容和原生的一致

Thread.sleep(2000);

cf.delete().guaranteed().deletingChildrenIfNeeded().forPath("/super");

*/

//cf.delete().guaranteed().deletingChildrenIfNeeded().forPath("/super");

}

}

你可能感兴趣的:(ZooKeeper,zookeeper)