Zookeeper客户端java API

ZooKeeper是一个开源的分布式协调服务,它为分布式应用提供了简单的原语来管理分布式系统中的协调问题,如命名、配置管理、同步和组服务等。ZooKeeper的API为客户端提供了与ZooKeeper服务交互的方式。下面我们将介绍ZooKeeper的主要API及其功能。
主要API功能列表:

  1. create 创建节点
  2. getData 获取数据
  3. SetData 设置节点数据
  4. delete 删除节点
  5. exists 存在性检查
  6. GetChildren 获取子节点
  7. SetACL 设置ACL
  8. getACL 获取ACL信息

值得注意的是zookeeper 客户端API针对上述的这些方法分别提供了同步版本和异步版本。

0 创建连接

客户端通过ZooKeeper类创建到服务器端的连接。
ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)
connectString: 连接字符串,可以指定一个获多个zk服务器地址,多个地址用逗号连接。例如192.168.10.20:2181,192.168.10.21:2181,192.168.10.22:2181
sessionTimeout:会话超时时间,单位milliseconds。
watcher:监听器。
代码如下

ZooKeeper zooKeeper = new ZooKeeper("127.0.0.1:2181", 3000, null);

如果需要设置watcher,则最后一个参数需要传Watcher实现类的对象。

ZooKeeper zooKeeper = new ZooKeeper("127.0.0.1:2181", 3000, new MyWatcher());
public class MyWatcher implements Watcher {
    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("watchedEvent = " + watchedEvent);
        System.out.println(watchedEvent.getPath());
        System.out.println(watchedEvent.getType());
    }
}

ZooKeeper构造函数还有多个重载方法如下

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,ZKClientConfig conf) throws IOException
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,boolean canBeReadOnly, HostProvider aHostProvider)throws IOException
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,boolean canBeReadOnly, HostProvider aHostProvider,ZKClientConfig clientConfig) throws IOException 
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,boolean canBeReadOnly) throws IOException
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,boolean canBeReadOnly, ZKClientConfig conf) throws IOException
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd)throws IOException
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd, boolean canBeReadOnly,HostProvider aHostProvider) throws IOException 
public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher,long sessionId, byte[] sessionPasswd, boolean canBeReadOnly)throws IOException

1. 创建(Create)

同步版本:
create(final String path, byte[] data, List<ACL> acl, CreateMode createMode)
create(final String path, byte data[], List<ACL> acl,CreateMode createMode, Stat stat)
异步版本:
create(final String path, byte data[], List<ACL> acl,CreateMode createMode, StringCallback cb, Object ctx)
参数解析:
path:要创建的znode的路径。
data:znode的数据。如果znode是临时的或顺序的,则数据可以为null。
acl:访问控制列表,用于控制对znode的访问权限。
createMode:znode的创建模式,如EPHEMERAL(临时)、SEQUENTIAL(顺序)等。
stat:Stat节点状态信息,包含czxid, mzxid,ctime,version等字段信息,但是不包含具体数据
cb: StringCallBack回调,异步处理完成时候回调的接口,开发人员所需要实现StringCallBack子类,实现具体的processResult函数
ctx: 上下文信息

代码

//同步
String s1 = zooKeeper.create("/test1", new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("s1 = " + s1);
//异步
Object ctx = new Object();
zooKeeper.create(parentPath, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT, new AsyncCallback.StringCallback() {
    @Override
    public void processResult(int rc, String path, Object ctx, String name) {
   		//在这里处理返回的结果
       System.out.println("rc = " + rc);
    }
}, ctx);

2. 获取数据(GetData)

getData(final String path, Watcher watcher, Stat stat)
getData(final String path, Watcher watcher,DataCallback cb, Object ctx)
path:要获取数据的znode的路径。
watcher:一个可选的Watcher对象,当znode的数据发生变化时会被触发。
stat:一个Stat对象,用于存储znode的元数据。
cb: DataCallback 实现类对象,在实现方法中处理异步返回的结果

代码

Stat stat = new Stat();
byte[] data = zooKeeper.getData("/test", null, stat);
System.out.println("data = " + new String(data));
Object ctx = new Object();
zooKeeper.getData("/test", null, new DataCallback() {
    @Override
    public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
          //在这里处理返回的结果      
    }
}, ctx);

3. 设置数据(SetData)

setData(String path, byte[] data, int version)
setData(final String path, byte data[], int version,StatCallback cb, Object ctx)
path:要设置数据的znode的路径。
data:新的数据内容。
version:znode数据的版本号。如果设置为-1,则忽略版本检查。
cb: StatCallback 实现类对象,实现函数中处理返回结果
ctx: 上下文参数

        Stat stat = zooKeeper.setData("/test", "123".getBytes(), 1);
        System.out.println("stat = " + stat);
        Object ctx = new Object();
        zooKeeper.setData("/test", "123".getBytes(),2,  new StatCallback(){
            @Override
            public void processResult(int rc, String path, Object ctx, Stat stat) {

            }
        }, ctx);

