zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次;再比如,断线重连也需要我们手动代码来判断处理等等。对于curator的介绍,从网上百度了一段:Curator是Netflix开源的一套zookeeper客户端框架,用它来操作zookeeper更加方便,按Curator官方所比喻的,guava to JAVA,curator to zookeeper,Curator采用了fluent风格的代码,非常简洁

---------------正-----文-----------------------------------------------------------------------------------------------------------------------------------------------

  Curator包含6部分,均可提供单独jar包,每个包简单介绍如下:

  client:zk-client的替代品,提供一些底层处理跟工具类;

  framework:高级封装,大大简化了zk的客户端编程,包含对zk的连接管理,重试机制等;

  repices:提供了一些常用的操作,比如持续监听,锁,选举等;

  utilities:各种工具类;

  errors:curator对异常跟错误的处理;

  extendsion:扩展包;

  基本api代码解释:

  1、建立连接

  建立连接需要指定zk地址以及重试策略等,先上代码再解释:

 RetryPolicy retry = new ExponentialBackoffRetry(1000, 5);//重试5次,每次间隔时间指数增长(有具体增长公式)
RetryPolicy retry1 = new RetryNTimes(5, 5000);//重试5次,每次间隔5秒
RetryPolicy retry2 = new RetryUntilElapsed(60000 * 2, 5000);//重试2分钟,每次间隔5秒
//普通创建
CuratorFramework client = CuratorFrameworkFactory.newClient("localhost:2181", 5000, 5000, retry);
//fluent风格创建
CuratorFramework client1 = CuratorFrameworkFactory.builder()
.connectString("localhost:2181")
.connectionTimeoutMs(5000) //连接超时时间
.sessionTimeoutMs(3000) //会话超时时间
.retryPolicy(retry)
.build(); //建立连接
client.start();

  如注释,创建客户端连接我们通常需要指定重试策略,curator提供了3种重试机制,分别如上;对于fluent风格,就是每个操作都返回了一个对象,我们可以一直通过[.方法名]的方式书写代码;client创建了之后,需要调用start方法才能真正去建立连接。会话超时时间是指当连接发生故障时,由于zk的心跳机制检测,服务端认为会话超时的时间,会清除session;

  2、创建、删除、更新节点

  连接建立之后,我们可以在服务器上进行创建节点的操作,代码如下:

 //创建节点
String path = client.create()
.creatingParentsIfNeeded() //对节点路径上没有的节点进行创建
.withMode(CreateMode.EPHEMERAL) //临时节点
.forPath("/curator/test", "123".getBytes()); //节点路径,节点的值 //删除节点
client.delete()
.guaranteed() //删除失败,则客户端持续删除,直到节点删除为止
.deletingChildrenIfNeeded() //删除相关子节点
.withVersion(-1) //无视版本,直接删除
.forPath("/curator/mytest");
//更新节点信息
Stat stat2 = new Stat();
byte[] theValue2 = client.getData().storingStatIn(stat).forPath("/curator/test");
client.setData()
.withVersion(stat2.getVersion()) //版本校验,与当前版本不一致则更新失败,-1则无视版本信息进行更新
.forPath("/curator/test", "456".getBytes());
//判断节点是否存在(存在返回节点信息,不存在则返回null)
Stat s = client.checkExists().forPath("/curator/test");

  持久节点是persistent,我们创建的节点可能有好几层,如果服务器不存在父节点则会报错并创建失败,createingParentsIfNodeed()的作用是在父节点不存在的时候进行创建。删除操作可能由于网络抖动等情况导致删除失败,由于节点数据操作一般对业务影响较大,故多数都会带持续删除的动作来确保正确删除;节点更新删除等操作若考虑版本校验,则采用代码所示方式,在获取节点数据的时候对节点状态进行赋值,然后通过节点状态可以获得版本信息。判断节点是否存在,一般通过节点信息判断,若不存在,则节点信息为null。

  3、获取字节点列表

  只有一行代码,返回string类型的list

 //获取子节点列表
List<String> paths = client.getChildren().forPath("/curator");

  4、异步操作

  异步操作不会阻塞代码执行,对于操作完成后的业务处理,需要设定回调函数来完成。以判断节点是否存在为例:

 ExecutorService es = Executors.newFixedThreadPool(5);//异步操作线程池,
//异步判断操作
Stat s1 = client.checkExists().inBackground().forPath("/curator/test"); //无回调
client.checkExists().inBackground(new BackgroundCallback() { //有回调
@Override
public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
CuratorEventType c = curatorEvent.getType();//事件类型,可在CuratorEventType看到具体种类
int r = curatorEvent.getResultCode();//0,执行成功,其它,执行失败
Object o = curatorEvent.getContext();//事件上下文,一般是由调用方法传入,供回调函数使用的参数
String p = curatorEvent.getPath();//节点路径
List<String> li = curatorEvent.getChildren();//子节点列表
byte[] datas = curatorEvent.getData();//节点数据
//一些其它操作
}
},es).forPath("/curator/test");

  异步操作实际是在后台另起一个线程来完成该操作,若线程较多势必会影响服务器性能,所以要用线程池来尽量降低对服务器的消耗。需要考虑线程池的关闭操作,较繁琐,不作赘述。

  5、节点、子节点监听

  节点监听需要用repices包中的NodeCache来完成,代码如下:

 //节点监听
final NodeCache cache = new NodeCache(client,"/curator/test");
cache.start();
cache.getListenable().addListener(new NodeCacheListener() {//监听对象
@Override
public void nodeChanged() throws Exception {//重写监听方法
byte[] ret = cache.getCurrentData().getData();
System.out.println("当前节点内容是:"+ new String(ret));
}
});

  子节点的监听需要用PathChildrenCache来完成,跟节点本身不一样,代码如下:

 //子节点监听
