ZooKeeper API的基础知识
与ZooKeeper集合进行交互的应用程序称为 ZooKeeper客户端或简称客户端。 Znode是ZooKeeper集合的核心组件,ZooKeeper API提供了一小组方法使用ZooKeeper集合来操纵znode的所有细节。
客户端应该遵循以步骤,与ZooKeeper集合进行清晰和干净的交互。
- 连接到ZooKeeper集合。ZooKeeper集合为客户端分配会话ID。
- 定期向服务器发送心跳。否则,ZooKeeper集合将过期会话ID,客户端需要重新连接。
- 只要会话ID处于活动状态,就可以获取/设置znode。
- 所有任务完成后,断开与ZooKeeper集合的连接。如果客户端长时间不活动,则ZooKeeper集合将自动断开客户端。
ZooKeeper API的核心部分ZooKeeper类
本章中最重要的一组ZooKeeper API。ZooKeeper API的核心部分是ZooKeeper类。它提供了在其构造函数中连接ZooKeeper集合的选项,并具有以下方法:
- connect - 连接到ZooKeeper集合
- create- 创建znode
- exists- 检查znode是否存在及其信息
- getData - 从特定的znode获取数据
- setData - 在特定的znode中设置数据
- getChildren - 获取特定znode中的所有子节点
- delete - 删除特定的znode及其所有子项
- close - 关闭连接
maven引一下
代码语言:javascript复制 <dependencies>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<type>pom</type>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<!--<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.2.0</version>
</dependency>
-->
</dependencies>
1.构造创发建立连接
ZooKeeper类通过其多种构造函数提供connect功能。如下 : ZooKeeper(String connectionString, int sessionTimeout, Watcher watcher)
- connectionString - ZooKeeper集合主机,多个主机之间以逗号进行分割eg:"ip1:2181,ip2:2181,ip3:2181"。
- sessionTimeout - 会话超时(以毫秒为单位)。
- watcher - 实现“监视器”界面的对象。ZooKeeper集合通过监视器对象返回连接状态。
这里用watcher结合countDownLatch做了一个计数,阻塞主线程直至连接上并减计数器countDownLatch,当连接建立成功后才进行打印当前连接状态.
代码语言:javascript复制private static void getZkConection() {
CountDownLatch countDownLatch=new CountDownLatch(1);
String connection="ip:port";
try {
zooKeeper=new ZooKeeper(connection, 4000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState()==Event.KeeperState.SyncConnected){
countDownLatch.countDown();
}
}
});
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void closeZkConnection(){
try {
zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
Zookeeper的增删改查
1.create--创建Znode
ZooKeeper类提供了在ZooKeeper集合中创建一个新的znode的create方法。 create 方法的签名如下: create(String path, byte[] data, List<ACL> acl, CreateMode createMode)
- path - Znode路径。例如,/myapp1,/myapp2,/myapp1/mydata1
- data - 要存储在指定znode路径中的数据
- acl - 要创建的节点的访问控制列表。ZooKeeper API提供了一个静态接口 ZooDefs.Ids 来获取一些基本的acl列表。例如,ZooDefs.Ids.OPEN_ACL_UNSAFE返回打开znode的acl列表。
- createMode - 节点的类型,即临时,顺序,持久等。这是一个枚举。
private static void createZkMode() {
try {
zooKeeper.create("/test2", "JavaApiTest".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
结果
2 . Exists-- 检查Znode的存在返回一个结点信息stat
ZooKeeper类提供了 exists 方法来检查znode的存在。如果指定的znode存在,则返回一个znode的元数据。exists方法的签名如下:
exists(String path, boolean watcher)
- path- Znode路径
- exists(String path, boolean watcher) watcher - 布尔值,用于指定是否监视指定的znode
private static void checkZnode(String s) {
try {
Stat stat = zooKeeper.exists(s, true);
if (stat==null){
System.out.println("结点为空");
}else {
System.out.println("结点存在,且当前结点的版本为:" stat.getVersion() "创建时间为:" stat.getCtime());
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
结果
3 . getData方法--获取数据值以及结点信息stat
ooKeeper类提供 getData 方法来获取附加在指定znode中的数据及其状态。 getData 方法的签名如下:
getData(String path, Watcher watcher, Stat stat)
- path - Znode路径。
- watcher - 监视器类型的回调函数。当指定的znode的数据改变时,ZooKeeper集合将通过监视器回调进行通知。这是一次性通知。[可Null]
- stat - 返回znode的元数据。[可Null]
private static void getZnodeData(String path) {
try {
byte[] data = zooKeeper.getData(path, null, null);
System.out.print("该结点值为" new String(data));
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
setData-- 更改结点值
ZooKeeper类提供 setData 方法来修改指定znode中附加的数据,并且也可以返回一个修改后的stat值。 setData 方法的签名如下:
setData(String path, byte[] data, int version)
- path- Znode路径
- data - 要存储在指定znode路径中的数据。
- version- znode的当前版本。每当数据更改时,ZooKeeper会更新znode的版本号。
private static void setZnode(String path) {
try {
Stat stat = zooKeeper.exists(path, false);
if (stat==null){
System.out.println("Znode does not exist");
}else {
System.out.println("老版本为" stat.getVersion());
Stat newStat = zooKeeper.setData(path, "newValue".getBytes(), stat.getVersion());
System.out.println("新版本为" newStat.getVersion());
getZnodeData(path);
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
delete -- 删除Znode
delete(String path, int version)
- path - Znode路径。
- version - znode的当前版本
private static void deleteZnode(String path)
{
try {
Stat stat = zooKeeper.exists(path, false);
if (stat==null){
System.out.println("Znode does not exist");
}else {
zooKeeper.delete(path,stat.getVersion());
}
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
传的path为"test2,已经没了"
getChildren 获取特定znode的所有子节点
ZooKeeper类提供 getChildren 方法来获取特定znode的所有子节点。 getChildren 方法的签名如下:
getChildren(String path, Watcher watcher)
- path - Znode路径。
- watcher - 监视器类型的回调函数。当指定的znode被删除或znode下的子节点被创建/删除时,ZooKeeper集合将进行通知。这是一次性通知。[可null]
private static void getZnodeChild(String path) throws KeeperException, InterruptedException {
Stat stat = zooKeeper.exists(path, null);
if (stat==null){
System.out.println("Znode does not exist");
}else {
List<String> list = zooKeeper.getChildren(path, null);
for(int i=0;i<list.size();i ){
System.out.println(list.get(i));
}
}
}