ZooKeeper客户端编程入门
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
基本数据结构
- class Stat {
- private long czxid;
- private long mzxid;
- private long ctime;
- private long mtime;
- private int version;
- private int cversion;
- private int aversion;
- private long ephemeralOwner;
- private int dataLength;
- private int numChildren;
- private long pzxid;
- }
- class Id {
- private String scheme; //world、auth、digest、ip
- private String id;
- }
- class ACL {
- private int perms; //CREATE、READ、WRITE、DELETE、ADMIN
- private org.apache.zookeeper.data.Id id;
- }
基本使用
- try {
- static String hostport = "127.0.0.1:2181";
- ZooKeeper zooKeeper = new ZooKeeper(hostport, 300000, null); //创建一个ZooKeeper实例,不设置默认watcher
- String path = "/test";
- zooKeeper.create(path, path.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); //创建一个节点
- Stat stat = new Stat();
- byte[] b = zooKeeper.getData(path, false, stat); //获取节点的信息及存储的数据
- System.out.println(stat);
- System.out.println(new String(b));
- stat = zooKeeper.exists(path, false); //查看path所代表的节点是否存在
- zooKeeper.setData(path, "helloworld".getBytes(), stat.getVersion()); //设置节点的数据
- //zooKeeper.delete(path, -1); //删除节点
- zooKeeper.close(); //关闭实例
- } catch (Exception e) {
- e.printStackTrace();
- }
ZooKeeper通过Auth和ACL完成节点的权限控制。
Auth表示某种认证,由于一个ZooKeeper集群可能被多个项目使用,各个项目属于不同的项目组,他们在进行开发时肯定不想其他项目访问与自己相关的节点,这时可以通过为每个项目组分配一个Auth,然后每个项目组先通过Auth认证以后再继续相关的操作,这样甲Auth认证的用户就不能操作其他Auth认证后创建的节点,从而实现各个项目之间的隔离。ZooKeeper提供了如下方法完成认证,如下所示:
Void addAuthInfo(String scheme, byte[] auth) ,使用示例如下:
- @Test
- public void testFirstStep() {
ACL用于控制Znode的访问,和Unix文件访问权限类似,提供对某类用户设置某种权限的能力(如Unix中对Owner提供读、写、执行的权限),但是在ZooKeeper中没有Owner、Group等概念,于是在ZooKeeper中使用ID表示某一类用户,可以对ID设置某种权限。(ZooKeeper对ID的数量没有限制,不像Unix文件仅支持三种类型用户)
|
评论暂时关闭