Java 连接 zookeeper
1.pom.xml
加入zookeeper
和zkClient
依赖,zookeeper本身自带问题:
- ZooKeeper的Watcher是一次性的,用过了需要再注册;
- session的超时后没有自动重连,生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显;
- 没有领导选举机制,集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果;
- 客户端只提供了存储byte数组的接口,而项目中一般都会使用对象。
- 客户端接口需要处理的异常太多,并且通常,我们也不知道如何处理这些异常。
I0Itec这个zookeeper客户端基本上解决了上面的所有问题,主要有以下特性:
- 提供了zookeeper重连的特性——能够在断链的时候,重新建立连接,无论session失效与否.
- 持久的event监听器机制—— ZKClient框架将事件重新定义分为了stateChanged、znodeChanged、dataChanged三种情况,用户可以注册这三种情况下的监听器(znodeChanged和dataChanged和路径有关),而不是注册Watcher。
- zookeeper异常处理——-zookeeper中繁多的Exception,以及每个Exception所需要关注的事情各有不同,I0Itec简单的做了封装。
- data序列化——简单的data序列化.(Serialzer/Deserialzer)
5)有默认的领导选举机制
但是zkClient
需要重写几个方法:
create
方法 : 创建节点时,如果节点已经存在,仍然抛出NodeExistException
,可是我期望它不在抛出此异常。retryUtilConnected
: 如果向zookeeper
请求数据时(create,delete,setData等)
,此时链接不可用,那么调用者将会被阻塞直到链接建立成功;不过我仍然需要一些方法是非阻塞的,如果链接不可用,则抛出异常,或者直接返回。create
方法 : 创建节点时,如果节点的父节点不存在,我期望同时也要创建父节点,而不是抛出异常。data
监测: 我需要提供一个额外的功能来补充watch
的不足,开启一个线程,间歇性的去zk server
获取指定的path
的data
,并缓存起来。归因与watch
可能丢失,以及它不能持续的反应znode
数据的每一次变化,所以只能手动去同步获取。
<!--zookeeper 移除日志-->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.1</version>
<exclusions>
<exclusion>
<artifactId>log4j</artifactId>
<groupId>log4j</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-log4j12</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
</exclusions>
</dependency>
<!--zkclient 移除zookeeper 和日志-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>