目录

一、介绍

二、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. Gtest:事件

    前言 有时候在测试的时候,我们会在测试前做一些初始化活动,和测试后做一些清理工作,gtest提供了多种事件机制,非常方便我们在案例之前或之后做一些操作.总结一下gtest的事件一共有3种: 全局的,所 ...

  2. meibu ddns update command

    http://main.meibu.com/ip/login.asp?name=[USERNAME]&pwd=[PASSWORD]

  3. thymeleaf教程-springboot项目中实现thymeleaf自定义标签

    转载: http://www.9191boke.com/466119140.html    91博客网 开始: 在使用thymeleaf的过程中有时候需要公共部分渲染页面,这个时候使用自定义标签实现自 ...

  4. python的map和reduce函数

    map函数时python的高级内置函数 语法为:map(function, iterable, ...) 参数:function -- 函数iterable -- 一个或多个序列 将function作 ...

  5. 逆向破解之160个CrackMe —— 006

    CrackMe —— 006 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  6. 使用aliyun的oss服务器上传照片

    1.控制台操作 首先介绍一下阿里云OSS对象存储的一些基本概念. 1.1 进入对象存储界面 登录阿里云账号,进入对象存储界面,如图所示. 进入后如图所示. 1.2 OSS基本概念 这里不过多介绍如何在 ...

  7. tcp中设置连接超时

    直接上代码: 设置连接超时 //首先改成非阻塞套接字 unsigned ; int rm=ioctl(sConnect,FIONBIO,(unsigned long*)&ul); ) { pr ...

  8. c#中的继承学习总结

    c#的继承方法,大体上和c++的类似,但是有点区别的,我这里刚刚初学,因此把重点记录下. 1.派生类继承了父类,那么,如果父类的方法和数据都是public,那么派生类都会继承.派生类可以直接调用父类的 ...

  9. Centos7安装使用Mysql(mariadb)

    安装 shell> yum install mariadb-server -y 配置 # 修改文件 /etc/my.cnf [mysqld]datadir=/mydata/data/mysqlc ...

  10. 【模板】A*B Problem(FFT快速傅里叶)

    题目:给出两个n位10进制整数x和y,你需要计算x*y.($n \leq 60000$) 分析: 两个正整数的相乘可以视为两个多项式的相乘, 例如 $15 \times 16 = 240$, 可写成 ...