zookeeper java api 操作(三) | zkclient

x33g5p2x  于2021-12-20 转载在 其他  
字(5.3k)|赞(0)|评价(0)|浏览(362)

一、概述

上两篇文章对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选举机制和分布式计数器)的抽样封装

下面我们对两个客户端操作分别进行讲解和学习

二、pom 依赖

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.2</version>
</dependency>

三、ZkClient

** 1.创建节点**

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.");
    }
}

** 2.获取数据** 

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);
	}
}

3.设置数据

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());
    }
}

4.获取子节点

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);
	}
}

5.设置参数

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);
    }
}

6.节点存在

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));
	}
}

7.删除节点

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.");
    }
}

相关文章