zookeeper Curator zkClient 客户端对比

疯狂创客圈 Java 分布式聊天室【 亿级流量】实战系列之 -23【 博客园 总入口


@

写在前面

​ 大家好,我是作者尼恩。目前和几个小伙伴一起,组织了一个高并发的实战社群【疯狂创客圈】。正在开始高并发、亿级流程的 IM 聊天程序 学习和实战

​ 前面,已经完成一个高性能的 Java 聊天程序的四件大事:

接下来,需要进入到分布式开发的环节了。 分布式的中间件,疯狂创客圈的小伙伴们,一致的选择了zookeeper,不仅仅是由于其在大数据领域,太有名了。更重要的是,很多的著名框架,都使用了zk。

​ 本篇介绍和对比zookeeper的两个客户端。

1.1. zookeeper应用开发

Zookeeper应用开发,需要使用Zookeeper的java 客户端API ,去连接和操作Zookeeper 集群。

可以供选择的java 客户端API 有:Zookeeper 官方的 java客户端API,第三方的java客户端API。

Zookeeper官方的 客户端API提供了基本的操作,比如,创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。但对于开发人员来说,Zookeeper提供的基本操纵还是有一些不足之处。

Zookeeper API不足之处如下:

(1)Zookeeper的Watcher是一次性的,每次触发之后都需要重新进行注册;

(2)Session超时之后没有实现重连机制;

(3)异常处理繁琐,Zookeeper提供了很多异常,对于开发人员来说可能根本不知道该如何处理这些异常信息;

(4)只提供了简单的byte[]数组的接口,没有提供针对对象级别的序列化;

(5)创建节点时如果节点存在抛出异常,需要自行检查节点是否存在;

(6)删除节点无法实现级联删除;

第三方开源客户端主要有zkClient和Curator。

1.1.1. ZkClient简介

ZkClient是一个开源客户端,在Zookeeper原生API接口的基础上进行了包装,更便于开发人员使用。zkClient客户端,在一些著名的互联网开源项目中,得到了应用,比如:阿里的分布式dubbo框架,对它进行了集成使用。

zkClient解决了Zookeeper原生API接口的很多问题。比如,zkClient提供了更加简洁的api,实现了session会话超时重连、Watcher反复注册等问题。虽然ZkClient对原生API进行了封装,但也有它自身的不足之处。

具体如下:

(1)zkClient社区不活跃,文档不够完善,几乎没有参考文档;

(2)异常处理简化(抛出RuntimeException);

(3)重试机制比较难用;

(4)没有提供各种使用场景的参考实现;

1.1.2. Curator简介

Curator是Netflix公司开源的一套Zookeeper客户端框架,和ZkClient一样,解决了非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等。Curator是Apache基金会的顶级项目之一,Curator具有更加完善的文档,另外还提供了一套易用性和可读性更强的Fluent风格的客户端API框架。

不止上面这些,Curator中还提供了Zookeeper各种应用场景(Recipe,如共享锁服务、Master选举机制和分布式计算器等)的抽象封装。

另外,Curator供了一套非常优雅的链式调用api,对比ZkClient客户端 Api的使用,发现 Curator的api 优雅太多。

使用ZkClient客户端,创建节点的代码为:

   ```
ZkClient client = new ZkClient("192.168.1.105:2181", 10000, 10000, new SerializableSerializer()); System.out.println("conneted ok!"); String zkPath = "/test/node-1"; Stat stat = new Stat(); User u = client.readData(zkPath, stat);
```

使用Curator客户端,创建节点的代码如下:

 ```
CuratorFramework client = CuratorFrameworkFactory.newClient( connectionString, retryPolicy); String zkPath = "/test/node-1"; client.create().withMode(mode).forPath(zkPath);
```

总之,由于Curator客户端确实非常优秀,Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”,对Curator给予了高度评价。

因此,对于Zookeeper的客户端,我们这里只学习和研究Curator的使用。而且,在实际的开发场景中,使用Curator客户端,就足可以应付日常的Zookeeper集群操作需求。

疯狂创客圈社群的亿级流量IM实战项目,也使用Curator客户端来操作Zookeeper集群。

写在最后

​ 下一篇:开启zk的客户端开发。


疯狂创客圈 亿级流量 高并发IM 实战 系列

  • Java (Netty) 聊天程序【 亿级流量】实战 开源项目实战


