5 java操作zookeeper
5 java操作zookeeper
本文使用java操作zookeeper都是在集群环境下进行的
- 创建一个Maven工程
- 添加pom文件
<dependencies>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
-
在resources下创建log4j.properties
log4j.rootLogger=INFO, stdout log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n log4j.appender.logfile=org.apache.log4j.FileAppender log4j.appender.logfile.File=target/zk.log log4j.appender.logfile.layout=org.apache.log4j.PatternLayout log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
1 创建ZooKeeper客户端
一定要仔细比对集群的ip
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class TestZk {
// 集群ip
private String connectString = "192.168.77.128,192.168.77.129,192.168.77.130";
// session超时时间 60s
private Integer sessionTimeout = 60 * 1000;
ZooKeeper zkClient;
// 连接集群
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {// 监听器
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("监听到了");
}
});
}
}
出现绿色说明连接成功了
创建节点
- 一个ACL对象就是一个Id和permission对
- 表示哪个/哪些范围的Id(Who)在通过了怎样的鉴权(How)之后,就允许进行那些操作
(What):Who How What; - permission(What)就是一个int表示的位码,每一位代表一个对应操作的允许状态。
- 类似linux的文件权限,不同的是共有5种操作:CREATE、READ、WRITE、DELETE、
ADMIN(对应更改ACL的权限)- OPEN_ACL_UNSAFE:创建开放节点,允许任意操作 (用的最少,其余的权限用的很
少) - READ_ACL_UNSAFE:创建只读节点
- CREATOR_ALL_ACL:创建者才有全部权限
- OPEN_ACL_UNSAFE:创建开放节点,允许任意操作 (用的最少,其余的权限用的很
- 表示哪个/哪些范围的Id(Who)在通过了怎样的鉴权(How)之后,就允许进行那些操作
@Before
public void init() throws IOException{
// 省略...
}
// 创建节点
@Test
public void createNode() throws InterruptedException, KeeperException {
String node = zkClient.create(
"/look",
"你好Look".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE,
CreateMode.PERSISTENT);
// 参数1:要创建的节点的路径
// 参数2:节点数据
// 参数3:节点权限
// 参数4:节点的类型
System.out.println("node = " + node);
}
查询节点的值
// 获取节点值
@Test
public void getNodeData() throws InterruptedException, KeeperException {
byte[] clientData = zkClient.getData("/look", false, new Stat());
System.out.println("clientData = " + new String(clientData));
}
修改节点的值
// 修改节点值
@Test
public void updateNodeData() throws InterruptedException, KeeperException {
Stat stat = zkClient.setData("/look", "你好 架构师".getBytes(), 0);
System.out.println("stat = " + stat);
}
删除节点
// 删除节点
@Test
public void deleteNodeData() throws InterruptedException, KeeperException {
zkClient.delete("/look", 1);
System.out.println("删除成功!");
}
获取子节点
获取子节点 // 获取子节点
@Test
public void getChildren() throws InterruptedException, KeeperException {
List<String> children = zkClient.getChildren("/china", false);// false:不监听
children.forEach(System.out::println);
}
监听子节点的变化
// 监听子节点的变化
@Test
public void getChildren1() throws Exception {
List<String> children = zkClient.getChildren("/", true);// true:注册监听
children.forEach(System.out::println);
// 让线程不停止,等待监听的响应
System.in.read();
}
- 程序在运行的过程中,我们在linux下创建一个节点
- IDEA的控制台就会做出响应:NodeChildrenChanged--/
判断Znode是否存在
// 判断Znode是否存在
@Test
public void exist() throws Exception {
Stat stat = zkClient.exists("/look-word", false);
System.out.println(stat == null ? "不存在" : "存在");
}