I0Itec-zkClient小结

    zookeeper客户端目前社区中比较多,而且大家在使用zookeeper时或多或少都会自己"重复发明轮子";事实上apache zookeeper API也已经足够完善,我们自己封装client也是非常简单的工作;其实大家封装client,无外乎就是调整一些非常基本的功能.我们看看I0Itec能否满足我们的需要.

    I0Itec-zkClient并不是一个非常大众化的工具,也没有提供完美的功能列表;不过它的简单和已用对我们的一些常规应用,似乎已经足够了.I0Itec特性一览: 

    1) 提供了zookeeper断链重连的特性------这个特性似乎每个开发者都会设计,而且代码风格几乎"如出一辙"..在大部分zookeeper使用场景中,我们都要求它能够在断链的时候,重新建立连接,无论session失效与否.

    2) 便捷的event监听器机制-------向ZNODE节点注册watch,每个开发者都使用过,尽管watch机制并不能确保数据变更的实时性..watch-event属于"即发即失",因为我们需要得到event时候,再去注册一遍,这也是一个非常繁琐的事情,I0Itec-zkClient提供了event-listener的小技巧,可以帮助我们"解脱".

    3) zookeeper异常处理-------zookeeper中繁多的Exception,以及每个Exception所需要关注的事情各有不同,你应该记得那一堆try-catch给你带来的烦恼;I0Itec简单的做了封装.

    4) data序列化------简单的data序列化.(Serialzer/Deserialzer)

 

I0Itec-zkClient API

  • ZkConnection类: 对zookeeper API的简单分装,提供了链接zookeeper server和数据CRUD的操作;此类实现了IZkConnection接口,通常情况下,如果I0Itec-zkclient不能满足需要的时候,我们可以重写ZkConnection即可.
  • ZkClient类: 核心类,也是开发者需要直接使用的类,它内部维护了zookeeper的链接管理和Event处理逻辑等,同时也暴露了zookeeper znode的CRUD方法列表.
  • IZkChildListener接口: znode 子节点事件侦听器,当ZkClient接收到某个path节点变更或者子节点变更事件时,会触发lisntener.
  • IZkDataListener接口: 
  • IZkStateListener接口: 当zookeeper客户端状态变更时,触发.

I0Itect-zkClient暂时有几个方法需要重写:

    1) create方法:创建节点时,如果节点已经存在,仍然抛出NodeExistException,可是我期望它不在抛出此异常.

    2) retryUtilConnected: 如果向zookeeper请求数据时(create,delete,setData等),此时链接不可用,那么调用者将会被阻塞直到链接建立成功;不过我仍然需要一些方法是非阻塞的,如果链接不可用,则抛出异常,或者直接返回.

    3) create方法: 创建节点时,如果节点的父节点不存在,我期望同时也要创建父节点,而不是抛出异常.

    4) data监测: 我需要提供一个额外的功能来补充watch的不足,开启一个线程,间歇性的去zk server获取指定的path的data,并缓存起来..归因与watch可能丢失,以及它不能持续的反应znode数据的每一次变化,所以只能手动去同步获取.

 

I0Itect编程实践:

    1.pom.xml 

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>3.0.7.RELEASE</version>
</dependency>
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.5</version>
	<exclusions>
		<exclusion>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
		</exclusion>
	</exclusions>
</dependency>
<dependency>
	<groupId>com.101tec</groupId>
	<artifactId>zkclient</artifactId>
	<version>0.4</version>
</dependency>

 

    2.Java

ZkClient zkClient = new ZkClient("192.168.0.121:2181",3000);

zkClient.subscribeChildChanges("/worker",new IZkChildListener() {
	@Override
	public void handleChildChange(String parentPath, List<String> children) throws Exception {
		if(children == null){
			System.out.println("<" + parentPath + "> is deleted");
			return;
		}
		for(String child : children){
			System.out.println("<Child>:" + child);
		}
	}
});

   简单易用,值得试用. 

你可能感兴趣的:(client)