zookeeper(二): Curator vs zkClient的更多相关文章

  1. 7.5 zookeeper客户端curator的基本使用 + zkui

    使用zookeeper原生API实现一些复杂的东西比较麻烦.所以,出现了两款比较好的开源客户端,对zookeeper的原生API进行了包装:zkClient和curator.后者是Netflix出版的 ...

  2. Zookeeper客户端Curator使用详解

    Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...

  3. Zookeeper框架Curator使用

    本文参考自https://blog.csdn.net/wo541075754/article/details/69138878?utm_source=gold_browser_extension ht ...

  4. zookeeper(六):Zookeeper客户端Curator的API使用详解

    简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...

  5. 转:Zookeeper客户端Curator使用详解

    原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...

  6. ZooKeeper:第三方客户端 ZKClient

    ZKClient ZKClient的设计 ZKClient组件说明 重要的处理流程说明 启动ZKClient 为节点注册Watcher ZooKeeper的变更操作 客户端处理变更 序列化处理 ZKC ...

  7. Zookeeper与Curator二三事【坑爹】

    起因:我的Dubbo服务起不来:我本地Zookeeper3.4.11,Curator4.1 Caused by: org.apache.zookeeper.KeeperException$Unimpl ...

  8. zookeeper(2)-curator

    一.Curator介绍 zookeeper的提交人也说过,curator对于zookeeper而言就像是guava对于java差不多,更加优雅高效. 而且之前的zookeeper原生API,往往因为2 ...

  9. ZooKeeper和Curator相关经验总结

    一.关于ZooKeeper的watch用法,需要注意 详细说明如下: ZooKeeper Watches All of the read operations in ZooKeeper - getDa ...

随机推荐

  1. zabbix分组报警

    生产上需要在出现报警情况下,不同的主机发送报警给不同的用户 下面实例为分组为dev(开发组)和ops(运维组) 1.把主机进行分组 创建主机群组 配置-->主机群组-->创建主机群组,创建 ...

  2. 2017.4.18 putty和fileZilla的使用

    putty:用来连接环境. fileZila:用来传递文件. (1)连接环境 centOS 7 点击putty.exe,输入地址.用户名.密码进行连接.端口输入22.用账号和密码登录. 进入到目录下, ...

  3. Java千百问_03基本的语法(005)_二进制是如何做位运算的

    点击进入_很多其它_Java千百问 二进制是如何做位运算的 程序中的全部数在计算机内存中都是以二进制的形式储存的.位运算说白了,就是直接对整数在内存中的二进制位进行操作. 其它运算符看这里:java种 ...

  4. Php函数之end

    Php函数之end end()函数 (PHP 4, PHP 5, PHP 7) end - 将数组的内部指针指向最后一个单元 说明 mixed end ( array &$array ) en ...

  5. 自动化统一安装部署tomcat

    背景:多台服务器来回切换,安装部署tomcat,浪费时间 目的: 一次修改,统一安装,统一部署. 进程:ps -ef|grep tomcat|grep -v 'grep'|awk '{print $2 ...

  6. HTML基础知识总结一

    一.HTML是什么? HTML是超文本标记语言的英文缩写,"超文本"就是指页面内能够包括图片.链接.甚至音乐.程序等非文字元素.超文本标记语言的结构包括"头"部 ...

  7. kettle入门(七) 之kettle增量方案(一)全量比对取增量-依据唯一标示

    引: ods有个project表来自于上游系统,数据量不大 十几万,下游系统须要此数据,而且须要每天提供截止当天的增量数据 要求每条数据给出数据变化时间及标示,即数据若是插入 有插入时间和插入标示 若 ...

  8. CentOS6.8 编译安装LNMP

    思路:根据Linux系统以及公司网站系统的信息,选择合适的安装包进行安装 一.查看系统信息 # uname -a # 查看内核/操作系统/CPU信息 # /etc/issue # 查看操作系统版本 # ...

  9. AVCaptureSession

    AVCaptureSession用来控制来自一个输入设备(AVCaptureDeviceInput)的声音和视频,流入一个输出缓冲区(AVCaptureOutput)的过程. 建立一个AVCaptur ...

  10. MySQL5.5中文支持

    1. /etc/my.cnf.d/client.cnf [client] #password = [your_password] port = 3306 socket = /tmp/mysql.soc ...