ZooKeeper的API操作(通俗易懂)
Posted 硝烟漫过十八岁
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ZooKeeper的API操作(通俗易懂)相关的知识,希望对你有一定的参考价值。
所需要6个jar包,都是解压zookeeper的tar包后里面的。
zookeeper-3.4.10.jar jline-0.094.jar log4j-1.2.16.jar
netty-3.10.5.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.1.jar
1.建立连接
/** * connectString : zk服务器连接ip和端口,多个用逗号隔开 * sessionTimeout : 连接超时时间 * watcher : 监听器(当被监控的节点发生改变时,zk会通过watcher传递给我们) */ #ZooKeeper zkCli = new ZooKeeper(connectString,sessionTimeout,watcher ); ZooKeeper zkCli = new ZooKeeper("192.168.199.15:2181,192.168.199.16:2181", 2000, new Watcher() { @Override public void process(WatchedEvent event) { System.out.println("节点:"+event.getPath()+"发生了事件:"+event.getType()); } });
2.创建节点
public void testCreateNode() throws Exception { /** * path :节点创建的路径 * data :节点创建要保存的数据,是个byte类型的 * acl :节点创建的权限信息(4种类型) * ANYONE_ID_UNSAFE : 表示任何人 * AUTH_IDS :此ID仅可用于设置ACL。它将被客户机验证的ID替换。 * OPEN_ACL_UNSAFE :这是一个完全开放的ACL(常用) * CREATOR_ALL_ACL :此ACL授予创建者身份验证ID的所有权限 * createMode :创建节点的类型(4种类型) * PERSISTENT:永久节点 * EPHEMERAL:临时节点 * PERSISTENT_SEQUENTIAL:永久节点、序列化 * EPHEMERAL_SEQUENTIAL:临时节点、序列化 */ # String node = zkCli.create(path,data,acl,createMode); String node_PERSISTENT = zkCli.create("/zpb", "zk创建节点".getBytes("utf-8"), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); String node_EPERSISTENT = zkCli.create("/zpb/zk", "2181".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL); System.out.println("创建的永久节点是:"+node_PERSISTENT); System.out.println("创建的临时节点是:"+node_EPERSISTENT); Thread.sleep(Long.MAX_VALUE); //查看临时节点时,防止zkCli退出 } 另:通过连接服务器端用命令查看结果:
备注:客户端创建永久节点时,zkCli 与服务端断开连接后,查看节点信息是存在的,反之临时节点与服务器断开连接后是不存在的
3.获取节点数据
public void getNodeData() throws Exception { /** * path : 获取数据的路径 * watch : 是否开启监听 * stat : 查看哪个版本的数据(节点上可能会保存多个版本的数据) * null: 表示获取最新版本的数据 * * */ #zkCli.getData(path, watch, stat); byte[] data = zkCli.getData("/zpb", true, null); System.out.println(new String(data,"utf-8")); }
4.修改节点数据
public void testUpdateNodeData() throws Exception { /** * path : 修改节点的路径 * data : 要修改的数据 * version :修改哪个版本的数据 * -1: 匹配所有版本 */ // zkCli.setData(path, data, version) ①详见建立连接; ②byte[] data = zkCli.getData("/zpb", true, null); System.out.println("修改之前的数据是:"+new String(data,"utf-8")); ③Stat setData = zkCli.setData("/zpb", "zk修改节点".getBytes("utf-8"), -1); ④data = zkCli.getData("/zpb", true, null); System.out.println("修改之后的数据是:"+new String(data,"utf-8")); } 输出的结果: 节点:null发生了事件:None 修改之前的数据是:zk创建节点 节点:/zpb发生了事件:NodeDataChanged 修改之后的数据是:zk修改节点 执行顺序: 在创建客户端成功后,有1个Watcher事件,然后打印输出,当zkCli获取数据时设置了监听该节点的数据true,接着输出修改之前的数据,当zkCli修改数据后,
负责监听的watcher事件被触发,zkCli再次获取修改后的数据,并再次设置监听
5.删除节点
public void testDel() throws Exception { // zkCli.delete(path, version); Stat exists_1 = zkCli.exists("/zpb", true); System.out.println(exists_1 == null ? "节点被删除了" : "节点没有被删除"); zkCli.delete("/zpb", -1); //-1表示匹配所有版本 Stat exists_2 = zkCli.exists("/zpb", true); System.out.println(exists_2 == null ? "节点被删除了" : "节点没有被删除"); }
以上是关于ZooKeeper的API操作(通俗易懂)的主要内容,如果未能解决你的问题,请参考以下文章