(7)zookeeper开源客户端zkclient使用介绍

本节介绍

通过之前的介绍,我们对于zookeeper的原生java api操作zookeeper节点数据的使用有了一定的了解,但是原生api会有一些缺点,在我们开发使用过程当中不是太方便,本节,将会给大家介绍两个开源客户端:zkclient,会跟原生的api做一个比较,并且会给出响应的代码案例,帮助大家更好的去了解使用这两个客户端。

zookeeper原生api的不足

介绍两个开源客户端之前,我们先来看下原生api的不足之处,去看看使用过程中的痛点在哪里,然后我们再拿两者跟原生做个对比,看下优势在哪里,实现了哪些原生api中没有实现的功能,这样对我们学习会更有帮助,也更加清晰一些。

1:创建节点时如果类似"/a/b/c"z这种,如果父节点不存在,会报错,需要自己递归创建去实现;如果节点已经存在,创建会出现异常

2:给节点设置数据的时候参数都是byte[]数组,使用不方便,而且没有提供对象的序列化

3:删除类似"/a/b/c"这种多级节点时必须要自己判断并进行递归删除,很不方便

4:注册的watcher都是一次性的,触发之后要重新注册,使用不便

5:没有实现session超时自动重连机制

6:各种异常种类繁多,不好处理

(吧啦吧吧啦吧啦吧啦)。。。。。。。。

ZkClient

1:介绍

Zkclient是Github上一个开源的Zookeeper客户端。Zkclient在Zookeeper原生 API接口之上进行了包装,是一个更加易用的Zookeeper客户端。同时Zkclient在内部实现了诸如Session超时重连,Watcher反复注册等功能。但是就是找不着什么API文档,但其实其API还是挺简单的,根据名字就大致知道是干什么的了,跟原生的还是挺像的。

2:使用方法

下面给出一个代码样例,由于代码中的注释写的比较清楚了,就不做过多解释了,直接上代码了

maven依赖如下

<dependency>
    <groupId>com.101tec</groupId>
    <artifactId>zkclient</artifactId>
    <version>0.10</version>
</dependency>
package com.wkp.test.zkclient;

import java.util.List;

import org.I0Itec.zkclient.IZkChildListener;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.IZkStateListener;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.ZkConnection;
import org.apache.zookeeper.Watcher.Event.KeeperState;

public class ZkClientTest {

	/** zookeeper地址 */
	static final String CONNECT_ADDR = "192.168.74.4:2181,192.168.74.5:2181,192.168.74.6:2181";
	/** session超时时间 */
	static final int SESSION_OUTTIME = 5000;//ms 
	
	
	public static void main(String[] args) throws Exception {
		//1 创建连接(有个构造方法可以传递一个ZkSerializer zkSerializer参数,可以自定义序列化h和反序列化实现)
//		new ZkClient(new ZkConnection(CONNECT_ADDR), 5000, zkSerializer);
		ZkClient zkc = new ZkClient(new ZkConnection(CONNECT_ADDR), 5000);
		
		//2 创建节点============================================
		//创建临时节点
		zkc.createEphemeral("/ephemeral", "临时节点");
		//创建持久化节点
		zkc.createPersistent("/persistent", "持久化节点");
		//第二个参数createParents==true,表示父节点不存在时创建父节点(递归创建)
		zkc.createPersistent("/a/b/c", true);
		
		//3 修改节点============================================
		zkc.writeData("/persistent", "修改的新内容");
		
		//4 判断节点是否存在============================================
		zkc.exists("/persistent");
		
		//5 删除节点============================================
		//删除单个节点
		zkc.delete("/persistent");
		//删除该节点及该节点下的所有节点(递归删除)
		zkc.deleteRecursive("/a");
		
		//6 读取子节点============================================
		zkc.createPersistent("/super", "1234");
		zkc.createPersistent("/super/c1", "c1内容");
		zkc.createPersistent("/super/c2", "c2内容");
		List<String> list = zkc.getChildren("/super");
		for(String p : list){
			System.out.println(p);
			String rp = "/super/" + p;
			String data = zkc.readData(rp);
			System.out.println("节点为:" + rp + ",内容为: " + data);
		}
		
		
		//7 对父节点添加监听子节点变化============================================
		zkc.subscribeChildChanges("/super", new IZkChildListener() {
			@Override
			public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
				System.out.println("parentPath: " + parentPath);
				System.out.println("currentChilds: " + currentChilds);
			}
		});
		
		//8 监听当前节点变化============================================
		zkc.subscribeDataChanges("/super", new IZkDataListener() {
			@Override
			public void handleDataDeleted(String path) throws Exception {
				System.out.println("删除的节点为:" + path);
			}
			
			@Override
			public void handleDataChange(String path, Object data) throws Exception {
				System.out.println("变更的节点为:" + path + ", 变更内容为:" + data);
			}
		});
		
		//9 监听连接状态变化============================================
		zkc.subscribeStateChanges(new IZkStateListener() {
			
			@Override
			public void handleStateChanged(KeeperState state) throws Exception {
				if(state==KeeperState.SyncConnected){
					//当我重新启动后start,监听触发
					System.out.println("连接成功");
				}else if(state==KeeperState.Disconnected){
					System.out.println("连接断开");//当我在服务端将zk服务stop时,监听触发
				}else
					System.out.println("其他状态"+state);
			}
			
			@Override
			public void handleSessionEstablishmentError(Throwable error)
					throws Exception {
				System.out.println("session创建出现异常,error:"+error.getMessage());
			}
			
			@Override
			public void handleNewSession() throws Exception {
				System.out.println("session过期后已经有新的session被创建");
			}
		});
		
		Thread.sleep(10000000);
	}
}

具体的运行效果我就不贴了,你可以自己运行一下,通过改变相应的节点观察一下对应的监听在控制台的输出,相信你应该已经掌握了ZkClient的使用方法了。下一节将会介绍一下另一个更好用的客户端curator的使用方法。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值