【zk原生api的不足之处】

* 不能自动超时重连,需要手动操作

* watcher事件注册一次后就会失效

* 不支持递归创建节点

【 Apache curator 】

* 解决了watcher的注册一次就失效的问题

* api相对更加简单易用

* 提供更多的解决方案并且实现简单:如分布式锁

* 提供了常用的zk工具类

【实例化zk客户端的多种重试机制】

package com.zk.demo;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.*; /**
* Created by HigginCui on 2018/9/23.
*/
public class CuratorClient { public CuratorFramework client = null;
public static final String zkServerPath = "127.0.0.1"; /**
* 构造方法中实例化zk客户端
*/
public CuratorClient() { /**
* 同步创建zk示例,原生api是异步的
* curator连接zk的策略:ExponentialBackoffRetry
*
* ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)
* baseSleepTimeMs:初始sleep的时间
* maxRetries:最大重试次数
* maxSleepMs:最大充实实际那
*/
RetryPolicy retryPolicy1 = new ExponentialBackoffRetry(, ); /**
* curator连接zk的策略:RetryNTimes
*
* RetryNTimes(int n, int sleepMsBetweenRetries)
* n:重试的次数
* sleepMsBetweenRetries:每次重试的间隔的时间
*/
RetryPolicy retryPolicy2 = new RetryNTimes(, ); /**
* curator连接zk的策略:RetryOneTime
*
* RetryOneTime(int sleepMsBetweenRetry)
* sleepMsBetweenRetry:每次重试间隔的时间
*/
RetryPolicy retryPolicy3 = new RetryOneTime(); /**
* curator连接zk的策略:RetryForever
*
* RetryForever(int retryIntervalMs)
* 永远重试,不推荐
*/
RetryPolicy retryPolicy4 = new RetryForever(); /**
* curator连接zk的策略:RetryUntilElapsed
*
* RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)
* maxElapsedTimeMs:最大重试时间
* sleepMsBetweenRetries:每次重试间隔
* 重试时间超过maxElapsedTimeMs后,就不在重试
*/
RetryPolicy retryPolicy5 = new RetryUntilElapsed(, ); client = CuratorFrameworkFactory.builder()
.connectString(zkServerPath)
.sessionTimeoutMs()
.retryPolicy(retryPolicy2)
.namespace("workspace")
.build();
client.start();
} public void closeClient() {
if (null != client) {
this.client.close();
}
}
}

【创建节点】

package com.zk.demo;
import org.apache.curator.framework.CuratorFramework;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.ZooDefs; /**
* Created by HigginCui on 2018/9/23.
*/
public class CuratorClientTest { public static void main(String[] args) throws Exception{
CuratorFramework client = new CuratorClient().client;
boolean isCuratorStarted = client.isStarted();
System.out.println("当前客户端是否正常连接:"+isCuratorStarted); //创建节点
String nodePath = "/curator/ccc1";
byte[] data = "hahaha".getBytes();
client.create()
.creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT)
.withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)
.forPath(nodePath,data); }
}

【运行结果】

【更新节点数据】

//更新节点数据
byte[] newData = "xixixi".getBytes();
client.setData()
.withVersion()
.forPath(nodePath,newData);

【运行结果】

【删除节点】

//删除节点
client.delete()
.guaranteed() //如果删除失败,那么在后端还是会继续删除,直到成功
.deletingChildrenIfNeeded() //如果有子节点会一并删除
.withVersion()
.forPath(nodePath);

【运行结果】

【读取节点的数据】

//读取节点数据
Stat stat = new Stat();
byte[] data = client.getData()
.storingStatIn(stat)
.forPath(nodePath);
System.err.println("节点 "+nodePath+" 的数据为:"+new String(data)+",version为:"+stat.getVersion());

先在zk上设置好数据

【运行结果】

【查询子节点】

//查询子节点
List<String> childNodes = client.getChildren()
.forPath(nodePath);
for (String childNode : childNodes){
System.out.println("childNode = "+childNode);
}

提前创建好一批子节点

【运行结果】

【判断节点是否存在】

//判断节点是否存在,如果节点不存在则为空
Stat statExist = client.checkExists()
.forPath(nodePath);
System.err.println(statExist);
Stat statExist2 = client.checkExists()
.forPath(nodePath+"/lll"); //这里故意设置一个不存在的节点
System.err.println(statExist2);

【运行结果】

