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 ...
随机推荐
- 8 个 Python 实用脚本,赶紧收藏备用!
脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么.完成这 ...
- python函数调用时参数传递方式
python函数调用时参数传递方式 C/C++参数传递方式 对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数 ...
- django项目登录中使用图片验证码
应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (ran ...
- windows查看文件MD5值的命令
今天需要,就记录一下. certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile file ...
- oracle取随机数,取固定行数的数
首先建一张测试表: create table DIM_IA_TEST5 ( NAME ), OTHERNAME ), NUM NUMBER, TIMES NUMBER ) 然后插入数据,现在的表数据为 ...
- 怎样在一条sql语句中将第一列和第二列加和的值作为第三列的值
今天在写代码的时候,遇到的一个小问题,特意记下来,以免自己以后忘记了. 在一个表单里面,要表单的第一列和第二列的值查询出来,做和,作为第三列的值. select 1 as a,2 as b,(a+b) ...
- tensorflow API _ 4 (优化器配置)
"""Configures the optimizer used for training. Args: learning_rate: A scalar or `Tens ...
- JPA注解开发
JPA注解开发 jpa是sun公司的一个ORM规范,只有接口和注解,没有具体实现. jpa是EJB3中的. 单表常用注解 书写注解,并配置 @Entity @Table(name = "c_ ...
- hdu4767 Bell——求第n项贝尔数
题意 设第 $n$ 个Bell数为 $B_n$,求 $B_n \ mod \ 95041567$.($1 \leq n \leq 2^{31}$) 分析 贝尔数的概念和性质,维基百科上有,这里 ...
- javascript慕课入门
1.javascript引用 html里引用: <script type="text/javascript"> ... ... </script> 引用外部 ...