final PathChildrenCache pccache = new PathChildrenCache(client,"/curator",true);//true指当子节点变化时,获取子节点内容
pccache.start();
pccache.getListenable().addListener(new PathChildrenCacheListener() {
@Override
public void childEvent(CuratorFramework curatorFramework, PathChildrenCacheEvent pathChildrenCacheEvent) throws Exception {//重写监听方法
switch (pathChildrenCacheEvent.getType()){//子节点的事件类型
case CHILD_ADDED:
System.out.println(pathChildrenCacheEvent.getData());//通过pathChildrenCacheEvent,可以获取到节点相关的数据
break;
case CHILD_REMOVED:
System.out.println(pathChildrenCacheEvent.getData().getPath());
break;
case CHILD_UPDATED:
break;
default:
break;
}
}
});

  6、权限控制部分,略。

  只是简单罗列了curator的一些基本用法,距离具体应用还是有很大差距,稍后将动手写一下选主程序来练手试试,希望顺利。

  

zookeeper开源客户端curator的更多相关文章

  1. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...

  2. Zookeeper开源客户端Curator的使用

    开源zk客户端-Curator 创建会话: RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); CuratorFramewor ...

  3. 八:Zookeeper开源客户端Curator的api测试

    curator是Netflix公司开源的一套ZooKeeper客户端,Curator解决了很多ZooKeeper客户端非常底层的细节开发工作.包括连接重连,反复注册Watcher等.实现了Fluent ...

  4. Zookeeper开源客户端Curator之事件监听详解

    Curator对Zookeeper典型场景之事件监听进行封装,提供了使用参考.这篇博文笔者带领大家了解一下Curator的实现方式. 引入依赖 对于Curator封装Zookeeper的典型场景使用都 ...

  5. ZooKeeper(3.4.5) - 开源客户端 Curator(2.7.0) 的简单示例

    一.创建会话 1. 创建会话 package com.huey.dream.demo; import org.apache.curator.framework.CuratorFramework; im ...

  6. Apache Zookeeper Java客户端Curator使用及权限模式详解

    这篇文章是让大家了解Zookeeper基于Java客户端Curator的基本操作,以及如何使用Zookeeper解决实际问题. Zookeeper基于Java访问 针对zookeeper,比较常用的J ...

  7. Zookeeper开源客户端框架Curator简介

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  8. Zookeeper开源客户端框架Curator简介[转]

    Curator是Netflix开源的一套ZooKeeper客户端框架. Netflix在使用ZooKeeper的过程中发现ZooKeeper自带的客户端太底层, 应用方在使用的时候需要自己处理很多事情 ...

  9. Zookeeper开源客户端框架Curator的使用

    CuratorFramework Curator框架提供了一套高级的API, 简化了ZooKeeper的操作. 话不多说,看代码 package com.donews.data.util import ...

随机推荐

  1. python连接数据库--查询数据

    #!/usr/bin/python # -*- coding: utf-8 -*- import pymysql def fileDB(): # 打开数据库连接(ip/数据库用户名/登录密码/数据库名 ...

  2. 解决批处理命令执行完毕后自动关闭cmd窗口方法

    问题描述: 日常开发工作中,为了节省多余操作导致浪费时间,我们经常会自己建一些批处理脚本文件(xx.bat),文件中包含我们需要执行的命令,有时候我们希望执行完毕后看一下执行的结果,但是窗口执行完毕后 ...

  3. WPF开源界面库

    WPF开源项目 WPF有很多优秀的开源项目,我以为大家都知道,结果,问了很多人,其实他们不知道.唉,太可惜了! 先介绍两个比较牛逼的界面库 1.MaterialDesignInXamlToolkit ...

  4. timestamp 在curl中变成了Xtamp

    目前的解决方案 将timestemp放在数组最前面. [注意:请求的参数中需要将timestamp这个参数放在数组的最前面,不然在GET方式请求中,会出现浏览器将它变成Xtamp,最终导致签名失败]

  5. MapReduce Kmeans算法含测试数据

    使用时,需要修改K值,args值 运行流程: 先初始化中心点->map中和距离最近的中心点生成一对传入reduce->reduce中把相同key值的存到一起->更新中心点,计算和上一 ...

  6. vm安装centos后unknown host问题和yum install安装不成功问题

    网上差了很多说要在vi /etc/sysconfig/network新增GATEWAY=192.168.0.1 还有vi /etc/sysconfig/network-scripts/ifcfg-et ...

  7. C#中抽象类与接口

    1抽象类 (1) 抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法 (2) 抽象类不能被实例化 (3) 抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明 ...

  8. 第k大数(前k大数)

    题目:设计一组N个数,确定其中第k个最大值 1,普通方法(先排序,然后遍历,得到第k大的数)      注:如果是数组,直接arr[k],我们可以对这个乱序数组按照从大到小先行排序,然后取出前k大,总 ...

  9. 小B的询问 莫队分块

    题目描述 小B有一个序列,包含N个1~K之间的整数.他一共有M个询问,每个询问给定一个区间[L..R],求Sigma(c(i)^2)的值,其中i的值从1到K,其中c(i)表示数字i在[L..R]中的重 ...

  10. [LOJ2027] [SHOI2016] 黑暗前的幻想乡

    题目链接 LOJ:https://loj.ac/problem/2027 洛谷:https://www.luogu.org/problemnew/show/P4336 Solution 这题很像[ZJ ...