Zookeeper客户端框架Curator的使用
阅读数:243 评论数:0
跳转到新版页面分类
python/Java
正文
一、概述
Curator是Netflix公司开源一套Zookeeper客户端框架,它对Zookeeper原生API进行了封装,还提供了一些应用场景。
Netflix是一家美国公司,是一家专门提供在线流媒体订阅服务的公司,其主要业务是通过互联网向观众提供电影、电视剧、纪录片、动画片等在线串流视频服务。
开源过数据管道服务Suro、分布式系统的延迟和容错库Hystrix、微服务编排引擎Conductor。
Recipes | 典型应用场景的实现,这些实现是基于CuratorFramework。 |
Framework | Zookeeper API的高层封装,大大简化了客户端编程。 |
Utilities | 各种实用程序。 |
Client | zookeeper client的封装。 |
Errors | 错误处理。 |
二、基本使用
根据上面的描述,大多数情况下使用的都是Curator-recipes的依赖。
GroupID/Org | ArtifactID/Name | 描述 |
---|---|---|
org.apache.curator | curator-recipes | 所有典型应用场景。需要依赖client和framework,需设置自动获取依赖。 |
org.apache.curator | curator-framework | 同组件中framework介绍。 |
org.apache.curator | curator-client | 同组件中client介绍。 |
org.apache.curator | curator-test | 包含TestingServer、TestingCluster和一些测试工具。 |
org.apache.curator | curator-examples | 各种使用Curator特性的案例。 |
org.apache.curator | curator-x-discovery | 在framework上构建的服务发现实现。 |
org.apache.curator | curator-x-discoveryserver | 可以和Curator Discovery一起使用的RESTful服务器。 |
org.apache.curator | curator-x-rpc | Curator framework和recipes非java环境的桥接。 |
Curator创建客户端是通过CuratorFrameworkFactory工厂类来实现的,此工厂类提供了三种创建客户端的方法
// 方式一
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",retryPolicy);
client.start();
// 方式二
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",
5000,1000,retryPolicy);
client.start();
//方式三
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
CuratorFramework Client = CuratorFrameworkFactory.builder()
.connectString("hadoop1:2181,hadoop2:2181,hadoop3:2181")
.sessionTimeoutMs(3000)
.connectionTimeoutMs(5000)
.retryPolicy(retryPolicy)
.build();
client.start();
client.blockUntilConnected();
(1)connectString:zk的server地址,多个server之间使用英文逗号分隔开。
(2)connectionTimeoutMs:连接超时时间,默认是15s
(3)sessionTimeoutMs:会话超时时间,默认是60s
(4)retryPolicy:失败重试策略
sleep时间 = $baseSleepTimeMs\times Math.max(1,random.nextInt(1<<(retryCount+1)))$
maxRetries是最大重试次数
(5)start()开始创建会话
(6)blockUntilConnected()直到连接成功或超时
Curator默认创建的是持久节点,内容为空。
(1)创建一个初始内容为空的节点
client.create().forPath(path);
(2)创建一个包含内容的节点
client.create().forPath(path,"test".getBytes());
(3)创建临时节点,并递归创建父节点
client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);
//此处Curator和ZkClient一样封装了递归创建父节点的方法。在递归创建父节点时,父节点为持久节点。
(1)删除一个子节点
client.delete().forPath(path);
(2)删除节点并递归删除其子节点
client.delete().deletingChildrenIfNeeded().forPath(path);
(3)指定版本进行删除
client.delete().withVersion(1).forPath(path);
//如果版本不存在,则删除异常,信息如下:
org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for
(4)强制保证删除一个节点
client.delete().guaranteed().forPath(path);
(1)普通查询
client.getData().forPath(path);
(2)包含状态查询
Stat stat = new Stat();
client.getData().storingStatIn(stat()).forPath(path);
// 普通更新
client.setData().forPath(path,"新内容".getBytes());
// 指定版本更新
client.setData().withVersion(1).forPath(path,"新内容".getBytes());
更新出错,版本不一致异常:
org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for