Zookeeper的原生api操作
Posted 微瞰技术
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Zookeeper的原生api操作相关的知识,希望对你有一定的参考价值。
pom文件引入
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
</dependencies>
几个状态和概念
节点创建的权限信息ACL 参数的类型
- ANYONE_ID_UNSAFE : 表示任何⼈
- AUTH_IDS :此ID仅可⽤于设置ACL。它将被客户机验证的ID替换。
- OPEN_ACL_UNSAFE :这是⼀个完全开放的ACL(常⽤)-->world:anyone
- CREATOR_ALL_ACL :此ACL授予创建者身份验证ID的所有权限
节点的几种类型的枚举 - PERSISTENT:持久节点
- PERSISTENT_SEQUENTIAL:持久顺序节点
- EPHEMERAL:临时节点
- EPHEMERAL_SEQUENTIAL:临时顺序节点
zookeeper原生api创建会话操作
public class CreateSession implements Watcher {
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException {
ZooKeeper zooKeeper = new ZooKeeper("119.45.52.68:2181",6000,new CreateSession());
System.out.println(zooKeeper.getState());
countDownLatch.await();
System.out.println("zk session create success");
}
@Override
public void process(WatchedEvent watchedEvent) {
if (watchedEvent.getState()==Event.KeeperState.SyncConnected){
countDownLatch.countDown();
}
}
}
正常创建回话
zookeeper原生api获取信息操作
public class getNoetNode implements Watcher {
private static ZooKeeper zooKeeper;
public static void main(String[] args) throws InterruptedException, IOException {
zooKeeper = new ZooKeeper("119.45.52.68:2181",10000,new getNoetNode());
//countDownLatch.await();
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
if(event.getType() ==Event.EventType.NodeChildrenChanged){
//再次获取子节点数据,监听子节点变化
try {
List<String> children =
zooKeeper.getChildren(event.getPath(), true);
System.out.println(children);
} catch (KeeperException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//当连接创建了,服务端发送给客户端SyncConnected事件
if(event.getState() == Event.KeeperState.SyncConnected){
try {
//调⽤获取单个节点数据⽅法
getNodeData();
getChildren();
} catch (Exception e) {
e.printStackTrace();
}
}
System.out.println();
}
private static void getNodeData() throws Exception {
byte[] data = zooKeeper.getData("/persistent/children", true,
null);
System.out.println(new String(data,"utf-8"));
}
public static void getChildren() throws Exception{
List<String> childrens = zooKeeper.getChildren("persistent",true);
System.out.println(childrens);
}
}
zookeeper原生api更新节点信息
public class UpdateNode implements Watcher {
private static ZooKeeper zooKeeper;
public static void main(String[] args) throws Exception{
zooKeeper = new ZooKeeper("119.45.52.68:2181",6000,new UpdateNode());
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
try {
byte[] before = zooKeeper.getData("/persistent/children",false,null);
System.out.println("修改前的值"+new String(before));
Stat stat = zooKeeper.setData("/persistent","客户端修改的内容".getBytes(),-1);
System.out.println(stat);
byte[] after = zooKeeper.getData("/persistent/children",false,null);
System.out.println("修改后的值"+new String(after));
}catch (Exception e){
e.printStackTrace();
}
}
}
zookeeper原生api删除节点信息
public class DeleteNode implements Watcher {
private static ZooKeeper zooKeeper;
public static void main(String[] args) throws Exception{
zooKeeper = new ZooKeeper("119.45.52.68:2181",6000,new UpdateNode());
Thread.sleep(Integer.MAX_VALUE);
}
@Override
public void process(WatchedEvent event) {
try {
Stat exists = zooKeeper.exists("/persistent/children", false);
System.out.println(exists == null ? "该节点不存在":"该节点存在");
zooKeeper.delete("/persistent/children",-1);
Stat exists2 = zooKeeper.exists("/persistent/children", false);
System.out.println(exists2 == null ? "该节点不存在":"该节点存在");
}catch (Exception e){
e.printStackTrace();
}
}
}
代码地址为https://github.com/zhendiao/deme-code/tree/main/zk
欢迎搜索关注本人与朋友共同开发的微信面经小程序【大厂面试助手】和公众号【微瞰技术】,以及总结的分类面试题https://github.com/zhendiao/JavaInterview
以上是关于Zookeeper的原生api操作的主要内容,如果未能解决你的问题,请参考以下文章
ZooKeeper客户端原生API的使用以及ZkClient第三方API的使用
Apache Curator操作zookeeper的API使用
Zookeeper系列三:Zookeeper客户端的使用(Zookeeper原生API如何进行调用ZKClientCurator)