上一篇文章中,已经将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)