本文属于分布式系统学习笔记系列,上篇文章整理了zookeeper安装,本文继续整理第5章zookeeper使用,只做简单演示。
1.1 创建
create [-s] [-e] path data acl
-s -e分别代表顺序、临时节点,不用默认的是永久节点。
acl表示访问权限,默认是不做任何权限控制。
1.2 获取
ls 是列出指定节点的所有子节点。
用法: ls path [watch]
get 获取指定节点的数据。
用法: get path [watch]
1.3 更新
set 更新指定节点的数据内容。
用法:set path data [version]
version表示节点数据是由版本的。
1.4 删除
delete 删除指定节点
用法:delete path [version]
下面是一个简单演示。
书上介绍了比较多的方式,这里只筛选一小部分基于zkClient实现。
首先在maven里面引入依赖配置:
com.github.sgroschupf
zkclient
0.1
org.apache.zookeeper
zookeeper
3.4.3
创建会话
private void initZk() {
String zkServers = "192.168.190.36:2181";
String expireTime ="60000";
try {
if(zk!=null){
try {
zk.close();
} catch (InterruptedException e1) {
log.error(e1.getMessage(), e1);
}
}
zk = new ZooKeeper(zkServers, Integer.parseInt(expireTime), new Watcher() {
@Override
public void process(WatchedEvent event) {
log.info(event.toString());
}
});
}
catch (NumberFormatException e) {
log.error(e.getMessage(), e);
}
catch (IOException e) {
log.error(e.getMessage(), e);
}
}
public boolean exists(String path) {
Stat stat = null;
try {
stat = zk.exists(path, false);
}
catch (KeeperException e) {
log.error(e.getMessage(), e);
if (e.code() == KeeperException.Code.SESSIONEXPIRED) {
initZk();
return exists(path);
}
}
catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
return stat != null;
}
public boolean createNewFile(String path) {
boolean succuess = false;
String parentPath = path.substring(0, path.lastIndexOf('/'));
if (!"/".equals(parentPath)&&!"".equals(parentPath)) {
if (!exists(parentPath)) {
createNewFile(parentPath);
}
}
try {
zk.create(path, null, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
succuess = true;
}
catch (KeeperException e) {
if (e.code() == KeeperException.Code.NODEEXISTS) {
return false;
}
if (e.code() == KeeperException.Code.SESSIONEXPIRED||e.code()==KeeperException.Code.CONNECTIONLOSS) {
initZk();
return createNewFile(path);
}
log.error(e.getMessage(), e);
}
catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
return succuess;
}
//设置对应znode下的数据 , -1表示匹配所有版本
public boolean setFileData(String path,byte[] data)
{
boolean succuess = false;
try {
zk.setData(path, data, -1);
} catch (KeeperException e) {
if (e.code() == KeeperException.Code.SESSIONEXPIRED) {
initZk();
return setFileData(path,data);
}
log.error(e.getMessage(), e);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
return succuess;
}
测试demo
public class ZKTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
ZookeeperOperator oper = new ZookeeperOperator();
oper.createNewFile("/zktest/a");
oper.setFileData("/zktest/a", "1".getBytes());
boolean res =oper.exists("/zktest/a");
System.out.println(res);
}
}
本机输出:
我们看下服务器的过程:参见下面的截图,红线之上是java程序运行之前,红线后是java程序运行之后。
可见确实能方便用java来操作zookeeper的结点。
下面是书上的listener例子
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
public class ZKTest {
public static void main(String[] args) throws InterruptedException {
// TODO Auto-generated method stub
ZkClient client = new ZkClient("192.168.190.36:2181",50000);
String path ="/zktest/a";
client.writeData(path, "2");
client.subscribeDataChanges(path, new IZkDataListener(){
@Override
public void handleDataChange(String dataPath, Object data)
throws Exception {
System.out.println("node"+dataPath+"chaged,new data:"+data);
}
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("node"+dataPath+"deleted");
}
});
System.out.println( client.readData(path) );
client.writeData(path, "4");
System.out.println( "begin sleep" );
Thread.sleep(20000);
System.out.println( "over" );
}
}
总结:
本文简单总结第5章的zookeeper使用,下一篇是结合第6章的典型zookeeper场景来学习。