目录

一、介绍

二、zookeeper API

  2.1、导入依赖

  2.2、连接zk集群

  2.3、操作数据操作

三、zkClient API

  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的更多相关文章

  1. curator框架的使用以及实现分布式锁等应用与zkclient操作zookeeper,简化复杂原生API

    打开zookeeper集群 先体会一下原生API有多麻烦(可略过): //地址 static final String ADDR = "192.168.171.128:2181,192.16 ...

  2. ZKClient操作zookeeper

    前面简单研究了curator的使用,下面简单研究zkclient的使用. 1.创建连接 private static final String CONNECT_ADDR = "127.0.0 ...

  3. Java操作zookeeper

    Java操作zookeeper总共有三种方式: 1.原生的Java API 2.zkclient 3.curator 第一种实现代码: pom.xml <dependency> <g ...

  4. Java代码操作zookeeper

    .personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...

  5. Java curator操作zookeeper获取kafka

    Java curator操作zookeeper获取kafka Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更 ...

  6. java 操作zookeeper

    java 操作zookeeper(一) 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper ...

  7. zookeeper(三):java操作zookeeper

    引入jar包 首先要使用java操作zookeeper,zookeeper的javaclient 使我们更轻松的去对zookeeper进行各种操作,我们引入zookeeper-3.4.5.jar 和 ...

  8. zookeeper Java API 简单操作示例

    本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...

  9. ZooKeeper学习总结(2)——ZooKeeper开源Java客户端ZkClient使用

    zkclient是zookeeper的Java客户端.它让Zookeeper API 使用起来更简单:它非常方便订阅各种事件并自动重新绑定事件(会话建立.节点修改.节点删除.子节点变更等):它提供了s ...

随机推荐

  1. 8 个 Python 实用脚本,赶紧收藏备用!

    脚本写的好,下班下得早!程序员的日常工作除了编写程序代码,还不可避免地需要处理相关的测试和验证工作. 例如,访问某个网站一直不通,需要确定此地址是否可访问,服务器返回什么,进而确定问题在于什么.完成这 ...

  2. python函数调用时参数传递方式

    python函数调用时参数传递方式 C/C++参数传递方式 对于C程序员来说,我们都知道C在函数调用时,采用的是值传递,即形参和实参分配不同的内存地址,在调用时将实参的值传给实参,在这种情况下,在函数 ...

  3. django项目登录中使用图片验证码

    应用下创建untils文件夹放置封装图片验证码的函数 创建validCode.py文件定义验证码规则 import random def get_random_color(): return (ran ...

  4. windows查看文件MD5值的命令

    今天需要,就记录一下. certutil -hashfile filename MD5 certutil -hashfile filename SHA1 certutil -hashfile file ...

  5. oracle取随机数,取固定行数的数

    首先建一张测试表: create table DIM_IA_TEST5 ( NAME ), OTHERNAME ), NUM NUMBER, TIMES NUMBER ) 然后插入数据,现在的表数据为 ...

  6. 怎样在一条sql语句中将第一列和第二列加和的值作为第三列的值

    今天在写代码的时候,遇到的一个小问题,特意记下来,以免自己以后忘记了. 在一个表单里面,要表单的第一列和第二列的值查询出来,做和,作为第三列的值. select 1 as a,2 as b,(a+b) ...

  7. tensorflow API _ 4 (优化器配置)

    """Configures the optimizer used for training. Args: learning_rate: A scalar or `Tens ...

  8. JPA注解开发

    JPA注解开发 jpa是sun公司的一个ORM规范,只有接口和注解,没有具体实现. jpa是EJB3中的. 单表常用注解 书写注解,并配置 @Entity @Table(name = "c_ ...

  9. hdu4767 Bell——求第n项贝尔数

    题意 设第 $n$ 个Bell数为 $B_n$,求 $B_n \ mod  \ 95041567$.($1 \leq  n  \leq  2^{31}$) 分析 贝尔数的概念和性质,维基百科上有,这里 ...

  10. javascript慕课入门

    1.javascript引用 html里引用: <script type="text/javascript"> ... ... </script> 引用外部 ...