ZooKeeper客户端编程入门


最近再看一个使用ZooKeeper的项目源代码,用C语言编写,但是ZooKeeper在C客户端方面的资料不太多,于是先学习了一下Java版本的客户端,C版本的客户端类似,先将这两天所看到的内容分享如下。

ZooKeeper是一个优秀的分布式协同工具,很多分布式项目都基于它进行架构设计,不过要想要对其有一个深入的理解(如果你想阅读其源代码),对其客户端API的熟悉必不可少。下面就简要记录一下ZooKeeper中各个API的简单用法。

这篇文章不打算对ZooKeeper的基本概念及安装进行讲解,想要了解这部分内容可以参考:http://zookeeper.apache.org/doc/r3.4.3/zookeeperOver.html ,

或者可以参考:http://zookeeper.apache.org/doc/r3.4.3/zookeeperProgrammers.html

均是官方文档,这也是想要学习某个开源工具必须的先行步骤,并且官网上的文档也应该算是最权威的,不过ZooKeeper在这方面的文档不怎么多,但作为入门了解,还是非常有用的。

下面将从基本用法,Watchert的用法,异步调用以及ACL四个方面对ZooKeeper客户端编程作简要介绍。

当完成这四个方面的理解以后,就可以使用ZK完成一些更加高级的任务,如分布式锁、Master选举、一致性服务保障、配置管理等。官方文档对此也有简要介绍,

参考:http://zookeeper.apache.org/doc/r3.4.3/recipes.html

基本数据结构

  1. class Stat {  
  2.   private long czxid;  
  3.   private long mzxid;  
  4.   private long ctime;  
  5.   private long mtime;  
  6.   private int version;  
  7.   private int cversion;  
  8.   private int aversion;  
  9.   private long ephemeralOwner;  
  10.   private int dataLength;  
  11.   private int numChildren;  
  12.   private long pzxid;  
  13. }  
  14. class Id {  
  15.   private String scheme;    //world、auth、digest、ip   
  16.   private String id;  
  17. }   
  18. class ACL {  
  19.   private int perms;    //CREATE、READ、WRITE、DELETE、ADMIN   
  20.   private org.apache.zookeeper.data.Id id;  
  21. }  

基本使用

  1. try {      
  2.       static String hostport = "127.0.0.1:2181";  
  3.       ZooKeeper zooKeeper = new ZooKeeper(hostport, 300000null);    //创建一个ZooKeeper实例,不设置默认watcher   
  4.       String path = "/test";  
  5.       zooKeeper.create(path, path.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);    //创建一个节点   
  6.       Stat stat = new Stat();  
  7.       byte[] b = zooKeeper.getData(path, false, stat);    //获取节点的信息及存储的数据   
  8.       System.out.println(stat);  
  9.       System.out.println(new String(b));  
  10.       stat = zooKeeper.exists(path, false);    //查看path所代表的节点是否存在   
  11.       zooKeeper.setData(path, "helloworld".getBytes(), stat.getVersion());    //设置节点的数据   
  12.       //zooKeeper.delete(path, -1);    //删除节点   
  13.       zooKeeper.close();    //关闭实例   
  14. catch (Exception e) {  
  15.       e.printStackTrace();  
  16. }  

ZooKeeper通过Auth和ACL完成节点的权限控制。

Auth表示某种认证,由于一个ZooKeeper集群可能被多个项目使用,各个项目属于不同的项目组,他们在进行开发时肯定不想其他项目访问与自己相关的节点,这时可以通过为每个项目组分配一个Auth,然后每个项目组先通过Auth认证以后再继续相关的操作,这样甲Auth认证的用户就不能操作其他Auth认证后创建的节点,从而实现各个项目之间的隔离。ZooKeeper提供了如下方法完成认证,如下所示:

Void addAuthInfo(String scheme, byte[] auth) ,使用示例如下:

  1. @Test  
  2.     public void testFirstStep() {  
  3.         try {  
  4.             zk = new ZooKeeper(hostport, 1000000null);  
  5.               
  6.             String auth_type = "digest";  
  7.             String auth = "joey:some";  
  8.               
  9.             String p = "/acl_digest";  
  10.               
  11.             zk.addAuthInfo(auth_type, auth.getBytes());  
  12.               
  13.             zk.create(p, "hello".getBytes(), Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);  
  14.               
  15.             Stat stat = new Stat();  
  16.             System.out.println(new String(zk.getData(p, false, stat)));  
  17.   
  18.             zk.close();  
  19.         } catch(Exception ex) {  
  20.             ex.printStackTrace();  
  21.         }  
  22.     }  
  23.     @Test  
  24.     public void testSecondStep() {  
  25.         String p = "/acl_digest";  
  26.       
  27.     try {  
  28.         zk = new ZooKeeper(hostport, 1000000null);  
  29.           
  30.         String authType = "digest";  
  31.          String badAuth = "joey:someBAD";  
  32.               
  33.             zk.addAuthInfo(authType, badAuth.getBytes());  
  34.             Stat stat = new Stat();  
  35.             System.out.println(new String(zk.getData(p, false, stat)));  
  36.         } catch(Exception ex) {  
  37.             ex.printStackTrace();  //抛出异常   
  38.         } finally {  
  39.             try {  
  40.                 zk.delete(p, -1);  
  41.                 zk.close();  
  42.             } catch (Exception e) {  
  43.                 e.printStackTrace();  
  44.             }  
  45.               
  46.         }  
  47.     }  

ACL用于控制Znode的访问,和Unix文件访问权限类似,提供对某类用户设置某种权限的能力(如Unix中对Owner提供读、写、执行的权限),但是在ZooKeeper中没有Owner、Group等概念,于是在ZooKeeper中使用ID表示某一类用户,可以对ID设置某种权限。(ZooKeeper对ID的数量没有限制,不像Unix文件仅支持三种类型用户)

  • 1
  • 2
  • 下一页

相关内容