07_zookeeper的客户端工具curator_基本api的更多相关文章

  1. 基于tauri打造的HTTP API客户端工具-CyberAPI

    国庆长假和朋友聚会的时候,和朋友谈起最近这段时间捣鼓tauri,写了一个HTTP API客户端工具.『你写了这么多东西,其实有想过是为了啥不?』为了啥这是一个很大的命题,当初每个项目的时候都想过它应该 ...

  2. 理解 OpenStack + Ceph (3):Ceph RBD 接口和工具 [Ceph RBD API and Tools]

    本系列文章会深入研究 Ceph 以及 Ceph 和 OpenStack 的集成: (1)安装和部署 (2)Ceph RBD 接口和工具 (3)Ceph 物理和逻辑结构 (4)Ceph 的基础数据结构 ...

  3. MetaWeblog博客客户端工具之Windows Live Writer

    吐槽&注意的坑: 刚听说了有这么一个东西,据说Windows Live Writer开源之后就改名为Open Live Writer,我以为Open Live Writer就要比Windows ...

  4. 用edtftpj实现Java FTP客户端工具

    edtftpj是一个java FTP工具包,使用非常方便,感觉比Apache的好用,但Apache更灵活.edtftpj有多种版本,分别是java..net和js版本.对于Java版的有一个免费版本. ...

  5. MySQL初始化以及客户端工具的使用

    MySQL初始化以及客户端工具的使用 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是关系型数据库 关系型数据库通常是把所有的数据都组织成二维关系.之所以称为关系型数据库是 ...

  6. mysql客户端工具

    MySQL 数据库不仅提供了数据库的服务器端应用程序,同时还提供了大量的客户端工具程序,如 mysql,mysqladmin,mysqldump 等等,都是大家所熟悉的.虽然有些人对这些工具的功能都已 ...

  7. 高可用Kubernetes集群-4. kubectl客户端工具

    六.部署kubectl客户端工具 1. 下载 [root@kubenode1 ~]# cd /usr/local/src/ [root@kubenode1 src]# wget https://sto ...

  8. SpringBoot项目整合Retrofit最佳实践,这才是最优雅的HTTP客户端工具!

    大家都知道okhttp是一款由square公司开源的java版本http客户端工具.实际上,square公司还开源了基于okhttp进一步封装的retrofit工具,用来支持通过接口的方式发起http ...

  9. 几款Git GUI客户端工具

    工欲善其事,必先利其器. 作为一名开发人员,你不可能不知道git,无论你是开发自己的开源项目还是和团队一起进行大规模产品的开发,git都已经是源代码管理工具的首选.当然,那些hardcore deve ...

随机推荐

  1. Java第四次实训作业

    1.编写“电费管理类”及其测试类. 第一步 编写“电费管理”类1)私有属性:上月电表读数.本月电表读数2)构造方法:无参.2个参数3)成员方法:getXXX()方法.setXXX()方法4)成员方法 ...

  2. apk包不能生成的原因之debug.keystore

    在Eclipse里面编译生成的APK中有一个签名的,它默认的key是debug.keystore,它默认的路径是: C:\Users\<用户名>\.android\debug.keysto ...

  3. range() 和 np.arange()区别

    range() 和 np.arange()区别 range(start,stop,step) 三个参数都必须是整数 np.arange()没有此类约束

  4. sql server 保留小数,向上保留指定位数的小数,仅记录,勿看。

    比如 4.05 要取成 4.1 , 4.16 取成 4.2 ,4.5 取成 4.5 ,意思就是小数部分第二位不管是多少都丢掉然后加0.1,但是如果是 4.5 这样完整的就不需要处理. 可以像下面这么写 ...

  5. vue与TypeScript集成配置最简教程

    https://blog.csdn.net/u014633852/article/details/73706459 https://segmentfault.com/a/119000001187808 ...

  6. Fiddler使用三(Fiddler内置命令)

    参考:http://blog.csdn.net/ohmygirl/article/details/17855031 一. Fiddler内置命令. 上一节使用Fiddler进行抓包分析中,介绍到,在w ...

  7. Ubuntu14.04下编译安装或apt-get方式安装搭建Apache或Httpd服务(图文详解)

    不多说,直接上干货! 写在前面的话 对于 在Ubuntu系统上,编译安装Apache它默认路径是在/usr/local/apache2/htdocs 或者编译安装httpd它默认路径是在/usr/lo ...

  8. 游戏中的网络同步机制——Lockstep(帧同步)

    本文来自: https://bindog.github.io/blog/2015/03/10/synchronization-in-multiplayer-networked-game-lockste ...

  9. Unity Github 项目收集

    http://gad.qq.com/article/detail/24048 重磅推荐: Github 热门 Unity Assets 查询:http://unitylist.com/browse 最 ...

  10. 编写规范的javascript

    js代码,前端都会写.但细节决定成败,代码是否优雅.规范,可以看得出一个JScoder的水平来. 曾经多次被项目组长吐槽,并被授予一本秘笈,上面有关于JS编程规范的一些总结. 无奈秘笈不能长借,无奈只 ...