Zookeeper客户端对比选择_4
Zookeeper客户端对比选择
本文思维导图

使用框架的好处是自带一套实用的API,但是Zookeeper虽然非常强大,但是社区却安静的可怕,版本更新较慢,下面会先从zookeeper原生API的不足说起,然后引出现在流行的开源客户端工具。
1.原生API
- 1.创建连接的时候是异步的,所以我们在开发的时候需要人工的写代码等待创建节点的状态,如果需要的话。
- 2.连接时无超时重连机制。本人觉得这个非常重要,因为在现实使用中,网络是不可信的,在创建节点的时候要考虑到网络的不稳定性。因此,超时重连机制是非常必要的。
- 3.zookeepr的通信是网络通信,因此在数据通信的时候会消耗一定的网络IO和带宽。但zookeeper没有序列化机制,需要开发者自行开发。
- 4.Watcher注册一次,触发后会自动失效。
- 5.不支持递归创建树形节点。这点是比较有用的,类似Linux的命令:
mkdir -p /xxx/xxx/
基于以上的一些不足,引起了业界一些大佬的不满,因此它们自行开发了一些开源的客户端工具。比如ZkClient和Curator。对前者简单介绍,现在使用最多的是后者。
2.ZkClient
2.1 ZkClient概述
ZkClient是Github上一个开源的zk客户端,由datameer的工程师Stefan Groschupf和Peter Voss一起开发(最仰慕的就是这类大佬,类似Linus那样,一不爽写个开源版本(git)出来...)
- 解决session会话超时重连。
- Watcher反复注册。
- 简化开发api。
当然还有很多的很多修改的功能,使用也很简单,但是社区不活跃,连api文档都不完善,对于我们来说只能看源码来开发应用了,也略有麻烦的。有兴趣的开源上github看看。 https://github.com/sgroschupf/zkclient
2.2 ZkClien API
- 创建客户端
ZkClient zkclient = new ZkClient("192.168.17.128:2181,192.168.17.129:2181,192.168.17.130:2181",5000); - 创建节点
zkclient.create(path, data, CreateMode.PERSISTENT); - 删除节点
zkclient.delete(path); - 获取子节点
zkclient.getChildren(path); - 关闭客户端
zkclient.close(); - 读节点数据
zkclient.readData(path); - 判断节点是否存在
zkclient.exists(path);
3.Curator
3.1 Curator概述
Curator是Apache基金会的顶级项目之一。Apache基金会就类似万能储备室,把全球顶级的开源项目收纳其中,造福一方百姓啊。
- 下面是Curator对比原生zk的API和ZkClient比较重要的完善点:
- 解决session会话超时重连。
- Watcher反复注册。
- 简化开发api。
- 遵循Fluent风格Api规范。
- NodeExistsException异常处理。
- ......
3.2 Curator API介绍
创建会话
1.使用CuratorFrameworkFactory工厂的两个静态方法创建客户端
2.Start()方法启动
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
client = CuratorFrameworkFactory.builder()
.connectString("localhost:2181,localhost:2182")
.sessionTimeoutMs(10000).retryPolicy(retryPolicy)
.namespace("base").build();
client.start();1.重试策略(实现接口RetryPolicy可以自定义重试策略)
boolean allowRetry(int retryCount, long elapsedTimeMs, RetrySleeper sleeper)2.默认四种重试策略: Exponential BackoffRetry、RetryNTimes、RetryOneTime、
RetryUntilElapsed2.1 ExponentialBackoffRetry
ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries, int maxSleepMs)当前应该sleep的时间:
baseSleepTimeMs * Math.max(1, random.nextInt(1 << (retryCount + 1)))2.2 RetryNTimes
RetryNTimes(int n, int sleepMsBetweenRetries)2.3 RetryOneTime
RetryOneTime(int sleepMsBetweenRetry)2.4 RetryUntilElapsed
RetryUntilElapsed(int maxElapsedTimeMs, int sleepMsBetweenRetries)3.Fluent风格的API
定义:一种面向对象的开发方式,目的是提高代码的可读性
实现方式通过方法的级联或者方法链的方式实现
例子:
client = CuratorFrameworkFactory.builder()
.connectString("localhost:2181,localhost:2182")
.sessionTimeoutMs(10000).retryPolicy(retryPolicy)
.namespace("base").build();
4.常用API
4.1创建节点
public void createNode(String path, byte[] data) throws Exception {
client.getZookeeperClient().getZooKeeper().addAuthInfo("digest", "test:123456".getBytes());
client.create().creatingParentsIfNeeded()
.withMode(CreateMode.PERSISTENT).withACL(Ids.CREATOR_ALL_ACL)
.forPath(path, data);
}
4.2删除节点
public void deleteNode(String path, int version) throws Exception {
client.delete().guaranteed().deletingChildrenIfNeeded().withVersion(version)
.inBackground(new DeleteCallBack()).forPath(path);
}
4.3读取节点
public void readNode(String path) throws Exception {
byte[] data = client.getData().inBackground(new DeleteCallBack()).forPath(path);
System.out.println(path + "的数据:" + new String(data));
}
4.4更新节点数据
public void updateNode(String path, byte[] data, int version)
throws Exception {
client.setData().withVersion(version).inBackground(new DeleteCallBack()).forPath(path, data);
}
4.5获取子节点
public void getChildren(String path) throws Exception {
List<String> children = client.getChildren().usingWatcher(new WatcherTest()).forPath("/test");
for (String pth : children) {
System.out.println("child=" + pth);
}
}
4.6为节点添加监听
NodeCache
监听数据节点的内容变更
监听节点的创建,即如果指定的节点不存在,则节点创建后,会触发这个监听
PathChildrenCache
监听指定节点的子节点变化情况
包括新增子节点,子节点数据变更和子节点删除
public void addNodeDataWatcher(String path) throws Exception {
final NodeCache nodeC = new NodeCache(client, path);
nodeC.start(true);
nodeC.getListenable().addListener(new NodeCacheListener() {
public void nodeChanged() throws Exception {
String data = new String(nodeC.getCurrentData().getData());
System.out.println("path=" + nodeC.getCurrentData().getPath()
+ ":data=" + data);
}
});
}
4.7异步回调
inBackground()inBackground(Object context)inBackground(BackgroundCallback callback)inBackground(BackgroundCallback callback, Object context)inBackground(BackgroundCallback callback, Executor executor)inBackground(BackgroundCallback callback, Object context, Executor executor)
Curator的回调与zk的原生异步api相同,多了一个线程池,用于执行回调。
异步操作事件状态:event.getType()
异步操作事件状态码:event.getResultCode()
以上就是Curator常用的API,都是利用这些API来进行更加复杂的应用开发的,比如分布式锁,集群管理等应用。
4.小结
好的开源工具解放我们的开发,但是不要在其中迷失,还要深入的了解其中的设计原理,不能只是调用API,要学习人家的思想,这样才能跟随大神的脚步,提升自己的实力。
Zookeeper客户端对比选择_4的更多相关文章
- 服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比
服务注册发现与注册中心对比-Eureka,Consul,Zookeeper,Nacos对比 注册中心简介 流程和原理 基础流程 核心功能 1.Eureka.Consul.Zookeeper三者异同点 ...
- 【分布式】Zookeeper客户端
一.前言 前篇博客分析了Zookeeper的序列化和通信协议,接着继续学习客户端,客户端是开发人员使用Zookeeper最主要的途径,很有必要弄懂客户端是如何与服务端通信的. 二.客户端 2.1 客户 ...
- zookeeper 客户端编程
zookeeper是一个分布式的开源的分布式协调服务,用它可以来现同步服务,配置维护.zookeeper的稳定性也是可以保证的,笔者曾参与过的使用zookeeper的两个应用,一个是用zookeepe ...
- Zookeeper客户端Curator的使用,简单高效
Curator是Netflix公司开源的一个Zookeeper客户端,与Zookeeper提供的原生客户端相比,Curator的抽象层次更高,简化了Zookeeper客户端的开发量. 1.引入依赖: ...
- Zookeeper客户端Curator使用详解
Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBoot.Curator.Bootstrap写了一个可视化的Web应用: zookeep ...
- zookeeper如何实现负载均衡的?(具体连接哪一个zookeeper服务器的选择?)阿里面试
如果想了解web 6大负载均衡算法,参考:六大Web负载均衡原理与实现 主要是三点:负载均衡算法,健康检查和会话保持 1:首先,我们要了解,我们的应用程序,比如java web程序,里面配置了10个z ...
- zookeeper(六):Zookeeper客户端Curator的API使用详解
简介 Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连.反复注册Watcher和NodeExistsEx ...
- 转:Zookeeper客户端Curator使用详解
原文:https://www.jianshu.com/p/70151fc0ef5d Zookeeper客户端Curator使用详解 前提 最近刚好用到了zookeeper,做了一个基于SpringBo ...
- zookeeper系列(八)zookeeper客户端的底层详解
作者:leesf 掌控之中,才会成功:掌控之外,注定失败.出处:http://www.cnblogs.com/leesf456/p/6098255.html 尊重原创,共同学习进步: 一.前言 ...
随机推荐
- Checker Challenge跳棋的挑战(n皇后问题)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
- 【原】Zookeeper 概述 + 官网 Overview 翻译
分布式应用 分布式应用 distributed application可以在给定时间(同时)在网络中的多个系统上运行,通过协调它们以快速有效的方式完成特定任务. (a), (b): a distrib ...
- java基础之集合:List Set Map的概述以及使用场景
本文的整体思路以及部分文字来源:来源一 和 来源二 Java集合类的基本概念: 首先大家要明白集合为什么会出现: 在编程中,常常需要集中存放多个数据.从传统意义上讲,数组是我们的一个很好的选择,前提是 ...
- spring 项目返回406
406 The resource identified by this request is only capable of generating responses with characteris ...
- jps, jinfo命令
jps主要用来输出JVM中运行的进程状态信息. -q 不输出类名.Jar名和传入main方法的参数 -m 输出传入main方法的参数 -l 输出main类或Jar的全限名 -v 输出传入JVM的参数 ...
- 数据库MySQL之 视图、触发器、存储过程、函数、事务、数据库锁、数据库备份、事件
数据库MySQL之 视图.触发器.存储过程.函数.事务.数据库锁.数据库备份.事件 浏览目录 视图 触发器 存储过程 函数 事务 数据库锁 数据库备份 事件 一.视图 1.视图概念 视图是一个虚拟表, ...
- 简单的Cookie记录浏览记录案例
books.jsp 界面 代码 <%@ page contentType="text/html;charset=UTF-8" language="java" ...
- hdu 2553 N皇后问题(一维数组详尽解释)
//一维数组解法(注释详尽)//num皇后可以表示第num列,然后枚举num皇后所在的行//二维数组对角线转换为坐标的关系#include<stdio.h> #include<str ...
- vis用于做3D图表的js插件
vis.js用于做3D图表:(浏览网站需要FQ)实例:http://visjs.org/graph3d_examples.html代码下载:https://github.com/almende/vis
- Web Pages version 2兼容 Web Pages version 1的设置
If you want to run a site using Web Pages version 1 (instead of the default, as in the previous poin ...