我使用的是Maven添加的依赖地址如下:
<!-- zk 连接客户端 start -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<!-- zk 连接客户端 end -->
CuratorFramework
Curator框架提供了一套高级的API, 简化了ZooKeeper的操作。 它增加了很多使用ZooKeeper开发的特性,可以处理ZooKeeper集群复杂的连接管理和重试机制。 这些特性包括:
- 自动化的连接管理: 重新建立到ZooKeeper的连接和重试机制存在一些潜在的错误case。 Curator帮助你处理这些事情,对你来说是透明的。
- 清理API:
- 简化了原生的ZooKeeper的方法,事件等
- 提供了一个现代的流式接口
- 提供了Recipes实现: 如前面的文章介绍的那样,基于这些Recipes可以创建很多复杂的分布式应用
Curator框架通过CuratorFrameworkFactory以工厂模式和builder模式创建CuratorFramework实 例。 CuratorFramework实例都是线程安全的,你应该在你的应用中共享同一个CuratorFramework实例.
工厂方法newClient()提供了一个简单方式创建实例。 而Builder提供了更多的参数控制。一旦你创建了一个CuratorFramework实例,你必须调用它的start()启动,在应用退出时调用close()方法关闭.
CuratorFramework提供的方法:
方法名 | 描述 |
---|
create() | 开始创建操作, 可以调用额外的方法(比如方式mode 或者后台执行background) 并在最后调用forPath()指定要操作的ZNode |
delete() | 开始删除操作. 可以调用额外的方法(版本或者后台处理version or background)并在最后调用forPath()指定要操作的ZNode |
checkExists() | 开始检查ZNode是否存在的操作. 可以调用额外的方法(监控或者后台处理)并在最后调用forPath()指定要操作的ZNode |
getData() | 开始获得ZNode节点数据的操作. 可以调用额外的方法(监控、后台处理或者获取状态watch, background or get stat) 并在最后调用forPath()指定要操作的ZNode |
setData() | 开始设置ZNode节点数据的操作. 可以调用额外的方法(版本或者后台处理) 并在最后调用forPath()指定要操作的ZNode |
getChildren() | 开始获得ZNode的子节点列表。 以调用额外的方法(监控、后台处理或者获取状态watch, background or get stat) 并在最后调用forPath()指定要操作的ZNode |
inTransaction() | 开始是原子ZooKeeper事务. 可以复合create, setData, check, and/or delete 等操作然后调用commit()作为一个原子操作提交 |
具体代码实现模板:
- package com.git.zookeeper.passwordmanager;
-
- import java.util.ArrayList;
- import java.util.List;
- import java.util.concurrent.ExecutorService;
- import java.util.concurrent.Executors;
-
- import org.apache.curator.RetryPolicy;
- import org.apache.curator.framework.CuratorFramework;
- import org.apache.curator.framework.CuratorFrameworkFactory;
- import org.apache.curator.framework.api.ACLProvider;
- import org.apache.curator.framework.recipes.cache.NodeCache;
- import org.apache.curator.framework.recipes.cache.NodeCacheListener;
- import org.apache.curator.framework.recipes.cache.PathChildrenCache;
- import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;
- import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;
- import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;
- import org.apache.curator.retry.ExponentialBackoffRetry;
- import org.apache.curator.retry.RetryNTimes;
- import org.apache.zookeeper.WatchedEvent;
- import org.apache.zookeeper.Watcher;
- import org.apache.zookeeper.ZooDefs;
- import org.apache.zookeeper.ZooDefs.Perms;
- import org.apache.zookeeper.data.ACL;
- import org.apache.zookeeper.data.Id;
- import org.apache.zookeeper.data.Stat;
-
-
-
-
-
-
-
-
-
-
-
-
- public class ZookeeperCuratorUtils {
-
-
-
-
-
-
-
-
-
-
-
- public static void main(String[] args) throws Exception {
-
- CuratorFramework client = clientTwo();
-
-
-
-
-
-
-
- }
-
-
-
-
-
-
-
-
-
- private static CuratorFramework clientOne(){
-
- String connectString = "10.125.2.44:2181";
-
- RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
- CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
- client.start();
- return client;
- }
-
-
-
-
-
-
-
-
-
- private static CuratorFramework clientTwo(){
-
-
- ACLProvider aclProvider = new ACLProvider() {
- private List<ACL> acl ;
- @Override
- public List<ACL> getDefaultAcl() {
- if(acl ==null){
- ArrayList<ACL> acl = ZooDefs.Ids.CREATOR_ALL_ACL;
- acl.clear();
- acl.add(new ACL(Perms.ALL, new Id("auth", "admin:admin") ));
- this.acl = acl;
- }
- return acl;
- }
- @Override
- public List<ACL> getAclForPath(String path) {
- return acl;
- }
- };
- String scheme = "digest";
- byte[] auth = "admin:admin".getBytes();
- int connectionTimeoutMs = 5000;
- String connectString = "10.125.2.44:2181";
- String namespace = "testnamespace";
- CuratorFramework client = CuratorFrameworkFactory.builder().aclProvider(aclProvider).
- authorization(scheme, auth).
- connectionTimeoutMs(connectionTimeoutMs).
- connectString(connectString).
- namespace(namespace).
- retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 1000)).build();
- client.start();
- return client;
- }
-
-
-
-
-
-
-
-
-
-
- private static void nodesList(CuratorFramework client,String parentPath) throws Exception{
- List<String> paths = client.getChildren().forPath(parentPath);
- for (String path : paths) {
- System.out.println(path);
- }
- }
-
-
-
-
-
-
-
-
-
-
- private static void createNode(CuratorFramework client,String path) throws Exception{
-
- Stat stat = client.checkExists().forPath(path);
- System.out.println(stat);
- String forPath = client.create().creatingParentsIfNeeded().forPath(path, "create init !".getBytes());
-
- System.out.println(forPath);
- }
-
-
-
-
-
- private static void getDataNode(CuratorFramework client,String path) throws Exception{
- Stat stat = client.checkExists().forPath(path);
- System.out.println(stat);
- byte[] datas = client.getData().forPath(path);
- System.out.println(new String(datas));
- }
-
-
-
-
-
-
-
-
-
-
-
-
- private static void setDataNode(CuratorFramework client,String path,String message) throws Exception{
-
- Stat stat = client.checkExists().forPath(path);
- System.out.println(stat);
- client.setData().forPath(path, message.getBytes());
- }
-
- private static void deleteDataNode(CuratorFramework client,String path) throws Exception{
-
- Stat stat = client.checkExists().forPath(path);
- System.out.println("deleteNode : "+stat);
-
- Void forPath = client.delete().deletingChildrenIfNeeded().forPath(path);
-
- System.out.println(forPath);
- }
-
- }