五.Java访问Zookeeper
Java操作的是Zookeeper客户端
因此,使用Java访问Zookeeper的时候
其服务器必须处于启动状态
1.POM依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency>
2.常用API
-
连接服务器
new ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
- 创建Zookeeper客户端对象
- connectString:需要连接的Zookeeper服务器的ip与端口
- sessionTimeout:超时时间,单位毫秒
- watcher:监控
- Zookeeper依赖提供了对应Watcher,其实一个接口
- 传递其对应的实现类即可
ZooKeeper zk = new ZooKeeper("127.0.0.1:2181",3000,new MyWatcher());
-
获取指定节点下的子节点信息
- 相当于
ls path
命令 getChildren(String path, boolean watch)
- path:指定的节点路径
- watch:是否监听
List<String> children = zkCli.getChildren("/", false); System.out.println(children);
- 相当于
-
创建节点
- 相当于
create [-s] [-e] path 节点内容
命令 create(final String path, byte data[], List<ACL> acl,CreateMode createMode)
- path:节点路径
- data:节点的数据
- acl:权限的设置,可以通过ZooDefs常量接口选择需要的值
- OPEN_ACL_UNSAFE表示权限完全开放
- createMode:节点的类型
- CreateMode是一个枚举类型
- 提供了四种节点类型
PERSISTENT
:持久化节点PERSISTENT_SEQUENTIAL
:持久化顺序编号节点EPHEMERAL
:临时节点EPHEMERAL_SEQUENTIAL
:临时顺序编号节点
zkCli.create("/node1","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); zkCli.create("/node","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL); zkCli.create("/temp1","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); zkCli.create("/temp","Hello Zookeeper".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
- 相当于
-
获取指定节点下的数据
- 相当于
get path
命令 byte[] getData(String path, boolean watch, Stat stat)
- path:表示指定的节点路径
- watch:是否监听
- Stat:用于接收返回的详细信息
- 如果只需要返回数据,则该值可以为null
// 获取指定节点的数据 byte[] data = zkCli.getData("/node1", false, null); System.out.println(new String(data)); // 获取详细信息 Stat stat = new Stat(); byte[] data = zkCli.getData("/node1", false, stat); System.out.println("节点内容:"+new String(data)); // 此时返回值仍然是节点内容 // 返回的详细信息自动设置到参数Stat中 // 可以从stat中获取对应的信息 System.out.println(stat.getCzxid()); System.out.println(stat.getDataLength());
- 相当于
-
修改指定的节点
- 相当于
set path 节点内容
命令 setData(final String path, byte data[], int version)
- path:指定节点路径
- data:节点内容
- version:子节点变化版本号
- 每次被修改,该版本均会发生变化
- 对应的是详细信息对象Stat中的cversion
- 可以通过Stat对象获取到对应的版本号
- -1表示从未被修改
// 修改节点信息 // 该方式需要先查询对应的Stat才能使用 zkCli.setData("/node1","Hello World".getBytes(),stat.getCversion()); // 该方式可以直接使用 zkCli.setData("/node1","Hello World".getBytes(),-1);
- 相当于
-
删除指定的子节点
- 相当于
delete path
命令 delete(final String path, int version)
- path:指定节点路径
- version:子节点变化版本号
zkCli.delete("/node1",-1);
- 相当于
-
判断指定节点是否存在
Stat exists(String path, boolean watch)
- path:节点路径
- watch:是否监听
- 返回值为Stat
- 如果该节点不存在则返回null
- 如果该节点存在,则返回对应的详细信息
// 判断指定节点是否存在 Stat stat = zkCli.exists("/node1", false); System.out.println(stat);
1",“Hello World”.getBytes(),stat.getCversion());
// 该方式可以直接使用
zkCli.setData("/node1",“Hello World”.getBytes(),-1);
+ 删除指定的子节点
+ 相当于`delete path`命令
+ `delete(final String path, int version)`
+ path:指定节点路径
+ version:子节点变化版本号
```java
zkCli.delete("/node1",-1);
-
判断指定节点是否存在
Stat exists(String path, boolean watch)
- path:节点路径
- watch:是否监听
- 返回值为Stat
- 如果该节点不存在则返回null
- 如果该节点存在,则返回对应的详细信息
// 判断指定节点是否存在 Stat stat = zkCli.exists("/node1", false); System.out.println(stat);