Java 使用ZkClient操作Zookeeper
目录
一、介绍
2.1、导入依赖
2.2、连接zk集群
2.3、操作数据操作
3.1、导入依赖
3.2、使用示例
一、介绍
这里主要记录通过Java调用API来操作Zookeeper集群的数据,对于zookeeper集群的搭建或者命令,可以参考:
目前接触到的Java操作Zookeeper,有两套API,一套是zookeeper官方提供的(zookeeper),另外一套是封装了官方API的API(zkClient),从描述上来看,就知道,官方的API可能不是那么好用,不然也不会在封装。
二、zookeeper API
2.1、导入依赖
使用zookeeper官方api的时候,请保证jar包的版本,和zk集群中zk的版本相同
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.7</version>
</dependency>
2.2、连接zk集群
下面是代码示例,两种形式(分别使用匿名类和Lambda表达式):
package cn.ganlixin.zk; import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
import org.junit.Test; import java.io.IOException; public class ZookeeperDemo { @Test
public void connectZkCluster() throws IOException, KeeperException, InterruptedException { // 构造方法
// ZooKeeper(String connectString, int sessionTimeout, Watcher watcher) // 匿名对象形式
ZooKeeper zooKeeper = new ZooKeeper(
"192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
20000,
new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
// 发生变更的节点路径
String path = watchedEvent.getPath();
System.out.println("path:" + path); // 通知状态
Watcher.Event.KeeperState state = watchedEvent.getState();
System.out.println("KeeperState:" + state); // 事件类型
Watcher.Event.EventType type = watchedEvent.getType();
System.out.println("EventType:" + type);
}
}
); // 关闭连接
zooKeeper.close(); // Lamdba形式
ZooKeeper zk = new ZooKeeper(
"192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
20000,
watchedEvent -> {
// 发生变更的节点路径
String path = watchedEvent.getPath();
System.out.println("path:" + path); // 通知状态
Watcher.Event.KeeperState state = watchedEvent.getState();
System.out.println("KeeperState:" + state); // 事件类型
Watcher.Event.EventType type = watchedEvent.getType();
System.out.println("EventType:" + type);
}
); zk.close();
}
}
运行上面的代码,控制台输出如下(输出了两遍,是因为创建了两次连接)
path:null
KeeperState:SyncConnected
EventType:None
path:null
KeeperState:SyncConnected
EventType:None
2.3、操作数据操作
操作Zk中的数据,方式也很简单,只需要使用创建的zk连接,调用对应的方法即可(方法名与zk命令行中命令相同)
package cn.ganlixin.zk; import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
import org.junit.Test; import java.io.IOException; public class ZookeeperDemo { @Test
public void manageData() throws KeeperException, InterruptedException, IOException { // 创建zk连接
ZooKeeper zk = new ZooKeeper(
"192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
20000,
null
); // 创建节点
zk.create("/abc", "123".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); // 获取节点数据
// getData(String path, boolean watch, Stat stat);
Stat stat = new Stat();
byte[] data = zk.getData("/abc", false, stat);
System.out.println(new String(data)); // 数据内容 123
System.out.println(stat.getDataLength()); // 节点状态(数据长度) 3 // 对/abc进行watch
zk.getData("/abc",
watchedEvent -> {
System.out.println("path:" + watchedEvent.getPath());
System.out.println("KeeperState:" + watchedEvent.getState());
System.out.println("EventType:" + watchedEvent.getType());
},
null); // 设置节点数据
// setData(String path, byte[] data, int version)
// 指定version为-1,表示不关心版本
zk.setData("/abc", "456".getBytes(), -1); // 设置两次,第二次不会触发通知
zk.setData("/abc", "789".getBytes(), -1); // 阻塞,以等待通知
Thread.sleep(1000);
zk.close();
}
}
上面的程序,运行输出结果如下:
123
3
path:/abc
KeeperState:SyncConnected
EventType:NodeDataChanged
可以看到,只显示了一次通知,和与预期相符。
三、zkClient API
因为Zookeeper API比较复杂,使用并不方便,所以出现了ZkClient,ZkClient对Zookeeper API进行了封装,利用ZkClient可以更加方便地对Zookeeper进行操作。
3.1、导入依赖
因为zkClient是对zookeeper的再封装,所以需要注意zkClient中zookeeper的版本与zk集群的版本相同,可以在maven仓库中查看对应关系
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
3.2、使用示例
下面是个简单的示例:
package cn.ganlixin.zk; import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkStateListener;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.Watcher;
import org.junit.Test; import java.util.List; public class ZkClientDemo { @Test
public void testConn() throws InterruptedException {
ZkClient zkClient = new ZkClient(
"192.168.1.3:2181,192.168.1.4:2181,192.168.1.5:2181",
20000
); // 创建节点
zkClient.createPersistent("/abc", "hello");
zkClient.createEphemeral("/xyz", "world");
zkClient.create("/opq", "world", CreateMode.EPHEMERAL_SEQUENTIAL); String data = zkClient.readData("/abc");
System.out.println(data); // 监听状态变化
zkClient.subscribeStateChanges(new IZkStateListener() {
@Override
public void handleStateChanged(Watcher.Event.KeeperState keeperState) throws Exception {
System.out.println("state:" + keeperState);
} @Override
public void handleNewSession() throws Exception {
System.out.println("new session");
} @Override
public void handleSessionEstablishmentError(Throwable throwable) throws Exception {
throwable.printStackTrace();
}
}); // 监听子节点发生变化
zkClient.subscribeChildChanges("/", new IZkChildListener() {
@Override
public void handleChildChange(String path, List<String> list) throws Exception {
System.out.println("watch path:" + path);
// 输出所有子节点
list.forEach(str -> {
System.out.println(str);
});
}
}); Thread.sleep(100000);
}
}
Java 使用ZkClient操作Zookeeper的更多相关文章
- curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API
打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...
- ZKClient操作zookeeper
前面简单研究了curator的使用,下面简单研究zkclient的使用. 1.创建连接 private static final String CONNECT_ADDR = "127.0.0 ...
- Java操作zookeeper
Java操作zookeeper总共有三种方式: 1.原生的Java API 2.zkclient 3.curator 第一种实现代码: pom.xml <dependency> <g ...
- Java代码操作zookeeper
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Java curator操作zookeeper获取kafka
Java curator操作zookeeper获取kafka Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更 ...
- java 操作zookeeper
java 操作zookeeper(一) 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper ...
- zookeeper(三):java操作zookeeper
引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...
- zookeeper Java API 简单操作示例
本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...
- ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用
zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...
随机推荐
- 从linux进程角度看JVM内存模型
普通进程栈区,在JVM一般仅仅用做线程栈,如下图所示 首先是永久代.永久代本质上是Java程序的代码区和数据区.Java程序中类(class),会被加载到整个区域的不同数据结构中去,包括常量池.域.方 ...
- Windows/Linux/Mac下安装mvn
Step1: 去官网地址下载 http://maven.apache.org/download.cgi Step2: 解压并且移动到指定到目录下 Step3: 配置环境变量并使之生效 .bash_pr ...
- 项目Alpha冲刺--7/10
项目Alpha冲刺--7/10 作业要求 这个作业属于哪个课程 软件工程1916-W(福州大学) 这个作业要求在哪里 项目Alpha冲刺 团队名称 基于云的胜利冲锋队 项目名称 云评:高校学生成绩综合 ...
- html5添加视频为背景自动播放
客户想做个打开官网自动播放一段视频,楼主使用了video标签,即下面的代码:: 于是我在video标签上添加了属性 autoplay=“autoplay” loop=“loop” 然而通过地址栏进去的 ...
- 更丰富的符号工具包 Font Awesome
我时常想要在此类文档中通过一些图形符号来表达更丰富的含义或是对段落进行标注,例如使用 Emoji.然而 Emoji 在这方面仍然有存在一些不足,如: 颜色与文字风格不统一, 在不同系统的平台上显示不统 ...
- 五.python小数据池,代码块的最详细、深入剖析
一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存中,那么这个空间是 ...
- http服务读取配置文件,交叉编译
因为是在windows上编译的代码,在linux上不可执行,所以需要交叉编译 package main import ( "flag" "gopkg.in/ini.v1& ...
- mybatis自动生成model、dao及对应的mapper.xml文件
背景: 日常开发中,如果新建表,手动敲写model.dao和对应的mapper.xml文件,费时费力且容易出错, 所以采用mybatis自动生成model.dao及对应的mapper.xml文件.代码 ...
- vue-cli搭建SPA项目
1. 什么是vue-cli? vue-cli是vue.js的脚手架,用于自动生成vue.js+webpack的项目模板,创建命令如下: vue init webpack xxx 2. 安装vue-cl ...
- Flutter 简介(事件、路由、异步请求)
1. 前言 Flutter是一个由谷歌开发的开源移动应用软件开发工具包,用于为Android和iOS开发应用,同时也将是Google Fuchsia下开发应用的主要工具.其官方编程语言为Dart. 同 ...