ZooKeeper(二)Java API使用
ZooKeeper官网提供了Java和C的API。 本文使用Java API来实现ZooKeeper的基本操作。
前言
下图中的Replicated Database是包含完整数据树(entire data tree)的内存数据库。ZooKeeper的节点都是存放在内存中,所以读写速度很快。更新日志被记录到了磁盘中,以便用于恢复数据。在更新内存中节点数据之前,会先序列化到磁盘中,然后才会加载到内存中。

ZooKeeper中的每个节点存储的数据要被原子性的操作。也就是说读操作将获取与节点相关的所有数据,写操作也将替换掉节点的所有数据。另外,每一个节点都拥有自己的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点可以执行的操作。
目录
一、API引用
二、API简介
三、API详解
1. 连接zooKeeper服务器
2. 创建znode(zk节点)
3. 删除znode节点
4. 更新znode节点数据
5. 判断znode是否存在
6. 获取znode节点的子节点列表
7. 获取znode节点数据
四、代码示例
一、API引用
<!-- zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
二、API简介
ZooKeeper API共包含五个包:
- org.apache.zookeeper
- org.apache.zookeeper.data
- org.apache.zookeeper.server
- org.apache.zookeeper.server.quorum
- org.apache.zookeeper.server.upgrade
其中org.apache.zookeeper,包含ZooKeeper类,他是我们编程时最常用的类文件。这个类是ZooKeeper客户端的主要类文件。如果要使用ZooKeeper服务,应用程序首先必须创建一个ZooKeeper实例,这时就需要使用此类。一旦客户端和ZooKeeper服务建立起了连接,ZooKeeper系统将会给次连接会话分配一个ID值,并且客户端将会周期性的向服务器端发送心跳来维持会话连接。只要连接有效,客户端就可以使用ZooKeeperAPI来做相应处理了。
三、API详解
1. 连接zooKeeper服务器
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
参数说明:
| connectString | zooKeeper server列表, 以逗号隔开. zooKeeper对象初始化后, 将从server列表中选择一个server, 并尝试与其建立连接. 如果连接建立失败, 则会从列表的剩余项中选择一个server, 并再次尝试建立连接。 |
| sessionTimeout | 指定连接的超时时间。 |
| watcher | 一个 watcher 实例。 |
注意,创建ZooKeeper对象时,只要对象完成初始化便立刻返回。建立连接是以异步的形式进行的,当连接成功建立后,会回调watcher的process方法。如果想要同步建立与server的连接,需要自己进一步封装。一般我们创建完Zookeeper之后,直接等着其连接好了之后,在watcher的process方法里面让主函数结束等待。
2. 创建znode(zk节点)
public String create(final String path, byte data[], List<ACL> acl, CreateMode createMode)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| data | 与znode关联的数据。 |
| acl | 指定权限信息, 如果不想指定权限, 可以传入Ids.OPEN_ACL_UNSAFE。 |
| createMode | 指定znode类型. CreateMode是一个枚举类, 从中选择一个成员传入即可。 |
createMode的可选的成员类型:
| PERSISTENT | 创建后只要不删就永久存在. |
| EPHEMERAL | 会话结束年结点自动被删除,EPHEMERAL结点不允许有子节点。 |
| SEQUENTIAL | 节点名末尾会自动追加一个10位数的单调递增的序号,同一个节点的所有子节点序号是单调递增的。 |
| PERSISTENT_SEQUENTIAL | 结合PERSISTENT和SEQUENTIAL。 |
| EPHEMERAL_SEQUENTIAL | 结合EPHEMERAL和SEQUENTIAL。 |
znode中关联的数据不能超过1M。ZooKeeper的使命是分布式协作,而不是数据存储。
3. 删除znode节点
public void delete(final String path, int version)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| version | 指定要删除的数据的版本, 如果version和真实的版本不同, 删除操作将失败。指定version为-1则忽略版本检查。 |
4. 更新znode节点数据
public Stat setData(final String path, byte data[], int version)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| data | 要设置的到znode的数据,注意数据是直接清空原来的数据,然后写新的数据,且数据的大小不能超过1MB。 |
| version | 指定要更新的数据的版本, 如果version和真实的版本不同, 更新操作将失败。 指定version为-1则忽略版本检查。 |
5. 判断znode是否存在
public Stat exists(final String path, Watcher watcher)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| watcher | 一个 watcher 实例。 |
如果该node存在,则返回该node的状态信息,否则返回null。
public Stat exists(String path, boolean watch)
其余和上面都一样,就是boolean如果为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher。
6. 获取znode节点的子节点列表
public List<String> getChildren(final String path, Watcher watcher)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| watcher | 一个 watcher 实例。 |
如果有child存在,就返回child,如果没有的话,就会返回null。
public List<String> getChildren(String path, boolean watch)
其余和上面都一样,就是boolean如果为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher。
7. 获取znode节点数据
public byte[] getData(final String path, Watcher watcher, Stat stat)
参数说明:
| path | znode的路径,必须是绝对路径。 |
| watcher | 用于指定是否监听path node的删除事件,以及数据更新事件,注意,不监听path node的创建事件,因为如果path node不存在,该方法将抛出KeeperException.NoNodeException异常。 |
| stat | 是个传出参数,getData方法会将path node的状态信息设置到该参数中。是个传出参数,getData方法会将path node的状态信息设置到该参数中。 |
public byte[] getData(String path, boolean watch, Stat stat)
其余和上面都一样,就是boolean如果为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher。
四、代码示例
public class ZooKeeperService {
/**
* Server列表, 以逗号分割, 例如: 192.168.3.4:2181,192.168.3.5:2181,192.168.3.6:2181
*/
private final String hosts;
/**
* 连接的超时时间, 毫秒
*/
private int timeoutMills;
private CountDownLatch connectedSemaphore = new CountDownLatch(1);
private ZooKeeper zk;
/**
* watcher实例
*/
private Watcher connWatcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("conn watched event >>> " + event.toString());
// 连接建立, 回调process接口时, 其event.getState()为KeeperState.SyncConnected
if (event.getState() == Event.KeeperState.SyncConnected) {
// 放开闸门, wait在connect方法上的线程将被唤醒
connectedSemaphore.countDown();
}
}
};
private Watcher existsWatcher = new Watcher() {
@Override
public void process(WatchedEvent event) {
System.out.println("exists watched event >>> " + event.toString());
System.out.println("----------------------------------------------");
System.out.println("path : " + event.getPath() + ", type : " + event.getType() + ", state : " + event.getState());
try {
System.out.println("数据: " + watchData(event.getPath()));
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
}
System.out.println("----------------------------------------------");
}
};
public ZooKeeperService(String hosts, int timeoutMills) throws IOException, InterruptedException {
this.hosts = hosts;
this.timeoutMills = timeoutMills;
// 连接ZooKeeper服务器
connect();
}
/**
* 连接ZooKeeper Server
* <p>
* 创建ZooKeeper对象时, 只要对象完成初始化便立刻返回.
* 建立连接是以异步的形式进行的, 当连接成功建立后, 会回调Watcher的process方法.
* 如果想要同步建立与server的连接, 需要自己进一步封装.
*/
public void connect() throws IOException, InterruptedException {
zk = new ZooKeeper(hosts, timeoutMills, connWatcher);
// 等待连接完成
connectedSemaphore.await();
}
/**
* 关闭连接
*/
public void disconnect() throws InterruptedException {
if (zk != null) {
zk.close();
}
}
/**
* 创建节点
*
* @param path 节点路径
* @param data 初始数据
* @return 节点的路径
*/
public boolean createPath(String path, String data) throws KeeperException, InterruptedException {
return zk.create(path, data.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT) != null;
}
/**
* 读取指定节点数据
*
* @param path 节点路径
* @return 节点数据
*/
public String readData(String path) throws KeeperException, InterruptedException {
return new String(zk.getData(path, false, null));
}
/**
* 监听指定节点数据
*
* @param path 节点路径
* @return 节点数据
*/
public String watchData(String path) throws KeeperException, InterruptedException {
Stat stat = zk.exists(path, existsWatcher);
return new String(zk.getData(path, existsWatcher, stat));
}
/**
* 更新指定节点数据
*
* @param path 节点路径
* @param data 数据
* @return 是否更新成功
*/
public boolean writeData(String path, String data) throws KeeperException, InterruptedException {
return zk.setData(path, data.getBytes(), -1) != null;
}
/**
* 删除节点
*
* @param path 节点路径
*/
public void deletePath(String path) throws KeeperException, InterruptedException {
zk.delete(path, -1);
}
public static void main(String[] args) throws Exception {
String hosts = "192.168.3.4:2181,192.168.3.5:2181,192.168.3.6:2181";
String path = "/header";
int timeoutMills = 3000;
ZooKeeperService service = new ZooKeeperService(hosts, timeoutMills);
if (service.createPath(path, "I'm the initial data.")) {
System.out.println("数据: " + service.readData(path));
service.writeData(path, "I'm the updated data.");
System.out.println("数据: " + service.readData(path));
service.deletePath(path);
}
service.disconnect();
}
public static void mainWatch(String[] args) throws Exception {
String hosts = "192.168.3.4:2181,192.168.3.5:2181,192.168.3.6:2181";
String path = "/header";
int timeoutMills = 3000;
ZooKeeperService service = new ZooKeeperService(hosts, timeoutMills);
System.out.println(service.watchData(path));
System.in.read();
}
}
ZooKeeper(二)Java API使用的更多相关文章
- Linux -- 基于zookeeper的java api(二)
Linux -- 基于zookeeper的java api(二) 写一个关于基于集群的zookeeper的自定义实现HA 基于客户端和监控器:使用监控的方法查看每个注册过的节点的状态来做出操作. Wa ...
- Linux -- 基于zookeeper的java api(一)
Linux -- 基于zookeeper的java api 首先启动你所有的 zkService.sh 查看状态:检查是否启动正确 [root@hu-hadoop2 ~]# zkServer.sh s ...
- zookeeper的java api操作
zookeeper的java api操作 创建会话: Zookeeper(String connectString,int sessionTimeout,Watcher watcher) Zookee ...
- 【分布式】Zookeeper使用--Java API
一.前言 上一篇博客我们通过命令行来操作Zookeper的客户端和服务端并进行相应的操作,这篇主要介绍如何通过API(JAVA)来操作Zookeeper. 二.开发环境配置 首先打开Zookeeper ...
- 分布式服务管理zookeeper的java api
zookeeper是一个分布式服务管理工具,本身具备高可用性,很多知名分布式系统入hadoop.Hbase等都采用zk管理. 常见的两个应用场景:1.服务的注册与发现 2.集群统一配置 下面看一下使用 ...
- Zookeeper使用--Java API
1 创建节点 创建节点有异步和同步两种方式.无论是异步或者同步,Zookeeper都不支持递归调用,即无法在父节点不存在的情况下创建一个子节点,如在/zk-ephemeral节点不存在的情况下创建/ ...
- zookeeper的JAVA API使用
1.创建连接 2.创建节点 3.监听信息 Watcher.class 4.获取节点 Stat stat = new Stat(); zk.getData(Path,true,stat); 5.修改节点 ...
- zookeeper Java API 简单操作示例
本文主要介绍如何在java IDE中如何应用使用客户端与zookeeper服务器通信. 首先搭建maven环境,并在pom文件中加入zookeeper引用包: <!-- https://mvnr ...
- 使用Elasticsearch7 java api实现pdf全文检索
前提:pdf的内容是文字形式而不是图片形式! 一.方法 Elasticsearch实现pdf的全文检索,原理是将pdf转换为Base64,然后提取pdf的文字内容然后将其存储起来. Elasticse ...
随机推荐
- python学习之老男孩python全栈第九期_数据库day002 -- 作业 (数据库为day001创建的数据库)
1.自行创建测试数据 对score表进行优化: 添加数据: 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 为了方便做题,额外增加几条数据 查询: 3.查询平均成绩大于60分的同学的学号和 ...
- BZOJ3238: [Ahoi2013]差异(后缀自动机)
题意 题目链接 Sol 前面的可以直接算 然后原串翻转过来,这时候变成了求任意两个前缀的最长公共后缀,显然这个值应该是\(len[lca]\),求出\(siz\)乱搞一下 #include<bi ...
- Android技术博客精华汇总
MVC/MVP/MVVM/MVPVM 更好的架构设计 MVC,MVP 和 MVVM 的图示 http://www.apkbus.com/blog-822721-68034.html Android架构 ...
- HTTP请求封装:Ajax与RESTful API
一.HTTP请求 HTTP即超文本传输协议,用以进行HTML 文件. 图片文件. 查询结果等的网络传输. 一个完整的HTTP请求包括:请求行.请求头.空行和请求数据(请求数据可以为空) HTTP1.1 ...
- scp远程传输文件和ssh远程连接
ssh使用方法 如果从一台linux服务器通过ssh远程登录到另一台Linux机器, 这种情况通常会在多台服务器的时候用到. 如用root帐号连接一个IP为192.168.1.102的机器,输入:“ ...
- 使用Spring操作Redis的key-value数据
前言 最近工作一直忙的不可开交,小Alan已经很久没有和大家分享知识了,在深圳待了两年多,依然感觉自己还是个小菜鸟,工作中还是会遇到很多自己在短期内无法搞定的事情,每当这个时候总是会感觉到很沮丧,就会 ...
- 用NSOperation写下载队列
用NSOperation写下载队列 说明 1. 支持缓存机制 2. 图片都是在主线程中加载 3. 文件名用了md5加密 *这东西被人写烂了,但大伙如果对NSOperation不熟悉的话,可以看看本人的 ...
- 前端 网络三剑客之html 02
html 四.表单标签 form标签: input系列:内敛标签 1.明文: 姓名:<input type="text" name="user" plac ...
- 设置邮箱发送服务|邮箱开始SMTP服务和腾讯云解封25端口的经验总结
原文链接: http://www.lookdaima.com/WebForms/WebPages/Blanks/Pm/Docs/DocItemDetail.aspx?id=7dfaaf63-d36f- ...
- phpcas 整合 ecms的问题
如果有ecms整合phpCAS经验的小伙伴可以给我留言,有偿付费 需求是:ecms登录自动跳转到CAS认证(已完成),认证后直接跳转到帝国cms系统中,并保持帝国cms系统权限等都和以前一样 正常使用 ...