ZkClient在ZooKeeper原生API接口之上进行了包装,是一个更易用的ZooKeeper客户端。同时,ZkClient在内部实现了诸如Session超时重连、Watcher反复注册等功能,使得ZooKeeper客户端的这些繁琐的细节工作对开发人员透明。
Maven依赖
<dependencies>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<dependency>
</dependency><groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependencies>
创建会话
在ZkClient中,有如下7种构造方法:
- public ZkClient(String serverstring)
- public ZkClient(String zkServers, int connectionTimeout)
- public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)
- public ZkClient(String zkServers, int connectionTimeout)
- public ZkClient(String zkServers, int connectionTimeout, ZkSerializer zkSerializer)
- public ZkClient(IZkConnection connection)
- public ZkClient(IZkConnection connection, int connectionTimeout)
- public ZkClient(IZkConnection connection, int connectionTimeout, ZkSerializer zkSerializer)
ZkClient构造方法参数说明如下表所示。
参数名 说明 zkServers 指ZooKeeper服务器列表,由英文状态逗号分开的host:port字符串组成,每一个都代表一台ZooKeeper机器,例如,192.168.1.1:2181,192.168.1.2:2181,192.168.1.3:2181 sessionTimeout 会话超时时间,单位为毫秒。默认是30 000ms connectionTimeout 连接创建超时时间,单位为毫秒。此参数表明如果在这个时间段内还是无法和ZooKeeper建立链接,那么就放弃连接,直接抛出异常。 connection IZkConnection接口的实现类 zkSerializer 自定义序列化
注意,在ZkClient的构造方法中,很多参数和ZooKeeper原生的构造方法的参数一致。
使用ZooKeeper原生API创建会话的时候,“ZooKeeper会话的建立是一个异步的过程。”对于ZooKeeper客户端的这个特点,开发人员需要自己来进行等待处理。而ZkClient通过内部包装,将这个异步的会话创建过程同步化了,这对于开发者的使用来说非常方便。
org.IOItec.zkclient.IZkConnection接口是对ZooKeeper原生接口最直接的包装,也是和ZooKeeper最直接的交互层,里面包含了添、删、改、查等一系列接口的定义。ZkClient默认提供对IZkConnection接口的两种实现,分别是ZkConnection和InMemoryConnection,前者是我们最常用的实现方式。通常开发人员不需要对IZkConnection进行改造,直接使用ZkConnection这个实现就可以完成绝大部分的业务需求。
“目前,ZooKeeper的节点内容只支持字节数组(byte[])类型,也就是说,ZooKeeper不负责为节点内容进行序列化,开发人员需要自己使用序列化工具将节点内容进行序列化和反序列化。”ZkClient中定义了ZkSerializer接口,允许用户传入一个序列化实现,如Hessian或Kryo,默认情况下,ZkClient使用Java自带的序列化进行对象的序列化。注册完序列化器之后,客户端在进行读写操作的过程中,就会自动进行序列化和反序列化操作。
最后,我们再来看看ZkClient和ZooKeeper原生构造方法的最大区别,那就是在ZkClient的构造方法中,不再提供传入Watcher对象的参数了。那么,客户端如何去监听服务端的相关事件呢?别担心,ZkClient引入了大多数Java程序都使用过的Listener来实现Watcher注册。值得一提的是,ZkClient从API级别来支持Watcher监听的注册,这样的用法更贴近Java工程师的开发习惯。
使用ZkClient创建会话
// 使用ZkClient来创建一个ZooKeeper客户端
public class Create_Session_Sample {
public static void main(String[] args) throws IOException, InterruptedException {
ZkClient zkClient = new ZkClient("domain1.book.zookeeper:2181", 5000);
System.out.println("ZooKeeper session established.");
}
}
运行程序,输出结果如下:
上面这个示例程序展示了如何使用ZkClient来创建会话。