如今市面上有不少种zookeeper的java客户端库,咱们这儿用的是apache的zookeeper库(毕竟如今zookeeper是在apache里面维护)。
java
Zookeeper的节点都是存放在内存中的,因此读写速度很快。更新日志被记录到了磁盘中,以便用于恢复数据。在更新内在中节点数以前,会先序列化到磁盘中,而后才会加载到内存中。node
ZooKeeper中的每一个节点存储的数据要被原子性的操做。也就是说读操做将获取与节点相关的全部数据,写操做也将替换掉节点的全部数据。另外,每个节点都拥有本身的ACL(访问控制列表),这个列表规定了用户的权限,即限定了特定用户对目标节点能够执行的操做。apache
这儿用的是maven管理方式,pom.xml的配置:编程
<dependencies> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.4.3</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </exclusion> <exclusion> <groupId>log4j</groupId> <artifactId>log4j</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.2</version> </dependency> </dependencies>
Zookeeper API共包含五个包,分别为:api
(1)org.apache.zookeeper服务器
(2)org.apache.zookeeper.datasession
(3)org.apache.zookeeper.server异步
(4)org.apache.zookeeper.server.quorummaven
(5)org.apache.zookeeper.server.upgrade函数
其中org.apache.zookeeper,包含Zookeeper类,他是咱们编程时最经常使用的类文件。这个类是Zookeeper客户端的主要类文件。若是要使用Zookeeper服务,应用程序首先必须建立一个Zookeeper实例,这时就须要使用此类。一旦客户端和Zookeeper服务创建起了链接,Zookeeper系统将会给次链接会话分配一个ID值,而且客户端将会周期性的向服务器端发送心跳来维持会话链接。只要链接有效,客户端就可使用Zookeeper API来作相应处理了。
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
参数说明:
connectString:zookeeper server列表, 以逗号隔开. ZooKeeper对象初始化后, 将从server列表中选择一个server, 并尝试与其创建链接. 若是链接创建失败, 则会从列表的剩余项中选择一个server, 并再次尝试创建链接。
sessionTimeout:指定链接的超时时间。
watcher:一个 watcher 实例。
注意, 建立ZooKeeper对象时, 只要对象完成初始化便马上返回. 创建链接是以异步的形式进行的, 当链接成功创建后, 会回调watcher的process方法. 若是想要同步创建与server的链接, 须要本身进一步封装。通常咱们建立完Zookeeper以后,直接等着其链接好了以后,在watcher的process方法里面让主函数结束等待。
public String create(final String path, byte data[], List<ACL> acl, CreateMode createMode)
参数说明:
path:znode的路径,必须是绝对路径。
data:与znode关联的数据。
acl:指定权限信息, 若是不想指定权限, 能够传入Ids.OPEN_ACL_UNSAFE。
createMode:指定znode类型. CreateMode是一个枚举类, 从中选择一个成员传入便可。
createMode的可选的成员类型
PERSISTENT:建立后只要不删就永久存在
EPHEMERAL:会话结束年结点自动被删除,EPHEMERAL结点不容许有子节点
SEQUENTIAL:节点名末尾会自动追加一个10位数的单调递增的序号,同一个节点的全部子节点序号是单调递增的
PERSISTENT_SEQUENTIAL:结合PERSISTENT和SEQUENTIAL
EPHEMERAL_SEQUENTIAL:结合EPHEMERAL和SEQUENTIAL
public void delete(final String path, int version)
参数说明:
path:znode的路径,必须是绝对路径。
version:指定要删除的数据的版本, 若是version和真实的版本不一样, 删除操做将失败. 指定version为-1则忽略版本检查.
public Stat setData(final String path, byte data[], int version)
参数说明:
path:znode的路径,必须是绝对路径。
data:要设置的到znode的数据,注意数据是直接清空原来的数据,而后写新的数据,且数据的大小不能超过1MB。
version:指定要更新的数据的版本, 若是version和真实的版本不一样, 更新操做将失败. 指定version为-1则忽略版本检查。
public Stat exists(final String path, Watcher watcher)
参数说明:
path:znode的路径,必须是绝对路径。
watcher:一个 watcher 实例。
若是该node存在, 则返回该node的状态信息, 不然返回null.
public Stat exists(String path, boolean watch)
其他和上面都同样,就是boolean的若是为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher
public List<String> getChildren(final String path, Watcher watcher)
参数说明:
path:znode的路径,必须是绝对路径。
watcher:一个 watcher 实例。
若是有child存在,就返回child,若是没有的话,就会返回null
public List<String> getChildren(String path, boolean watch)
其他和上面都同样,就是boolean的若是为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher
public byte[] getData(final String path, Watcher watcher, Stat stat)
参数说明:
path:znode的路径,必须是绝对路径。
watch:用于指定是否监听path node的删除事件, 以及数据更新事件
, 注意, 不监听path node的建立事件
, 由于若是path node不存在, 该方法将抛出KeeperException.NoNodeException异常.
stat:是个传出参数, getData方法会将path node的状态信息设置到该参数中
.
public byte[] getData(String path, boolean watch, Stat stat)
其他和上面都同样,就是boolean的若是为true,表示要用watcher,这时的watcher是初始化zookeeper时候指定的watcher。
总结:这几个是最经常使用的API,熟悉了以后,基本95%多的工做均可以经过这个解决,其他的后面的API若是用到能够查文档。