- 一:数据结构
![](https://i-blog.csdnimg.cn/blog_migrate/173263b6fa9cc3a3322f3a86d7034b53.png)
- 二:命令行的使用
可通过bin目录下”zkCli.cmd“进入zookeeper客户端命令行,可通过help进行客户端指令的查看
1:使用ls [path] watch 可查看当前znode中包含的内容
加 watch 可查看节点更改信息
例: ls /
2:通过ls2 [path] watch 查看当前节点数据并能看到更新次数等数据
加 watch 可查看节点更改信息
例:ls2 /
3:创建节点 create /[ptah]
例:create /test
创建成功
【注:我用的是win服务,课程老师使用linux,在创建时后面还需要指定内容,这个内容可以随便定义,
这里用ABC定义:create /test ABC】
4:获取节点的值 get [path] watch
加 watch 可查看节点更改信息
例:get /test (我这里没有设置值,,所以获取的是null)
5:设置节点的值:set [path] value
例:set /test insert
6:查看节点状态:stat [path]
例:stat /test
7删除节点:delete [ptah]
例:delete /test
删除之后进行查看已经没有
8:递归节点删除:rmr [path]
例:rmr /test
我先在test下创建testNode节点,节点下有数据,用delete是无法删除的,现在使用递归节点删除
- 三:api的使用
新建一个测试项目,导入maveny依赖导入
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
新建测试类进行测试
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Test;
import java.io.IOException;
import java.util.List;
public class ZkApi {
@Test
public void test() throws IOException, KeeperException, InterruptedException {
/* 1。创建zookeeper链接
ZooKeeper zk = new ZooKeeper(String connectString, int sessionTimeout,Watcher watcher)
创建zookeeper连接,connectString表示连接的zookeeper服务器的
地址,sessionTimeOut指定会话的的超时时间,Watcher配置监听*/
ZooKeeper zk=new ZooKeeper("localhost:2181", 2000, new Watcher() {
public void process(WatchedEvent watchedEvent) {
System.out.println("触发了:"+watchedEvent.getType()+"的事件");
}
});
//2创建父节点
/* String create(String path, byte[] data, List acl,CreateMode createMode)
创建一个给定的目录节点 path, 并给它设置数据,CreateMode 标识有
四种形式的目录节点,分别是 PERSISTENT:持久化目录节点,这个目
录节点存储的数据不会丢失;PERSISTENT_SEQUENTIAL:顺序自动编
号的目录节点,这种目录节点会根据当前已近存在的节点数自动加 1,
然后返回给客户端已经成功创建的目录节点名;EPHEMERAL:临时目
录节点,一旦创建这个节点的客户端与服务器端口也就是 session 超
时,这种节点会被自动删除;EPHEMERAL_SEQUENTIAL:临时自动编号节点*/
//path,节点名称,value:节点值,权限,节点类型
String node =zk.create("/nodeName","nodeValue".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("节点:"+node);
//3创建子节点
//创建子节点时,关闭父节点的创建
String childNode =zk.create("/nodeName/childNodeName","childNodeValue".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("节点:"+childNode);
//4获取节点中的值
/*byte[] getData(String path, boolean watch,Stat stat)
获取这个 path 对应的目录节点存储的数据,数据的版本等信息可以通
过 stat 来指定,同时还可以设置是否监控这个目录节点数据的状态*/
byte [] nodes =zk.getData("/nodeName",false,null);
System.out.println("节点值:"+new String(nodes));
List<String> cildnodes =zk.getChildren("/nodeName",false);
for (String str:cildnodes){
System.out.println("子节点值:"+new String(str));
}
//5修改节点的值
/*Stat setData(String path, byte[] data, int version)
给 path 设置数据,可以指定这个数据的版本号,如果 version 为 -1
怎可以匹配任何版本*/
Stat stat =zk.setData("/nodeName","updateNodeValue".getBytes(),-1);
System.out.println("更改节点值状态:"+stat);
//6.判断某个节点是否存在
/*Stat exists(String path,Watcher watcher)
重载方法,这里给某个目录节点设置特定的 watcher,Watcher 在
ZooKeeper 是一个核心功能,Watcher 可以监控目录节点的数据变化
以及子目录的变化,一旦这些状态发生变化,服务器就会通知所有设置
在这个目录节点上的 Watcher,从而每个客户端都很快知道它所关注
的目录节点的状态发生变化,而做出相应的反应*/
Stat existsStat =zk.exists("/nodeName/childNodeName",false);
System.out.println("判断节点是否存在状态:"+existsStat);
//7。删除节点
zk.delete("/nodeName/childNodeName",-1);
}
}
常见问题:
问题:在创建节点时报错:java.lang.IllegalArgumentException: Path must start with / character
![](https://i-blog.csdnimg.cn/blog_migrate/3f9141bf46e44497672c26b55c609bda.png)