zk常用命令:
进入zk文件夹下:
bin/zkCli.sh -server 127.0.0.1:2181 //连接zk服务器进入客户端
quit //退出zk客户端
bin/zkServer.sh start //启动ZK服务
bin/zkServer.sh status //查看ZK服务状态
bin/zkServer.sh stop //停止ZK服务
bin/zkServer.sh restart //重启ZK服务
进入客户端:
ls / //查看
create /node msg //新建节点
delete / //删除节点
set /node new-msg //修改节点数据
get / //获取节点信息
java客户端连接:
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
public class ZkConnecter {
public static final Logger LOGGER = LoggerFactory.getLogger(ZkConnecter.class);
public List<String> nodeList = new ArrayList<String>();//存放节点集合,并且监控变化
public ZooKeeper zooKeeper;
public ZkConnecter(){}
public void createData() throws IOException { //向zk中添加数据
zooKeeper = new ZooKeeper(Constant.url, Constant.SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent watchedEvent) {
//不做事情
}
});
if(zooKeeper != null){
try {
Stat stat = zooKeeper.exists(Constant.REGISTRY_PATH, false);
if(stat == null)
zooKeeper.create(Constant.REGISTRY_PATH, null, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//znode不自动删除
zooKeeper.create(Constant.DATA_PATH, "yanyingnan最近表现不错".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);//znode自动删除,且下次新建节点序号加一
// zooKeeper.create(Constant.DATA_PATH, "yanyingnan最近表现不错".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//znod不自动删除,下次就会有冲突报KeeperException异常
} catch (KeeperException e) {
LOGGER.error("{}", e);
e.printStackTrace();
} catch (InterruptedException e) {
LOGGER.error("{}", e);
e.printStackTrace();
}
System.out.println("znode节点创建成功,并且数据写入数据成功...");
}else {
LOGGER.info("zooKeeper connect is false!!!");
}
}
public void connect() throws IOException {
zooKeeper = new ZooKeeper(Constant.url, Constant.SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent watchedEvent) {
if(watchedEvent.getState().equals(Event.KeeperState.SyncConnected))
doSomething();
if (watchedEvent.getType() == Event.EventType.NodeChildrenChanged)
doSomethingForChanged();
}
});
doSomethingForChanged();//测试doSomethingForChanged()方法
}
private void doSomething() {
System.out.println("业务处理中blablabla...");
}
private void doSomethingForChanged() {
try {
List<String> childrenList = zooKeeper.getChildren(Constant.REGISTRY_PATH, true);
List<String> tempList = new ArrayList<String>();
for (String children : childrenList) {
byte[] bytes = zooKeeper.getData(Constant.REGISTRY_PATH + "/" + children, false, null);
tempList.add(new String(bytes));
}
this.nodeList = tempList;
System.out.println("节点数据更新成了:" + nodeList);
} catch (KeeperException e) {
LOGGER.error("{}", e);
} catch (InterruptedException e) {
LOGGER.error("{}", e);
}
}
}