前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ZkClient使用

ZkClient使用

作者头像
shysh95
发布2019-07-24 14:52:24
1.3K0
发布2019-07-24 14:52:24
举报
文章被收录于专栏:shysh95

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

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

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

创建会话
代码语言:javascript
复制
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自带的序列化方式进行序列化和反序列化。
创建节点
代码语言:javascript
复制
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格式一致,而下面几种创建方式均将节点的类型隐藏在了方法名上,通过方法名就可以看出创建的节点的类型。

删除节点
代码语言:javascript
复制
public boolean delete(final String path)

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

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

读取子节点列表
代码语言:javascript
复制
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为当前子节点的名称(相对路径)列表,有可能为空的集合 (子节点都被删除的情况)
代码语言:javascript
复制
public interface IZkChildListener {

    public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception;
}
设置节点内容
代码语言:javascript
复制
public void writeData(String path, Object data)

public void writeData(final String path, Object data, final int expectedVersion)
  • path:数据节点完整几点的路径
  • data:要更新的数据内容
  • expectedVersion:基于哪个dataVersion进行变更,利用此属性进行CAS操作
读取节点内容
代码语言:javascript
复制
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方法
代码语言:javascript
复制
public interface IZkDataListener {

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

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

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

代码语言:javascript
复制
public boolean exists(final String path)
其他

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

代码语言:javascript
复制
public void subscribeStateChanges(final IZkStateListener listener)

public interface IZkStateListener {

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

    // 当一个会话过期重新新家会话的时候回调
    public void handleNewSession() throws Exception;
}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-05-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员修炼笔记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 创建会话
  • 创建节点
  • 删除节点
  • 读取子节点列表
  • 设置节点内容
  • 读取节点内容
  • 检测节点是否存在
  • 其他
相关产品与服务
文件存储
文件存储(Cloud File Storage,CFS)为您提供安全可靠、可扩展的共享文件存储服务。文件存储可与腾讯云服务器、容器服务、批量计算等服务搭配使用,为多个计算节点提供容量和性能可弹性扩展的高性能共享存储。腾讯云文件存储的管理界面简单、易使用,可实现对现有应用的无缝集成;按实际用量付费,为您节约成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档