一、简介
上一节提到,在使用ZooKeeper的原生API时,经常需要处理几个问题:重复注册watcher、session失效重连、异常处理(删除节点不能有子节点,新增节点必须有父节点等),这使得实际使用中比较繁琐。zkclient是Github上一个开源的Zookeeper客户端,在Zookeeper原生 API接口之上进行了包装,是一个更加易用的Zookeeper客户端。同时Zkclient在内部实现了诸如Session超时重连,Watcher反复注册等功能,程序员开发的时候就可以不 用考虑这些小的细节,从而提高开发效率。

二、zkClient的基本操作

在使用zkClient操作Zookeeper时,基本的操作都封装在ZkClient类中,使用时直接创建ZkClient对象,调用其相应的方法即可。

1)创建连接

直接在ZkClient的构造函数中指定连接参数,完成对象创建后连接也就已经创建好。在ZkClient中提供了以下几个构造函数:

  • public ZkClient(String serverstring)
  • public ZkClient(String zkServers, int connectionTimeout)
  • public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)
  • ZkClient(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer)
  • ppublic ZkClient(final String zkServers, final int sessionTimeout, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)
  • public ZkClient(IZkConnection connection)
  • public ZkClient(IZkConnection connection, int connectionTimeout)
  • public ZkClient(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer)
  • public ZkClient(final IZkConnection zkConnection, final int connectionTimeout, final ZkSerializer zkSerializer, final long operationRetryTimeout)

构造器参数的含义如下:

  •  serverstring 可以指定单个服务器地址也可以是多个,这个和原 API 创建连接构造参数是一样的含义。
  •  connectionTimeout,sessionTimeout 是连接超时时间和会话超时时间。单位都是毫秒,其中会话默认是 30000 毫秒,也就是 30 秒。
  •  connection 是 IZkConnection 的接口实现类。
  •  zkSerializer 自定义的序列化器。
  • operationRetryTimeout 是在与服务连接断开后,进行重试操作的最长时间。也就是说,如果断开时间未超过operationRetryTimeout,则所有操作进行重试。operationRetryTimeout单位也是毫秒,如果传入小于0的值,则一直进行操作重试,直至与服务的连接恢复。

2)创建节点

  •  String create(final String path,Object data,final CreateMode mode)
  •  String create(final String path,Object data,final List<ACL> acl,final CreateMode mode)
  •  void create(final String path,Object data,final CreateMode mode,final AsyncCallback.StringCallback callback,final Object data)
  •  void createEphemeral(final String path)
  •  void createEphemeral(final String path,final Object data)
  •  void createPersistent(String path)
  •  void createPersistent(String path,boolean createParents)
  •  void createPersistent(String path,Object data)
  •  void createPersistent(String path,List<ACL> acl,Object data)
  •  void createPersistentSequential(String path,Object data)
  •  void createEphemeralSequential(final String path,final Object data)

 创建节点和原生 API 相比,原生只能传 byte 数组,这里可以传 Object。而且父节点不存在可以指定是否创建。

3)删除节点

  •  boolean delete(final String path)
  •  delete(final String path,final AsyncCallback.VoidCallback callback,final Object context)
  •  boolean deleteRecursive(String path)

说一下 deleteRecursive,原生 API 删除节点如果有子节点则必须把子节点都删掉才可以,这里的函数则不需要,它会自动删除所有的子节点。

 4)读取数据

 (一)、getChildren

  •  List<String> getChildren(String path)

 (二)、getData

  •  <T extends Object> T readData(String path)
  •  <T extends Object> T readData(String path,boolean returnNullIfPathNotExists)
  •  <T extends Object> T readData(String path,Stat stat)

这里说一下 returnNullIfPathNotExists,原生 API 读取数据,如果 path 不存在就会报错,这里设置 returnNullIfPathNotExists 为 true 则不会报错,会返回 null。

 5)更新数据

  •  void writeData(String path,Object data)
  •  void writeData(final String path,Object data,final int expectedVersion)

 6)检测节点是否存在

  •  boolean exists(final String path)

三、zkClient的事件监听机制

在原生Zk API中,提供了watcher的机制监听节点,而zkClient将之转换成Listener的概念,就是订阅服务端的事件,从而我们只要实现IZkChildListener 接口相应的方法就能够对事件进行处理。

订阅/取消订阅节点子变化事件

  • public List<String> subscribeChildChanges(String path, IZkChildListener listener)
  • public void unsubscribeChildChanges(String path, IZkChildListener childListener)

订阅/取消订阅数据变化事件

  • public void subscribeDataChanges(String path, IZkDataListener listener)
  • public void unsubscribeDataChanges(String path, IZkDataListener dataListener)

订阅/取消订阅连接状态变化事件

  • public void subscribeStateChanges(final IZkStateListener listener)
  • public void unsubscribeStateChanges(IZkStateListener stateListener)

取消所有订阅事件

  • public void unsubscribeAll()

此外,zkClient还对权限控制等进行了封装,关于Zookeeper的权限控制,我们明天再进行学习。更详细的API可以直接阅读ZkClient类的源码:https://github.com/sgroschupf/zkclient/blob/master/src/main/java/org/I0Itec/zkclient/ZkClient.java

参考:

Zookeeper 客户端 ZkClient https://www.cnblogs.com/xums/p/7220449.html

zookeeper学习之zkclient事件监听 https://my.oschina.net/u/2277632/blog/1532162

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