ZkClient

从创建会话、创建节点、读取数据、更新数据、删除节点拉介绍ZkClient

添加依赖:

pom.xml

<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>

创建会话,连接服务端:

public class CreateSession {
/*
zkClient连接服务端
zkClient通过对zookeeperAPI的内部包装,将这个会话创建的过程同步化了
*/
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("ZooKeeper session established.");
}
}

创建节点:

ZkClient提供了递归创建节点的接口、先创建父节点,在创建子节点。

public class Create_Node_Sample {
public static void main(String[] args) {
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("ZooKeeper session established.");
//createParent设置为true,可递归创建
zkClient.createPersistent("/g-zkClient/g-c1",true);
System.out.println("success create znode.");
}

删除节点:

ZkClient提供了递归删除节点,先删除子节点,再删除父节点。

public class Del_Data_Sample {
public static void main(String[] args) throws Exception {
String path = "/g-zkClient/g-c1";
ZkClient zkClient = new ZkClient("127.0.0.1:2181", 5000);
zkClient.deleteRecursive(path);
System.out.println("success delete znode.");
}
}

获取子节点:

/*
借助zkclient完成会话的创建
*/
public static void main(String[] args) throws InterruptedException { /*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/ ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了.."); // 获取子节点列表
List<String> children = zkClient.getChildren("/g-zkclient");
System.out.println(children); // 注册监听事件 /*
客户端可以对一个不存在的节点进行子节点变更的监听
只要该节点的子节点列表发生变化,或者该节点本身被创建或者删除,都会触发监听
*/
zkClient.subscribeChildChanges("/g-zkclient-get", new IZkChildListener() { /*
s : parentPath
list : 变化后子节点列表
*/ public void handleChildChange(String parentPath, List<String> list) throws Exception {
System.out.println(parentPath + "的子节点列表发生了变化,变化后的子节点列表为"+ list); }
}); //测试
zkClient.createPersistent("/g-zkclient-get");
Thread.sleep(1000); zkClient.createPersistent("/g-zkclient-get/c1");
Thread.sleep(1000); }

获取数据:

 /*
借助zkclient完成会话的创建
*/
public static void main(String[] args) throws InterruptedException { /*
创建一个zkclient实例就可以完成连接,完成会话的创建
serverString : 服务器连接地址 注意:zkClient通过对zookeeperAPI内部封装,将这个异步创建会话的过程同步化了..
*/ ZkClient zkClient = new ZkClient("127.0.0.1:2181");
System.out.println("会话被创建了.."); // 判断节点是否存在
String path = "/g-zkClient-Ep";
boolean exists = zkClient.exists(path); if(!exists){
// 创建临时节点
zkClient.createEphemeral(path,"123");
} // 读取节点内容
Object o = zkClient.readData(path);
System.out.println(o); // 注册监听
zkClient.subscribeDataChanges(path, new IZkDataListener() { /*
当节点数据内容发生变化时,执行的回调方法
s: path
o: 变化后的节点内容
*/
public void handleDataChange(String s, Object o) throws Exception {
System.out.println(s+"该节点内容被更新,更新的内容"+o);
} /*
当节点被删除时,会执行的回调方法
s : path
*/
public void handleDataDeleted(String s) throws Exception {
System.out.println(s+"该节点被删除");
}
}); // 更新节点内容
zkClient.writeData(path,"456");
Thread.sleep(1000); // 删除节点
zkClient.delete(path);
Thread.sleep(1000); }

Curator 客户端

Curator 是Netfilx公司开源的一套Zookeeper客户端框架,和ZkClient一样。解决了很多Zookeeper客户端底层非常细节的开发工作。

连接重连、反复注册Watcher、NodeExistsException基于Fluent编程风格。

添加依赖:

<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>

创建会话:

Curator创建会话,是是通过CuratorFrameworkFactory的工厂类来实现的。

public static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)
public static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs, RetryPolicy retryPolicy)

参数 RetryPolicy重试策略接口、ExponentialBackoffRetry (基于 Backoff 重连策略)、RetryNTimes(重连N次策略)、RetryForever (永久重连)

通过调用CuratorFramework中的 start()方法,来启动会话。

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client =CuratorFrameworkFactory.newClient("127.0.0.1:2181",retryPolicy);
client.start();

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",
5000,1000,retryPolicy);
client.start();

基于Fluent编程风格

/*
connectString: zk server地址,多个server逗号分隔
connectionTimeoutMs:链接超时时间 默认15s
sessionTimeoutMs:会话超时时间 默认60s
retryPolicy: 失重策略:
ExponentialBackoffRetr:ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries, int maxSleepMs)
baseSleepTimeMs:重试sleep时间,用于计算每次重试sleep时间 (sleep=baseSleepTimeMs*Math.max(1,random.nextInt(1<<(retryCount+1)))
maxRetries: 最大重试次数
maxSleepMs:最大
sleep时间
*/

public static void main(String[] args) throws Exception {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client =
CuratorFrameworkFactory.newClient("127.0.0.1:2181", 5000, 3000, retryPolicy);
client.start();

System.out.println("Zookeeper session1 established. ");
CuratorFramework client1 = CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181") 
.sessionTimeoutMs(5000) 
.connectionTimeoutMs(3000) 
.retryPolicy(retryPolicy)
.namespace("base") // 独立命名空间/base
.build(); //
client1.start();
System.out.println("Zookeeper session established. ");
}

1、创建节点:

//创建内容为空的节点:
client.create().forPath(path); //创建内容不为空的节点:
client.create().forPath(path,"内容".getBytes()); //递归创建父节点,并选着节点类型:
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);

