文档章节

ZooKeeper简单API

JackieYeah
 JackieYeah
发布于 2016/07/13 10:57
字数 885
阅读 175
收藏 5

##简单API ZooKeeper的设计目标之一就是提供一个非常简单的编程接口。这个编程接口主要支持以下几种操作:

操作说明
create在树中创建一个节点
delete删除一个节点
exists测试节点是否存在
get data读取节点数据
set data将数据写入节点
get children查询节点的子节点
sync等待数据被传输

##代码示例 下面的代码是使用 ZooKeeper 原生 API 来实现的。

// 创建 ZooKeeper 实例
ZooKeeper zk = new ZooKeeper("192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181", 500000, new Watcher() {
            // 监控被触发的事件
            public void process(WatchedEvent event) {
                System.out.println(event);
            }
        });

// 判断 /zk_test 节点是否存在
System.out.println(zk.exists("/zk_test", true));

// 创建一个持久节点 /zk_test, 数据内容是 test-data, 不进行 ACL 权限控制
zk.create("/zk_test", "test-data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// 创建两个子节点, 节点类型均为持久节点
zk.create("/zk_test/child_a", "test-data-child-a".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
zk.create("/zk_test/child_b", "test-data-child-b".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

// 获取 /zk_test 节点数据
System.out.println(new String(zk.getData("/zk_test", false, null)));

// 取出 /zk_test 节点的子节点列表
System.out.println(zk.getChildren("/zk_test", true));

// 更新 /zk_test 节点数据
zk.setData("/zk_test", "test-data-update".getBytes(), -1);
// 获取 /zk_test 节点更新后的数据
System.out.println(new String(zk.getData("/zk_test", false, null)));

// 删除子节点
zk.delete("/zk_test/child_a", -1);
zk.delete("/zk_test/child_b", -1);
// 删除父节点 /zk_test
zk.delete("/zk_test", -1);
// 关闭连接
zk.close();

##Curator Curator 是 Netflix 公司开源的一个 ZooKeeper 客户端框架, 由 Jordan Zimmerman 开发。Curator 提供了一套可读性更强的 Fluent 风格的 API, 并且提供了 ZooKeeper 各种应用场景(recipe, 比如共享锁服务, 集群领导选举机制)的抽象封装。更多详细介绍参见 Curator官网

###Curator组件 | 组件名称 | 说明 | | ------------- |:-------------:| |Recipes |一些 ZooKeeper 常用应用场景的实现, 其实现是基于 Curator Framework。| |Framework |Curator Framework 是一个高级别的 API, 它极大的简化了 ZooKeeper 的使用。它添加了很多使用 ZooKeeper 开发的特性, 并且可以处理复杂的 ZooKeeper 集群连接管理和重试操作。| |Utilities |使用 ZooKeeper 时很多实用的工具类。| |Client |ZooKeeper 原生客户端的一个替代品, 它负责处理一些底层的操作并提供了一些实用工具类。| |Errors |Curator 用于处理错误, 连接问题, 恢复异常等。| |Extensions |curator-recipes 包实现了 ZooKeeper 文档中描述的一些常用的应用场景。为了避免这个包变得很大, 将一些 recipes/applications 使用命名规则 curator-x-name 放到一个单独的 extension 包中, 比如 curator-x-discovery, curator-x-discoveryserver 以及 curator-x-rpc 等等。| ###代码示例 下面使用 Curator 提供的 API 来替换上面示例中 ZooKeeper 原生的 API。

// ZooKeeper集群地址
String zkConnectionString = "192.168.109.137:2181,192.168.109.138:2181,192.168.109.139:2181";
// 指定ZooKeeper集群连接重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
// 使用CuratorFrameworkFactory创建Curator连接实例CuratorFramework, 只需要为每个连接的ZooKeeper集群创建一个CuratorFramework对象实例
CuratorFramework zkClient = CuratorFrameworkFactory.newClient(zkConnectionString, retryPolicy);
// 启动客户端
zkClient.start();

// 判断 /zk_test 节点是否存在
zkClient.checkExists().forPath("/zk_test");

// 创建一个持久节点 /zk_test, 数据内容是 test-data。
zkClient.create().forPath("/zk_test", "test-data".getBytes());
// 创建两个子节点, 节点类型均为持久节点
zkClient.create().forPath("/zk_test/child_a", "test-data-child-a".getBytes());
zkClient.create().forPath("/zk_test/child_b", "test-data-child-b".getBytes());

// 获取 /zk_test 节点数据
System.out.println(new String(zkClient.getData().forPath("/zk_test")));

// 取出 /zk_test 节点的子节点列表
System.out.println(zkClient.getChildren().forPath("/zk_test"));

// 更新 /zk_test 节点数据
zkClient.setData().forPath("/zk_test", "test-data-update".getBytes());
// 获取 /zk_test 节点更新后的数据
System.out.println(new String(zkClient.getData().forPath("/zk_test")));

// 删除子节点
zkClient.delete().forPath("/zk_test/child_a");
zkClient.delete().forPath("/zk_test/child_b");
// 取出 /zk_test 节点的子节点列表
System.out.println(zkClient.getChildren().forPath("/zk_test"));

// 删除父节点 /zk_test
zkClient.delete().forPath("/zk_test");

// 关闭连接
zkClient.close();

##参考资料 http://curator.apache.org/index.html

© 著作权归作者所有

JackieYeah
粉丝 45
博文 70
码字总数 90004
作品 0
武汉
程序员
私信 提问
ZooKeeper教程资源收集(简介/原理/示例/解决方案)

菩提树下的杨过: ZooKeeper 笔记(1) 安装部署及hello world ZooKeeper 笔记(2) 监听数据变化 ZooKeeper 笔记(3) 实战应用之【统一配置管理】 ZooKeeper 笔记(4) 实战应用之【消除单点故障】...

easonjim
2017/09/05
0
0
ZooKeeper Java例子(四)

A Simple Watch Client 为了向你介绍ZooKeeper Java API,我们开发了一个非常简单的监视器客户端。ZooKeeper客户端监视一个ZooKeeper节点的改变并且通过开始和停止一个程序来作出响应。 必备条...

chenkangyao
2018/08/02
36
0
大数据教程(3.8):zookeeper的java客户端API简介及监听原理

之前章节介绍了zookeeper集群的自动化启动脚本,本节博主将带大家简单的使用zookeeper的java客户端API,从而了解其使用。 zookeeper监听器原理: zookeeper使用步骤: (1)新建maven项目em-...

em_aaron
2018/08/05
69
0
ZooKeeper分布式专题与Dubbo微服务入门

ZooKeeper分布式专题与Dubbo微服务入门 网盘地址:https://pan.baidu.com/s/1TN6BlftB2uvvyVR7IDmODQ 密码: e6zt 备用地址(腾讯微云):https://share.weiyun.com/5539X2S 密码:65b36i Zo...

人气王子333
2018/04/17
0
0
ZooKeeper 使用 ZKClient 获取子节点列表

ZkClient 是一个开源软件,也托管在 github。它封装了 zookeeper 原生 API。 使用 先需要在 javaws 网站上下载 ZKClient 的 jar 包。 注意 中的 IP 地址应该和 中配置的 IP 地址一致,且在 ...

兔之
2015/10/27
829
0

没有更多内容

加载失败,请刷新页面

加载更多

《Designing.Data-Intensive.Applications》笔记 四

第九章 一致性与共识 分布式系统最重要的的抽象之一是共识(consensus):让所有的节点对某件事达成一致。 最终一致性(eventual consistency)只提供较弱的保证,需要探索更高的一致性保证(stro...

丰田破产标志
今天
6
0
docker 使用mysql

1, 进入容器 比如 myslq1 里面进行操作 docker exec -it mysql1 /bin/bash 2. 退出 容器 交互: exit 3. mysql 启动在容器里面,并且 可以本地连接mysql docker run --name mysql1 --env MY...

之渊
今天
7
0
python数据结构

1、字符串及其方法(案例来自Python-100-Days) def main(): str1 = 'hello, world!' # 通过len函数计算字符串的长度 print(len(str1)) # 13 # 获得字符串首字母大写的...

huijue
今天
5
0
OSChina 周日乱弹 —— 我,小小编辑,食人族酋长

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @宇辰OSC :分享娃娃的单曲《飘洋过海来看你》: #今日歌曲推荐# 《飘洋过海来看你》- 娃娃 手机党少年们想听歌,请使劲儿戳(这里) @宇辰OSC...

小小编辑
今天
1K
11
MongoDB系列-- SpringBoot 中对 MongoDB 的 基本操作

SpringBoot 中对 MongoDB 的 基本操作 Database 库的创建 首先 在MongoDB 操作客户端 Robo 3T 中 创建数据库: 增加用户User: 创建 Collections 集合(类似mysql 中的 表): 后面我们大部分都...

TcWong
今天
40
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部