专栏首页shysh95ZkClient使用

ZkClient使用

使用原生的Zookeeper API来与Zookeeper服务端进行交互还是比较繁琐复杂的,为了简化这些操作,就诞生了一些封装客户端。这些客户端除了简单易用,还增加了Session重连等一些特殊功能,比较知名的有ZkClient和Curator。

我们主要讲述ZkClient的使用,关于Curator的使用读者可以自行去了解。

ZkClient在原生的Zookeeper API接口上进行了包装,更加简单易用。ZkClient内部还实现了Session超时重连、Watcher反复注册等功能,使得这些操作对开发透明,提高了开发的效率。

创建会话

public ZkClient(String serverstring)

public ZkClient(String zkServers, int connectionTimeout)

public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout)

public ZkClient(String zkServers, int sessionTimeout, int connectionTimeout, ZkSerializer zkSerializer)

public ZkClient(IZkConnection connection)

public ZkClient(IZkConnection connection, int connectionTimeout)

public ZkClient(IZkConnection zkConnection, int connectionTimeout, ZkSerializer zkSerializer)
  • zkServers:Zookeeper的服务器列表,由,分割开的host:port字符串
  • sessionTimeout:会话超时时间,单位ms
  • connectionTimeout:连接超时时间,单位ms。在该时间内还未与Zookeeper建立连接,则放弃连接抛出异常
  • connection:IZkConnection接口的实现类,IZkConnection是对Zookeeper原生接口最直接的包装。IZkConnection有两种主要实现 ZkConnection和InMemoryConnection,最常用的就是ZkConnection
  • zkSerializer:自定义序列化器。Zookeeper支持byte[]类型的数据,因此需要开发人员自己定义序列化器,允许用户传入一个自定义的序列化实现,如Hessian,如果不传入默认使用Java自带的序列化方式进行序列化和反序列化。

创建节点