2、删除节点

client.delete().forPath(path);//删除一个节点
client.delete().deletingChildrenIfNeeded().forPath(path); // 删除节点并递归删除子节点
client.delete().withVersion(1).forPath(path);//指定版本删除 1表示最新版本
client.delete().guaranteed().forPath(path); //强制删除

3、获取数据

// 普通查询
client.getData().forPath(path);
// 包含状态查询
Stat stat = new Stat();
client.getData().storingStatIn(stat).forPath(path);

4、更新数据

// 普通更新
client.setData().forPath(path,"新内容".getBytes());
// 指定版本更新
client.setData().withVersion(1).forPath(path); //版本不一致报错
org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode =
BadVersion for
public static void main(String[] args) throws Exception {
String path="/wg_curator/w1";
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//使用Fluent编程风格 namespace 命名空间 /base zookeeper 业务隔离
CuratorFramework client = CuratorFrameworkFactory.builder()
.connectString("152.136.193.58:2181")
.sessionTimeoutMs(50000)
.connectionTimeoutMs(30000)
.retryPolicy(retryPolicy)
.namespace("base")
.build();
client.start();
//递归创建节点
System.out.println("使用Fluent编程风格 session connection...");
String path1 = client.create().creatingParentContainersIfNeeded().withMode(CreateMode.PERSISTENT).forPath(path);
System.out.println("session connection... 创建Node sucess.." +path); //获取节点数据
byte[] bytes1 = client.getData().forPath(path);
Stat s =new Stat();
byte[] bytes = client.getData().storingStatIn(s).forPath(path);
System.out.println("session connection... 获取Node sucess.." +path);
System.out.println("session connection... 获取Node数据内容" +new String(bytes1));
System.out.println("session connection... 获取Node Data 包含状态查询" +s); //递归删除Node
client.delete().deletingChildrenIfNeeded().withVersion(-1).forPath(path);
System.out.println("session connection... 递归删除Node sucess.." +path);
}

六、Zookeeper-开源客户端ZkClient与Curator的更多相关文章

  1. 七:zooKeeper开源客户端ZkClient的api测试

    ZkClient是Gitthub上一个开源的ZooKeeper客户端.ZKClient在ZooKeeper原生API接口之上进行了包装,是一个更加易用的ZooKeeper客户端.同时ZKClient在 ...

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

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

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

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

  4. zookeeper开源客户端curator

    zookeeper的原生api相对来说比较繁琐,比如:对节点添加监听事件,当监听触发后,我们需要再次手动添加监听,否则监听只生效一次:再比如,断线重连也需要我们手动代码来判断处理等等.对于curato ...

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. Java开发环境搭建(若jdk8按默认安装后没有jre文件夹,卸载重装时选择完整安装)

    JDK下载与安装(JDK 8是主流,新版版就是增加了一些新特性) 卸载旧JDK 删除java的安装目录 删除JAVA_HOME 删除path下关于java的目录 在cmd命令行中输入java vers ...

  2. Mac 安装并破解热部署插件JRebel详细教程

    热部署插件 JRebel 非常高效的解决了在IDEA中对 Java 代码修改重启Tomcat的效率问题,这样大大降低了项目开发的时间,不用重启即可重新编译修改过的Java代码! (1)IDEA中安装热 ...

  3. ubuntu16.04搭建vulhub环境

    简介 Vulhub官方中文教程https://github.com/vulhub/vulhub/blob/master/README.zh-cn.md 环境:ubuntu16.04.5 python3 ...

  4. FL Studio中echo的延迟作用

    今天来一起研究FL Studio的Echo Delay的作用,Echo Delay可以从MIDI输入创建回声,并允许我们通过音量,声像,切除和共振,音高和时间来操纵延迟. 图1:Echo Dealy ...

  5. Vuex form表单处理, 比官网更好的办法

    Vuex form表单处理, 比官网更好的办法 问题, 当使用vuex的state作为表单的v-model元素, 虽然简单粗暴, 但这种修改没有经过mutation方法. 在严格模式下会抛出错误 目录 ...

  6. 企业安全01-Apache solr XML实体注入漏洞CVE-2017-12629

    Apache solr XML 实体注入漏洞CVE-2017-12629 一.简介 Apache Solr 是一个开源的搜索服务器.Solr 使用 Java 语言开发,主要基于 HTTP 和 Apac ...

  7. java.util.UnknownFormatConversionException: Conversion = 'j' || Conversion = 'D' || Conversion = 'Y'

    执行内容: String a = "select * from j_question j where j.status = %s and j.title like '%java%'" ...

  8. Vue+EasyPOI导出Excel(带图片)

    一.前言 平时的工作中,Excel 导入导出功能是非常常见的功能,无论是前端 Vue (js-xlsx) 还是 后端 Java (POI),如果让大家手动编码实现的话,恐怕就很麻烦了,尤其是一些定制化 ...

  9. Robot Framework接口自动化案例分享⑦——Jenkins持续集成

    一.RobotFramework插件安装 1.Jenkins首页->系统管理->插件管理->可选插件-> 2.搜索robot,点击直接安装 二.任务参数配置 1.新建任务 Je ...

  10. C++20初体验——concepts

    引子 凡是涉及STL的错误都不堪入目,因为首先STL中有复杂的层次关系,在错误信息中都会暴露出来,其次这么多类和函数的名字大多都是双下划线开头的,一般人看得不习惯. 一个经典的错误是给std::sor ...