Zookeeper入门之使用curator连接zookeeper并且进行节点的增删改查及ACL

我使用的是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()作为一个原子操作提交

具体代码实现模板:

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. package com.git.zookeeper.passwordmanager;  
  2.   
  3. import java.util.ArrayList;  
  4. import java.util.List;  
  5. import java.util.concurrent.ExecutorService;  
  6. import java.util.concurrent.Executors;  
  7.   
  8. import org.apache.curator.RetryPolicy;  
  9. import org.apache.curator.framework.CuratorFramework;  
  10. import org.apache.curator.framework.CuratorFrameworkFactory;  
  11. import org.apache.curator.framework.api.ACLProvider;  
  12. import org.apache.curator.framework.recipes.cache.NodeCache;  
  13. import org.apache.curator.framework.recipes.cache.NodeCacheListener;  
  14. import org.apache.curator.framework.recipes.cache.PathChildrenCache;  
  15. import org.apache.curator.framework.recipes.cache.PathChildrenCache.StartMode;  
  16. import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent;  
  17. import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener;  
  18. import org.apache.curator.retry.ExponentialBackoffRetry;  
  19. import org.apache.curator.retry.RetryNTimes;  
  20. import org.apache.zookeeper.WatchedEvent;  
  21. import org.apache.zookeeper.Watcher;  
  22. import org.apache.zookeeper.ZooDefs;  
  23. import org.apache.zookeeper.ZooDefs.Perms;  
  24. import org.apache.zookeeper.data.ACL;  
  25. import org.apache.zookeeper.data.Id;  
  26. import org.apache.zookeeper.data.Stat;  
  27.   
  28. /** 
  29.  * curator管理zookeeper的相关方法工具类 
  30.  * @author songqinghu 
  31.  * 要点: 
  32.  * 1.连接的建立  (两种 OK--使用权限方式) 
  33.  * 2.节点的管理操作,增删改查--层叠节点的操作(OK --设立命名空间) 
  34.  * 3.节点的监听操作,和无限监听事件触发 
  35.  * 4.节点的访问控制ACL操作,密码的添加,修改 
  36.  * 5.节点原子性操作 
  37.  * 6.节点的分布式锁操作 
  38.  */  
  39. public class ZookeeperCuratorUtils {  
  40.   
  41.     /** 
  42.      * 先测试玩玩   
  43.      * @描述:XXXXXXX 
  44.      * @param args 
  45.      * @return void 
  46.      * @exception 
  47.      * @createTime:2016年5月17日 
  48.      * @author: songqinghu 
  49.      * @throws Exception  
  50.      */   
  51.     public static void main(String[] args) throws Exception {  
  52.        // nodesList(clientOne(), "/");  
  53.         CuratorFramework client = clientTwo();  
  54.         //nodesList(client, "/");  
  55.         //使用clientTwo来创建一个节点空间 查看是加密  
  56.        // createNode(client, "/usermanager");  
  57.         //setDataNode(client, "/usermanager", "test writer 测试写入效果!");  
  58.       //  getDataNode(client, "/usermanager");  
  59.        // createNode(client, "/three/two/testone");  
  60.       //  deleteDataNode(client, "/three");;  
  61.     }  
  62.   
  63.     /** 
  64.      *  
  65.      * @描述:创建一个zookeeper连接---连接方式一: 最简单的连接 
  66.      * @return void 
  67.      * @exception 
  68.      * @createTime:2016年5月17日 
  69.      * @author: songqinghu 
  70.      */  
  71.     private static CuratorFramework clientOne(){  
  72.         //zk 地址  
  73.         String connectString = "10.125.2.44:2181";  
  74.         // 连接时间 和重试次数  
  75.         RetryPolicy retryPolicy = new ExponentialBackoffRetry(10003);  
  76.         CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);  
  77.         client.start();  
  78.         return client;  
  79.     }  
  80.       
  81.     /** 
  82.      *  
  83.      * @描述:创建一个zookeeper连接---连接方式二:优选这个 
  84.      * @return void 
  85.      * @exception 
  86.      * @createTime:2016年5月17日 
  87.      * @author: songqinghu 
  88.      */  
  89.     private static CuratorFramework clientTwo(){  
  90.   
  91.         //默认创建的根节点是没有做权限控制的--需要自己手动加权限???----  
  92.         ACLProvider aclProvider = new ACLProvider() {  
  93.             private List<ACL> acl ;  
  94.             @Override  
  95.             public List<ACL> getDefaultAcl() {  
  96.                 if(acl ==null){  
  97.                     ArrayList<ACL> acl = ZooDefs.Ids.CREATOR_ALL_ACL;  
  98.                     acl.clear();  
  99.                     acl.add(new ACL(Perms.ALL, new Id("auth""admin:admin") ));  
  100.                     this.acl = acl;  
  101.                 }  
  102.                 return acl;  
  103.             }  
  104.             @Override  
  105.             public List<ACL> getAclForPath(String path) {  
  106.                 return acl;  
  107.             }  
  108.         };  
  109.         String scheme = "digest";  
  110.         byte[] auth = "admin:admin".getBytes();  
  111.         int connectionTimeoutMs = 5000;  
  112.         String connectString = "10.125.2.44:2181";  
  113.         String namespace = "testnamespace";  
  114.         CuratorFramework client = CuratorFrameworkFactory.builder().aclProvider(aclProvider).  
  115.         authorization(scheme, auth).  
  116.         connectionTimeoutMs(connectionTimeoutMs).  
  117.         connectString(connectString).  
  118.          namespace(namespace).  
  119.         retryPolicy(new RetryNTimes(Integer.MAX_VALUE, 1000)).build();  
  120.         client.start();  
  121.         return client;  
  122.     }  
  123.       
  124.     /** 
  125.      *  
  126.      * @描述:获取子节点列表 打印 
  127.      * @return void 
  128.      * @exception 
  129.      * @createTime:2016年5月17日 
  130.      * @author: songqinghu 
  131.      * @throws Exception  
  132.      */  
  133.     private static void nodesList(CuratorFramework client,String parentPath) throws Exception{  
  134.         List<String> paths = client.getChildren().forPath(parentPath);  
  135.         for (String path : paths) {  
  136.             System.out.println(path);  
  137.         }  
  138.     }  
  139.     /** 
  140.      *  
  141.      * @描述:创建一个节点  
  142.      * @param path 
  143.      * @return void 
  144.      * @exception 
  145.      * @createTime:2016年5月17日 
  146.      * @author: songqinghu 
  147.      * @throws Exception  
  148.      */  
  149.     private static void createNode(CuratorFramework client,String path) throws Exception{  
  150.           
  151.         Stat stat = client.checkExists().forPath(path);  
  152.         System.out.println(stat);  
  153.         String forPath = client.create().creatingParentsIfNeeded().forPath(path, "create init !".getBytes());  
  154.        // String forPath = client.create().forPath(path);  
  155.         System.out.println(forPath);  
  156.     }  
  157.       
  158.     /** 
  159.      * 获取指定节点中信息 
  160.      * @throws Exception  
  161.      */  
  162.     private static void getDataNode(CuratorFramework client,String path) throws Exception{  
  163.         Stat stat = client.checkExists().forPath(path);  
  164.         System.out.println(stat);  
  165.         byte[] datas = client.getData().forPath(path);  
  166.         System.out.println(new String(datas));  
  167.     }  
  168.     /** 
  169.      *  
  170.      * @描述:设置节点中的信息 
  171.      * @param client 
  172.      * @param path 
  173.      * @param message 
  174.      * @return void 
  175.      * @exception 
  176.      * @createTime:2016年5月17日 
  177.      * @author: songqinghu 
  178.      * @throws Exception  
  179.      */  
  180.     private static void setDataNode(CuratorFramework client,String path,String message) throws Exception{  
  181.           
  182.         Stat stat = client.checkExists().forPath(path);  
  183.         System.out.println(stat);  
  184.         client.setData().forPath(path, message.getBytes());  
  185.     }  
  186.       
  187.     private static void deleteDataNode(CuratorFramework client,String path) throws Exception{  
  188.           
  189.         Stat stat = client.checkExists().forPath(path);  
  190.         System.out.println("deleteNode : "+stat);  
  191.           
  192.         Void forPath = client.delete().deletingChildrenIfNeeded().forPath(path);  
  193.           
  194.         System.out.println(forPath);  
  195.     }  
  196.   
  197. }  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值