public String create(final String path, Object data, final CreateMode mode) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public void createEphemeral(final String path) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public void createEphemeral(final String path, final Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public String createEphemeralSequential(final String path, final Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public void createPersistent(String path) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public void createPersistent(String path, boolean createParents) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public void createPersistent(String path, Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException

public String createPersistentSequential(String path, Object data) throws ZkInterruptedException, IllegalArgumentException, ZkException, RuntimeException
  • path:创建的节点路径
  • data:创建的节点的数据内容
  • mode:节点的类型
  • createParents:是否创建子节点

上面第一种创建方式基本和原生的Zookeeper API格式一致,而下面几种创建方式均将节点的类型隐藏在了方法名上,通过方法名就可以看出创建的节点的类型。

删除节点

public boolean delete(final String path)

public boolean deleteRecursive(String path)
  • path:删除节点的路径

delete方法与deleteRecursive方法的区别是deleteRecursive方法可以在节点有子节点的情况下进行删除。

读取子节点列表

public List<String> getChildren(String path)

// 不再同一个包下无法调用
protected List<String> getChildren(final String path, final boolean watch)

public List<String> subscribeChildChanges(String path, IZkChildListener listener)
  • path:指定节点路径,获取该节点的子节点列表
  • watch:是否使用默认的Watcher

前两个方法是获取节点的子节点列表,最后一个方法相当于注册了一个Watcher,该方法与注册Watcher的区别是在注册的时候,节点可以不存在也可以监听 而且一次注册永久有效。IZkChildListener主要在以下事件发生时通知客户端:

  • path节点被新增时,parentPath为节点名称,currentChilds为空的集合
  • path节点被删除时,parentPath为节点名称,currentChilds为null
  • path节点有子节点被创建时,parentPath为节点名称,currentChilds为当前子节点的名称(相对路径)列表
  • path节点有子节点被删除时,parentPath为节点名称,currentChilds为当前子节点的名称(相对路径)列表,有可能为空的集合 (子节点都被删除的情况)
public interface IZkChildListener {

    public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception;
}

设置节点内容

public void writeData(String path, Object data)

public void writeData(final String path, Object data, final int expectedVersion)
  • path:数据节点完整几点的路径
  • data:要更新的数据内容
  • expectedVersion:基于哪个dataVersion进行变更,利用此属性进行CAS操作

读取节点内容

public <T extends Object> T readData(String path)

public <T extends Object> T readData(String path, boolean returnNullIfPathNotExists)

public <T extends Object> T readData(String path, Stat stat)

// 不再同一个包下无法调用
protected <T extends Object> T readData(final String path, final Stat stat, final boolean watch)

public void subscribeDataChanges(String path, IZkDataListener listener)
  • path:指定要读取的节点
  • returnNullIfPathNotExists:字面意思就可以理解,如果节点不存在返回null,而不是抛出异常
  • stat:指定数据节点的节点状态信息,在交互过程中,会被服务端响应的新stat替换

最后一个方法相当于注册一个Watcher,IZkDataListener主要在以下事件发生时通知客户端:

  • 节点内容发生变化时将会回调handleDataChange方法
  • 节点被删除时将会回调handleDataDeleted方法
public interface IZkDataListener {

    public void handleDataChange(String dataPath, Object data) throws Exception;

    public void handleDataDeleted(String dataPath) throws Exception;
}
  • dataPath:发生变化的节点的全路径名称
  • data:节点的新内容

检测节点是否存在

下面这个方法就不解释了,就是检测一个节点存不存在

public boolean exists(final String path)

其他

注册一个Watcher,用来监听当前客户端会话的状态变化,如果客户端会话状态发生变化,将会回调IZkStateListener中的方法

public void subscribeStateChanges(final IZkStateListener listener)

public interface IZkStateListener {

    // 会话状态发生变化时回调
    public void handleStateChanged(KeeperState state) throws Exception;

    // 当一个会话过期重新新家会话的时候回调
    public void handleNewSession() throws Exception;
}

本文分享自微信公众号 - shysh95(shysh95),作者:shysh95

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-05

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Zookeeper Java API

    本文主要讲解使用Java API来和Zookeeper集群进行交互,大家在看完这篇文章以后一定要亲自动手去敲代码(纸上得来终觉浅,绝知此事要躬行)。下面介绍的A...

    shysh95
  • Zookeeper Shell

    本文主要讲解使用Zookeeper自带的客户端zkCli.sh来进行一些Zookeeper的一些基本操作,如创建删除节点等。

    shysh95
  • 红黑树

    二叉查找树一种提高查询效率(O(logN))的二叉树,但是二叉查找树的查询效率在新节点不断的插入后查询效率有可能会退化为O(N),相关原因请查看这篇文章二叉树遍...

    shysh95
  • SpringBoot2 整合 Zookeeper组件,管理架构中服务协调

    知了一笑
  • 动物管理员 --- zookeeper

    简单地说就是管理员。有什么事它就会通知到所有被它管理的人。就比如宿舍管理员,宿舍要停电他就会发通知,然后所有住这栋楼的都会知道。说专业一点,它是由文件系统和通知...

    贪挽懒月
  • 小甲鱼《零基础学习Python》课后笔记(三十):文件系统——介绍一个高大上的东西

    动动手 0.编写一个程序,统计当前目录下每个文件类型的文件数,程序实现如图:

    小火柴棒
  • 快速学习Mybatis-自定义 Mybatis 框架

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明...

    cwl_java
  • ASP.Net MVC开发基础学习笔记:四、校验、AJAX与过滤器

      位于 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证。这些特性用于定义常见的验...

    Edison Zhou
  • Java每日一练(2017/7/5)

    1 (单选题)1、下面这三条语句 System.out.println(“is ”+ 100 + 5); System.out.println(100 + 5 ...

    Java学习
  • java:Exception的另类用途-利用异常代替if判断的例子

    版权声明:本文为博主原创文章,转载请注明源地址。 https://blog.csdn.net...

    用户1148648

扫码关注云+社区

领取腾讯云代金券