`
fantaxy025025
  • 浏览: 1309460 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类

Zookeeper客户端库ZkClient

 
阅读更多

 

Zookeeper客户端库ZkClient

序言

直接使用zookeeper的api实现业务功能比较繁琐。因为要处理session loss,session expire等异常,在发生这些异常后进行重连。又因为ZK的watcher是一次性的,如果要基于wather实现发布/订阅模式,还要自己包装一下,将一次性订阅包装成持久订阅。另外如果要使用抽象级别更高的功能,比如分布式锁,leader选举等,还要自己额外做很多事情。这里介绍下ZK的第三方客户端包装小工具,可以分别解决上述小问题。

在使用ZooKeeper过程中发现,用原生方法实现某些业务功能很麻烦
例如:
1)如何实现持久的Watcher注册
ZooKeeper的Watcher是一次性的,用过了需要再注册;
2)如何解决session的超时问题
生产环境中如果网络出现不稳定情况,那么这种情况出现的更加明显;
3)如何实现领导选举
集群情况下可能需要实现stand by,一个服务挂了,另一个需要接替的效果;
4)如何实现节点数据的封装
项目中一般都会使用对象,而ZooKeeper只能存放文本类的数据。

ZKClient却能把这些问题解决了:
1)持久的Watcher注册问题
ZKClient框架将事件重新定义分为了stateChanged、znodeChanged、dataChanged三种情况,用户可以注册这三种情况下的监听器(znodeChanged和dataChanged和路径有关),而不是注册Watcher。
ZKClient框架中ZooKeeper只注册了类ZkClient(实现了Watcher),由ZkClient统一处理WatchedEvent,根据WatchedEvent分发到三种情况的处理方法,处理方法在寻找到监听器后会将他send到ZkEventThread的BlockingQueue中,由ZkEventThread以线程的方式执行(个人觉得这个部分写的还是挺精巧的)。

 

zkClient将一次性watcher包装为持久watcher。后者的具体做法是简单的在watcher回调中,重新读取数据的同时再注册相同的watcher实例。

zkClient简单的使用样例如下:

public static void testzkClient(final String serverList) {
        ZkClient zkClient4subChild = new ZkClient(serverList);
        zkClient4subChild.subscribeChildChanges(PATH, new IZkChildListener() {
            @Override
            public void handleChildChange(String parentPath, List currentChilds) throws Exception {
                System.out.println(prefix() + "clildren of path " + parentPath + ":" + currentChilds);
            }
        });

上面是订阅children变化,下面是订阅数据变化

ZkClient zkClient4subData = new ZkClient(serverList);
        zkClient4subData.subscribeDataChanges(PATH, new IZkDataListener() {
            @Override
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println(prefix() + "Data of " + dataPath + " has changed");
            }

            @Override
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println(prefix() + dataPath + " has deleted");
            }
        });

订阅连接状态的变化:

ZkClient zkClient4subStat = new ZkClient(serverList);
        zkClient4subStat.subscribeStateChanges(new IZkStateListener() {
            @Override
            public void handleNewSession() throws Exception {
                System.out.println(prefix() + "handleNewSession()");
            }

            @Override
            public void handleStateChanged(KeeperState stat) throws Exception {
                System.out.println(prefix() + "handleStateChanged,stat:" + stat);
            }
        });

zkClient除了做了一些便捷包装之外,对watcher使用做了一点增强。比如subscribeChildChanges实际上是通过exists和getChildren关注了两个事件。这样当create(“/path”)时,对应path上通过getChildren注册的listener也会被调用。另外subscribeDataChanges实际上只是通过exists注册了事件。因为从上表可以看到,对于一个更新,通过exists和getData注册的watcher要么都会触发,要么都不会触发。

2)session的超时问题:
ZKClient框架里会经常看见一些while语句,是由这些while语句完成的,比如ZkClient.retryUntilConnected方法
(感谢紫川的反馈,此条可能存在描述性问题。经校对:ZkClient貌似还是有对Session Expired 处理的,在ZkClient.processStateChanged方法中。虽然能重新连接,但是连接上是一个新的 session,原有创建的ephemeral znode和watch会被删除,程序上你可能需要处理这个问题。欢迎大家提出意见,万分感谢)

3)领导选举实现:
选举实现逻辑这里讲的很清楚
ZKClient框架提供了DistributedQueue可以对offer方法做适当修改来实现则个功能

4)节点数据的封装:
ZKClient框架提供了ZkSerializer来进行序列化和反序列化,貌似挺有用的。DataUpdater可以用来更新节点数据,进行znode数据转换。

总的来说ZKClient是一个不错的ZooKeeper调用工具,减少不少的开发量,设计精巧,收货不小。

ZKClient下载地址
GitHub工程(zkClient官方地址)
maven工程(部分写了中文注释) 密码:tlbu

附录
ZooKeeper管理员指南

 

参考:

Zookeeper Client简介

 

 

++——(+——(

+

——)o

——

——

——

分享到:
评论

相关推荐

    zookeeper客户端zkClient操作示例

    而zkClient是ZooKeeper的一个客户端库,提供了丰富的API,使得开发者能够更方便地与ZooKeeper交互。 在"zookeeper客户端zkClient操作示例"中,我们可以学习到如何在Java应用中使用zkClient来实现ZooKeeper的各种...

    zookeeper客户端

    7. **Zookeeper客户端库** 除了Java原生客户端,Zookeeper还提供了多种语言的客户端库,如Python、C、C++和Go等,方便不同语言环境下的应用集成。 8. **客户端配置** 客户端配置文件通常为`zoo.cfg`,包含了...

    zookeeper-3.4.6的服务包

    这个服务包可能包含了运行Zookeeper所需的所有组件,包括服务器端软件、客户端库以及相关的文档和配置示例。 描述中的“zookeeper的3.4版本我找了很久都没找到,还是通过朋友发过来的”暗示了Zookeeper的某些版本...

    zookeeper两种客户端demo

    ZkClient是早期较为流行的Zookeeper客户端,它是一个轻量级、易于使用的Java库。ZkClient的特点包括: 1. **简洁API**:ZkClient提供了简单易懂的API,如connect、create、exists、getData等,使得开发者能快速上手...

    zookeeper_demo maven项目:包含原生API、zkclient、Curator操作

    在本项目`zookeeper_demo`中,我们将深入探讨Zookeeper的三种主要客户端库——原生API、ZkClient和Curator的操作方式,以及它们在集群配置和分布式锁等实际场景中的应用。 1. **Zookeeper原生API** Zookeeper原生...

    zk0.2-dev.jar,含源码

    首先,Zookeeper客户端库(`zkclient-0.1-dev.jar`)提供了与Zookeeper服务器通信的接口,使得应用程序可以轻松地连接到Zookeeper集群,执行各种操作,如创建、删除、更新和读取Znodes(Zookeeper中的数据节点)。...

    开发zookeeper使用的jar包和依赖包zkclient

    然后,`zkClient.jar`是ZooKeeper的一个第三方客户端库,由Xiaoyu He开发。相比于ZooKeeper自带的客户端,zkClient提供了更丰富的功能和更友好的API,使得开发者能够更方便地操作ZooKeeper。它支持异步和同步操作,...

    zkclient各版本型号.rar

    ZKClient是一款基于Java的 ZooKeeper 客户端库,它为开发者提供了更方便的接口来操作和管理Zookeeper集群。Zookeeper是一个分布式协调服务,广泛应用于分布式系统中,如配置管理、命名服务、分布式锁、集群管理等。...

    zookeeper示例代码。

    6. **Curator应用**:Curator是Facebook开源的ZooKeeper客户端库,它封装了ZooKeeper的操作,提供了更高级的API,如连接管理、故障恢复、分布式锁、队列等。使用Curator可以使ZooKeeper的使用更加便捷和稳定。 7. *...

    zkclient文档

    ZkClient是一个由Datameer工程师开发的开源客户端库,它旨在简化ZooKeeper客户端的使用过程,通过封装ZooKeeper原生API,提供了更为简洁易用的接口。在实际应用中,ZkClient帮助开发者解决了使用ZooKeeper客户端时...

    zookeeper-3.4.9.jar

    ZkClient是Zookeeper的一个轻量级客户端库,它提供了更友好的API,使得开发者能更容易地与Zookeeper交互。ZkClient支持异步和同步操作,同时具备丰富的Watch事件处理能力。例如,可以使用ZkClient创建ZNode、读取...

    zkclient-2.1.1.rar

    ZkClient,全称为Zookeeper Client,是一款广泛应用于Java环境中的Zookeeper客户端工具,它提供了更高级别的API,使得与Zookeeper服务器的交互变得更加简单和直观。ZkClient-2.1.1是该库的一个稳定版本,包含了丰富...

    完整jar包资源,COULD NOT FIND zkclient,包缺失使用

    `zkclient`是针对ZooKeeper的一个客户端库,用于简化对ZooKeeper的操作。 **ZooKeeper**: ZooKeeper是由Apache基金会开发的一个分布式协调服务,它为分布式应用提供统一的命名服务、配置管理、集群同步、 leader...

    zookeeper的jar包

    5. **zkclient-0.1.jar**:这是另一个Zookeeper客户端,提供了一种简单易用的API来操作Zookeeper。它支持异步操作,性能较高,并且提供了事件监听等功能。 6. **slf4j-api-1.6.1.jar, slf4j-log4j12-1.6.1.jar**:...

    zkclient 1.0 源码包

    Zkclient 是一个针对 Apache ZooKeeper 的轻量级客户端库,由淘宝官方提供,广泛应用于分布式协调服务中。ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的...

    zookeeper第三节课1

    而Curator是Apache官方提供的客户端库,相比ZkClient,它提供了更高级的抽象,如分布式锁、队列和领导选举等,使得开发者可以更方便地处理分布式一致性问题。 ZkClient的常用操作包括创建、读取、更新和删除Znode...

    zkclient jar包

    ZKClient是一款针对Apache ZooKeeper的Java客户端库,它提供了比ZooKeeper原生API更为高级和方便的接口,使得开发者在使用ZooKeeper时能够更高效地进行数据操作和监控。ZooKeeper是一个分布式协调服务,常用于管理...

    zkclient-0.10

    ZKClient作为ZooKeeper的客户端库,它封装了与ZooKeeper服务器通信的细节,提供了一套高级API,使得开发者能够更专注于业务逻辑。 zkclient-0.10的核心特性包括: 1. **事件监听机制**: ZKClient支持多种类型的...

    Zookeeper概述、原理及应用汇总

    Curator由于其强大的功能和广泛的社区支持而成为全球应用最广泛的Zookeeper客户端库。 ### Zookeeper的应用场景 1. **配置中心**:Zookeeper可以作为分布式系统的配置中心,集中管理各组件的配置信息。 2. **集群...

    zkclient-0.3.jar

    ZKClient,全称为Zookeeper Client,是一款广泛应用于分布式环境中的客户端库,主要用于与Apache ZooKeeper进行交互。ZooKeeper是一个分布式的、开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中...

Global site tag (gtag.js) - Google Analytics