4. 删除(Delete)

delete(String path, int version)
delete(final String path, int version, VoidCallback cb,Object ctx)
path:要删除的znode的路径。
version:要删除的znode的版本号。如果设置为-1,则忽略版本检查。
cb: VoidCallback 实现类对象
ctx: 上下文参数

		zooKeeper.delete("/test", 1);
		Object ctx = new Object();
        zooKeeper.delete("/test", 1, new VoidCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx) {
				//process result
            }
        }, ctx);

5. 存在性检查(Exists)

同步
exists(String path, Watcher watcher)
异步
exists(final String path, Watcher watcher,StatCallback cb, Object ctx)
path:要检查存在性的znode的路径。
watcher:一个可选的Watcher对象,当znode的存在性发生变化时会被触发。
cb: StatCallback 回调对象
ctx: 上下文参数
代码

		Stat exists = zooKeeper.exists("/test", null);
		System.out.println("exists = " + exists.toString());
        Object ctx = new Object();
        zooKeeper.exists("/test", null, new StatCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, Stat stat) {
				//处理返回结果
            }
        }, ctx);
        System.out.println("exists = " + exists.toString());

6. 获取子节点(GetChildren)

getChildren(final String path, Watcher watcher)
getChildren(final String path, Watcher watcher, ChildrenCallback cb, Object ctx)
path:要获取子节点的znode的路径。
watcher:一个可选的Watcher对象,当znode的子节点列表发生变化时会被触发。
cb: ChildrenCallback 实现类对象, 在回调函数中处理返回结果
ctx: 上下文参数

        List<String> list = zooKeeper.getChildren("/test", null);
        System.out.println("list = " + list);
        Object ctx = new Object();
        zooKeeper.getChildren("/test", null, new ChildrenCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, List<String> children) {
                
            }
        }, ctx);

7. 设置ACL(SetACL)

setACL(String path, List<ACL> acl, int version)
setACL(final String path, List<ACL> acl, int version,StatCallback cb, Object ctx)
path:要设置ACL的znode的路径。
acl:新的ACL列表。
version:znode的版本号。如果设置为-1,则忽略版本检查。
cb: StatCallback 实现类对象
ctx:上下文参数

        Stat stat = zooKeeper.setACL("/test", ZooDefs.Ids.OPEN_ACL_UNSAFE, 2);
        System.out.println("stat = " + stat);
        Object ctx = new Object();
        zooKeeper.setACL("/test", ZooDefs.Ids.OPEN_ACL_UNSAFE, 2, new StatCallback(){
            @Override
            public void processResult(int rc, String path, Object ctx, Stat stat) {
            
            }
        }, ctx);

8. 获取ACL(GetACL)

getACL(String path, Stat stat)
path:要获取ACL的znode的路径。
stat:一个Stat对象,用于存储znode的元数据。
cb: StatCallback 实现类对象
ctx:上下文参数

        Stat stat = new Stat();
        List<ACL>  aclList = zooKeeper.getACL("/test", stat);
        System.out.println("aclList = " + aclList);
        Object ctx = new Object();
        Stat stat2= new Stat();
        zooKeeper.getACL("/test", stat2, new ACLCallback() {
            @Override
            public void processResult(int rc, String path, Object ctx, List<ACL> acl, Stat stat) {

            }
        }, ctx);

9. 创建Watcher

ZooKeeper的API还提供了创建Watcher的机制,以便客户端能够在znode的事件(如数据变化、子节点变化、存在性变化等)发生时得到通知。Watcher是一次性的,触发后需要重新设置。
设置watch方式是在以上api调用的时候,参数需要传递对应的Watcher
例如exists调用过程中设置Watcher,可以传递Watcher 实现类对象到参数上。
但是有的方法watch参数是boolean类型的,如果值为true会设置为客户端默认Watcher

Stat exists = zooKeeper.exists("/test", new MyWather());
public class MyWatcher implements Watcher {
    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("watchedEvent = " + watchedEvent);
        System.out.println(watchedEvent.getPath());
        System.out.println(watchedEvent.getType());
    }
}

10. 其他API

此外,ZooKeeper的API还提供了其他一些功能,如同步(sync)、多路径操作(multi)等。

总结

ZooKeeper的API为分布式应用提供了丰富的原语来管理协调问题。通过创建、获取数据、设置数据、删除、存在性检查、获取子节点、设置ACL、获取ACL等操作,客户端可以与ZooKeeper服务进行交互,实现分布式系统中的各种协调需求。同时,Watcher机制使得客户端能够及时响应znode事件,保证系统的实时性和可靠性。

  • 24
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值