Grey

ZooKeeper学习笔记二:API基本使用

准备工作

搭建一个zk集群,参考ZooKeeper学习笔记一:集群搭建

确保项目可以访问集群的每个节点

新建一个基于jdk1.8的maven项目。

配置依赖

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.3</version>
</dependency>

注:zookeeper的依赖版本要和集群安装的zookeeper版本一致。

zk配置类

新建ZookeeperConfig.java,作为一个工具类,获取zk客户端实例,具体代码如下:

import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper; import java.io.IOException;
import java.util.concurrent.CountDownLatch; public class ZookeeperConfig {
private static final String ADDRESS = "192.168.205.145:2181,192.168.205.146:2181,192.168.205.147:2181,192.168.205.148:2181";
private static ZooKeeper zk;
static CountDownLatch latch; public static ZooKeeper create() {
latch = new CountDownLatch(1);
try {
zk = new ZooKeeper(ADDRESS, 3000, new DefaultWatch());
latch.await();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
return zk;
} public static void close() {
if (zk != null) {
try {
zk.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} private static class DefaultWatch implements Watcher {
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
latch.countDown();
}
}
}
}

调用

Zookeeper zookeeper = ZookeeperConfig.create();

即可获取一个zk客户端。

简单使用

对于一些set/get方法,我做了一些简单的封装,包括直接getData,getData同时增加watcher,通过回调函数来实现getData的后续逻辑,代码很简单,如下:

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat; import static java.nio.charset.StandardCharsets.UTF_8;
import static org.apache.zookeeper.CreateMode.EPHEMERAL;
import static org.apache.zookeeper.ZooDefs.Ids.OPEN_ACL_UNSAFE;
/**
* Reactive方式实现的zk客户端
*/
public class ReactiveClient {
public static final String ADDRESS = "192.168.205.145:2181,192.168.205.146:2181,192.168.205.147:2181,192.168.205.148:2181";
private static final ZooKeeper CLIENT = ZookeeperConfig.create(); public static void main(String[] args) {
getData();
getDataWithWatcher();
getDataAndCallback();
pending(10000);
} private static void getDataAndCallback() {
System.out.println("get data and callback");
String path = "/abc";
String data = "Hello";
createOrUpdate(path, data);
CLIENT.getData(path, false, (rc, path1, ctx, data1, stat) -> {
//System.out.println(rc);
//System.out.println(ctx);
System.out.println("call back get data : " + new String(data1));
//System.out.println(stat);
}, "abc");
} private static void getDataWithWatcher() {
System.out.println("---create and get data with watcher---");
String path = "/abc";
String data = "Hello";
createOrUpdate(path, data);
Stat stat = new Stat();
try {
Stat finalStat = stat;
byte[] data1 = CLIENT.getData(path, new Watcher() {
@Override
public void process(WatchedEvent event) {
// System.out.println("get data event: " + event);
try {
byte[] data2 = CLIENT.getData(path, this, finalStat);
System.out.println("get data from event : " + new String(data2));
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}, stat);
System.out.println(new String(data1));
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
String newData = "World";
try {
// 触发回调
stat = CLIENT.setData(path, newData.getBytes(UTF_8), stat.getVersion());
stat = CLIENT.setData(path, newData.getBytes(UTF_8), stat.getVersion());
stat = CLIENT.setData(path, newData.getBytes(UTF_8), stat.getVersion());
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
} private static void getData() {
String path = "/abc";
String data = "Hello";
createOrUpdate(path, data);
String result = getData(path);
System.out.println(result);
createOrUpdate(path, "world");
result = getData(path);
System.out.println(result);
} public static void pending(long sec) {
try {
Thread.sleep(sec);
ZookeeperConfig.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
} public static String getData(String path) {
try {
return new String(CLIENT.getData(path, false, new Stat()));
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
return null;
} public static void createOrUpdate(String path, String data) {
try {
Stat exists = CLIENT.exists(path, false);
if (null != exists) {
CLIENT.setData(path, data.getBytes(UTF_8), exists.getVersion());
return;
}
// 创建一个节点
CLIENT.create(path, data.getBytes(UTF_8), OPEN_ACL_UNSAFE, EPHEMERAL);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
}
}

源码

Github

ZooKeeper学习笔记二:API基本使用的更多相关文章

  1. Java学习笔记二--API课堂记录

    JavaSE课堂记录(二) 第一节课 方法的重载:方法名相同,参数列表不同 方法的重写:方法名,参数列表相同 两同:方法名相同,参数列表相同 两小:访问权限小与等于父类,返回值类型小于等于父类(返回值 ...

  2. ZooKeeper学习笔记(二)——内部原理

    zookeeper学习笔记(二)--内部原理 1. zookeeper的节点的类型 总的来说可以分为持久型和短暂型,主要区别如下: 持久:客户端与服务器端断开连接的以后,创建的节点不会被删除: 持久化 ...

  3. AJax 学习笔记二(onreadystatechange的作用)

    AJax 学习笔记二(onreadystatechange的作用) 当发送一个请求后,客户端无法确定什么时候会完成这个请求,所以需要用事件机制来捕获请求的状态XMLHttpRequest对象提供了on ...

  4. java之jvm学习笔记二(类装载器的体系结构)

    java的class只在需要的时候才内转载入内存,并由java虚拟机的执行引擎来执行,而执行引擎从总的来说主要的执行方式分为四种, 第一种,一次性解释代码,也就是当字节码转载到内存后,每次需要都会重新 ...

  5. ZooKeeper 学习笔记

    ZooKeeper学习笔记 1.   zookeeper基本概念 zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,是hadoop和Habase的重要组件,是为分布式应用提供一致性服 ...

  6. NumPy学习笔记 二

    NumPy学习笔记 二 <NumPy学习笔记>系列将记录学习NumPy过程中的动手笔记,前期的参考书是<Python数据分析基础教程 NumPy学习指南>第二版.<数学分 ...

  7. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  8. python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码

    python3.4学习笔记(二十三) Python调用淘宝IP库获取IP归属地返回省市运营商实例代码 淘宝IP地址库 http://ip.taobao.com/目前提供的服务包括:1. 根据用户提供的 ...

  9. amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules

    amazeui学习笔记二(进阶开发5)--Web 组件开发规范Rules 一.总结 1.见名知意:见那些class名字知意,见函数名知意,见文件名知意 例如(HISTORY.md Web 组件更新历史 ...

随机推荐

  1. 使用IDEA模拟git命令使用的常见场景

    目录 使用IDEA模拟git命令使用的常见场景 前期准备 新建一个远程仓库 在一个文件夹内建立两个子文件夹作为两个本地仓库的存放位置 本地仓库与远程仓库建立联系 模拟两个用户协同开发的场景(使用IDE ...

  2. Sublime Text 3 Build 3176 License

    先在hosts文件里加入两行: 127.0.0.1 www.sublimetext.com 127.0.0.1 license.sublimehq.com 目的是防止Sublime Text更新和检测 ...

  3. Hook android系统调用的实践

    本文博客地址:http://blog.csdn.net/qq1084283172/article/details/71037182 一.环境条件 Ubuntukylin 14.04.5 x64bit ...

  4. hdu4966 最小树形图(最少辅导花费)

    题意:       以一些科目,和辅导班,每个科目最终要求修到某个等级,可以花一定的钱在辅导班把某一科目修到某一等级,进入辅导班的时候会有一个限制,那就是达到他给出的科目和等级限制,比如a b c d ...

  5. linux ptrace学习

    ptrace提供了一种使父进程得以监视和控制其它进程的方式,它还能够改变子进程中的寄存器和内核映像,因而可以实现断点调试和系统调用的跟踪.学习linux的ptrace是为学习android adbi框 ...

  6. 每天一道面试题LeetCode 26--删除排序数组中的重复项(python实现)

    题目1:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间的条件下完成. ...

  7. Yii2表头强制不换行

    在Yii2中使用GridView生成的表格有一个小问题,那就是表头的列宽是根据列的值自适应的,但有时值的长度比较小,表头就会出现下面这种情况(表头不在同一行,非常的不利于数据的查看) 设置强制不换行可 ...

  8. HTML <video>

    HTML <video> 元素 用于在HTML或者XHTML文档中嵌入媒体播放器,用于支持文档内的视频播放.你也可以将 <video> 标签用于音频内容,但是 <audi ...

  9. 【】maven 配置启动tomcat版本,修改默认的6.x.x版本

    <build> <plugins> <!-- 配置Tomcat插件 ,用于启动项目 --> <plugin> <groupId>org.ap ...

  10. Element ui结合springboot的简单实战

    Eelment UI简单实战 前端开发 1 创建项目,导入element ui(略) 2 大致设计出想要的效果,如下 3 创建包 根据设计的大致模样在项目的components中创建对应的包,方便以后 ...