Zookeeper使用-2.Api调用之使用原生包

112 阅读3分钟

上一篇文章中,已经将zk在本地环境中启动成功,本次来记录一下使用javaAPI方式进行操作一下zk服务。
常用的客户端有官方提供的包、ZkClient、Curator,ZkClient和Curator对原生的客户端包进行封装提供了更加方便的api方式。
当前文档使用原生包进行总结,ZkClient和Curator可以在下一章进行书写,如果没有,请期待下,尽快输出。


一、使用原生的api包

可以从maven仓库中看到maven坐标位置,我们创建一个maven项目,引入上下面的依赖包,即可操作zk,包的版本可以根据自己需求进行调整。

<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.6.2</version>
</dependency>

1.创建会话

直接new一个Zookeeper对象,将对应的参数通过构造函数传入,可以通过Zookeeper类进入,查看构造方法。以下方代码为例。放入一个最简单的构造函数。
参数:
connectString:zk的服务器地址 ip+port
sessionTimeout: 会话时间
watcher: 回调watcher,发生变化信息时候会通过当前watcher通知到客户端

public ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)

示例代码:

public ZooKeeper connectionZk(){
        try {
            ZooKeeper zooKeeper = new ZooKeeper(host+":"+port,5000,new ZkWatch());
            System.out.println("链接成功:"+zooKeeper.getState());
//            zooKeeper.close();
            return zooKeeper;
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

2.创建节点

创建节点提供两种方式,一种是同步创建,一种是异步创建,异步创建时候无返回参数,传入回调方法,此处以同步创建为例说明,与异步大同小异。
参数:
path:需要创建节点的路径,此处不能跨层级创建节点,只能一层一层创建,否则会进行报错
data:当前节点的数据
acl:节点的acl策略,可以使用org.apache.zookeeper.ZooDefs.Ids枚举接口
mode:节点的类型,持久,持久顺序等,参考org.apache.zookeeper.CreateMode枚举类

public String create(String path, byte[] data, List<ACL> acl, CreateMode createMode)

public void create(String path, byte[] data, List<ACL> acl, CreateMode createMode, StringCallback cb, Object ctx)

同步创建示例代码:

public void createNode() throws KeeperException, InterruptedException {
    String value = "testdata";
    ZooKeeper zooKeeper = connectionZk();
    String s = zooKeeper.create("/test/test", value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    System.out.println("创建节点输出结果:"+s);
}

异步创建示例代码:

public void asyncCreateNode(){
    String value = "testdata";
    ZooKeeper zooKeeper = connectionZk();
    zooKeeper.create("/test/async", value.getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT,new IStringCallback(),"context");
}

public class IStringCallback implements AsyncCallback.StringCallback{
    /**
     *
     * @param i code码,0 成功
     * @param s 调用时候传入的path
     * @param o 调用时候传入的ctx
     * @param s1 实际在服务期传入的真实名称
     */
    @Override
    public void processResult(int i, String s, Object o, String s1) {
        System.out.println("rc:"+i);
        System.out.println("path:"+s);
        System.out.println("o:"+o.toString());
        System.out.println("name:"+s1);
    }
}

3.删除节点

删除节点同样提供两种方式,一种是同步删除,第二种是异步删除

public void delete(String path, int version) 

public void delete(String path, int version, VoidCallback cb, Object ctx)

4.读取子节点

提供getChildren方法来获取节点下的所有子节点,提供了很多重载方法,放个最简单的,其他的和前面的类似。
参数: path:需要查询的路径。 watcher:在查询时候可以创建一个watcher对象,当此节点有发生变化的时候就会调用这个watcher对象进行数据处理。

public List<String> getChildren(String path, Watcher watcher) 
public void testGetChildren() throws KeeperException, InterruptedException {
    ZooKeeper zooKeeper = connectionZk();
    List<String> children = zooKeeper.getChildren("/test", new ZkWatch());
    for(String child : children){
        System.out.println(child);
    }
}

5.读取数据

提供getData方法进行获取节点下存储的数据,也提供两种方式,一种同步一种异步。以同步方法为例: 参数: path:指定路径的节点 watcher:在查询时候可以创建一个watcher对象,当此节点有发生变化的时候就会调用这个watcher对象进行数据处理。 stat:指定数据节点的状态信息,在获取时候,服务器会将最新的状态信息给替换传入的stat,返回给客户端。

public byte[] getData(String path, Watcher watcher, Stat stat)

6.更新数据

参数:
path:指定节点 data:需要更新的数据 version: 当前需要更新的version信息,修改哪次的版本数据,可以理解为乐观锁

public Stat setData(String path, byte[] data, int version)

示例都比较类似,暂时不放啦

7.检测节点是否存在

参数:
path:指定路径
watcher: watcher对象,用于监听节点的创建,删除,更新操作

public Stat exists(String path, Watcher watcher)