文章13 | 阅读 5141 | 点赞0
上两篇文章对zookeeper的原生java api调用进行了学习。能够对zookeeper的tree数据节点进行新增,删除,修改数据等操
作,认真的童鞋会发现zookeeper原生提供的api调用比较麻烦,会有如下缺点:
1.session会话超时断开
2.监听机制watch只适用于一次,需用户反复注册
为了简化api开发,并优化相关功能,提供一个更加简易的客户端,目前较为通用的有zkClient和curator客户端。
ZkClient是Github上的一个开源Zookeeper客户端,是由Datameer工程师Stefan Groschupf和Peter Voss一起开发。
Curator是Netflix公司由Jordan Zimmerman开源的一套Zookeeper客户端框架。Curator解决除了ZkClient提供的功能外,新增如下功能:
1)提供了一套Fluent风格的客户端API框架。
2)提供了各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计数器)的抽样封装
下面我们对两个客户端操作分别进行讲解和学习
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.2</version>
</dependency>
package com.szwn.cli;
import org.I0Itec.zkclient.ZkClient;
public class Create_Node_Sample {
public static void main(String[] args) throws Exception {
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000);
String path = "/zk-client/c1";
// 创建持久化节点,第二个参数为是否创建父节点
zkClient.createPersistent(path, true);
// zkClient.createEphemeral(path);
// zkClient.createPersistentSequential(path,"123".getBytes());
System.out.println("success create znode.");
}
}
package com.szwn.cli;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
public class Get_Data_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-getData";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000);
// 创建临时节点,路径为path,数据为123
zkClient.createEphemeral(path, "123");
// 发布订阅模式,订阅给data监听器
zkClient.subscribeDataChanges(path, new IZkDataListener() {
// 处理数据删除事件
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("Node " + dataPath + " deleted.");
}
// 处理数据改变事件
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println("Node " + dataPath + " changed, new data: " + data);
}
});
// 获取数据
System.out.println(zkClient.readData(path));
// 修改数据
zkClient.writeData(path, "456");
Thread.sleep(1000);
// 删除节点
zkClient.delete(path);
Thread.sleep(Integer.MAX_VALUE);
}
}
package com.szwn.cli;
import org.I0Itec.zkclient.ZkClient;
import org.apache.zookeeper.data.Stat;
public class Set_Data_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-setData";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 2000);
// 创建临时节点,路径为path,数据为1
zkClient.createEphemeral(path, 1);
// 修改数据
Stat stat = zkClient.writeData(path, 2);
System.out.println(stat.getVersion());
// 按照版本号修改数据
Stat stat1 = zkClient.writeData(path, 3, -1);
System.out.println(stat1.getVersion());
}
}
package com.szwn.cli;
import java.util.List;
import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.ZkClient;
public class Get_Children_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-getChildren";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000);
// 发布订阅模式,子节点变化监听
zkClient.subscribeChildChanges(path, new IZkChildListener() {
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println(parentPath + " 's child changed, currentChilds:" + currentChilds);
}
});
// 创建持久节点
zkClient.createPersistent(path);
Thread.sleep(1000);
// 创建子节点
zkClient.createPersistent(path + "/c1");
Thread.sleep(1000);
// 删除子节点
zkClient.delete(path + "/c1");
Thread.sleep(1000);
// 删除节点
zkClient.delete(path);
Thread.sleep(Integer.MAX_VALUE);
}
}
package com.szwn.cli;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.data.Stat;
public class Set_Param_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-setAuth";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 2000);
// 创建临时节点,路径为path,数据为1
zkClient.createEphemeral(path, 1);
// 设置序列化器
zkClient.setZkSerializer(new SerializableSerializer());
// 设置shutDown客户端连接
zkClient.setShutdownTrigger(true);
}
}
package com.szwn.cli;
import org.I0Itec.zkclient.ZkClient;
public class Exist_Node_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-exist";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 2000);
// 节点存在
System.out.println("Node " + path + " exists " + zkClient.exists(path));
}
}
package com.szwn.cli;
import org.I0Itec.zkclient.ZkClient;
import java.util.List;
public class Del_Data_Sample {
public static void main(String[] args) throws Exception {
String path = "/zk-client-delete";
// 直接new ZkClient创建客户端连接,参数分别为服务器连接地址,集群用逗号隔开
ZkClient zkClient = new ZkClient("127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183", 5000);
zkClient.createPersistent(path, "");
// 创建子节点
zkClient.createPersistent(path+"/c1", "");
List<String> children = zkClient.getChildren(path);
System.out.println(children);
// 递归删除
zkClient.deleteRecursive(path);
System.out.println("success delete znode.");
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/qq_33513250/article/details/102368161
内容来源于网络,如有侵权,请联系作者删除!