命令行操作
API使用
ZkClient使用
获取文章代码
首先进入zookeeper客户端
cd /bin
./zkCli.sh
命令介绍
create -s -e path data acl
-s 指顺序节点
-e 指临时节点
path 指路径,以/开头
data 指数据内容
acl 指进行权限控制
创建持久性顺序节点
create -s /zk_test 123
创建持久性节点
create /zk_test 123
创建临时顺序节点
create -s -e /zk_test 123456
因为zk_test00006是临时节点,可以通过 quit 结束当前会话后,再次进入,查看验证
命令介绍
ls path 为查看指定路径下的下一级节点->并非所有节点
如图:ls / 只能查看到 /b和/c 查看不到 /b1和/b2
get path可以获取指定节点下的数据内容
stat path可以查看指定节点的状态信息
命令介绍
set path data [version]
path 节点路径
data 更新内容
version 非必填 版本号
delete paht 删除指定路径的节点,如果该节点下存在子节点,将无法删除,需要先将子节点删除后才能够删除
导入jar,版本和zookeeper一致
<dependency>
<groupId>org.apache.zookeepergroupId>
<artifactId>zookeeperartifactId>
<version>3.7.1version>
dependency>
/**
* @Author ziye
* @Date 2022/7/28
* @Describe 创建会话
*/
public class CreateSession implements Watcher {
private static CountDownLatch countDownLatch = new CountDownLatch(1);
public static void main(String[] args) throws IOException, InterruptedException {
/*
* new Zookeeper(connectString,sessionTimeOut,Wather)
* connectString: 连接地址 -> ip:端口
* sessionTimeOut: 会话超时时间 -> 毫秒
* Wather: 监听器(当特定事件触发监听时,zookeeper会通过watcher通知到客户端)
*/
String ipAndPort = "192.168.171.128:2181";
ZooKeeper zooKeeper = new ZooKeeper(ipAndPort, 5000, new CreateSession());
System.out.println(zooKeeper.getState());
//计数工具类,不让main方法结束,让线程处于阻塞状态
countDownLatch.await();
System.out.println("连接成功...");
}
/*
* 回调方法 -> 处理来自服务器端的watcher通知
*/
@Override
public void process(WatchedEvent event) {
if (event.getState() == Event.KeeperState.SyncConnected) {
System.out.println("调用...");
countDownLatch.countDown();
}
}
}
/*
* path :节点创建的路径
* data[] :节点创建要保存的数据,是个byte类型的
* acl :节点创建的权限信息(4种类型)
* ANYONE_ID_UNSAFE : 表示任何⼈
* AUTH_IDS :此ID仅可⽤于设置ACL。它将被客户机验证的ID替换。
* OPEN_ACL_UNSAFE :这是⼀个完全开放的ACL(常⽤)--> world:anyone
* CREATOR_ALL_ACL :此ACL授予创建者身份验证ID的所有权限
* createMode :创建节点的类型(4种类型)
* PERSISTENT:持久节点
* PERSISTENT_SEQUENTIAL:持久顺序节点
* EPHEMERAL:临时节点
* EPHEMERAL_SEQUENTIAL:临时顺序节点
* 返回值为该节点名称
*/
String nodeNamePersistent = zooKeeper.create("/zy_persistent", "持久节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
String nodeNamePersistentSequential = zooKeeper.create("/zy_persistent_sequential", "持久顺序节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
String nodeNameEphemeral = zooKeeper.create("/zy_ephemeral", "临时节点".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("持久节点 " + nodeNamePersistent);
System.out.println("持久顺序节点 " + nodeNamePersistentSequential);
System.out.println("临时节点 " + nodeNameEphemeral);
/*
* path : 获取数据的路径
* watch : 是否开启监听
* stat : 节点状态信息 -> null: 表示获取最新版本的数据
* zk.getData(path, watch, stat);
*/
byte[] data = zooKeeper.getData("/zy_persistent", false, null);
System.out.println(new String(data));
/*
path:路径
watch:是否要启动监听,当⼦节点列表发⽣变化,会触发监听
zooKeeper.getChildren(path, watch);
*/
List<String> children = zooKeeper.getChildren("/", true);
System.out.println(children);
byte[] data = zooKeeper.getData("/zy_test01", false, null);
System.out.println("修改前的节点内容: " + new String(data));
/*
* path:路径
* data:要修改的内容 byte[]
* version:为-1,表示对最新版本的数据进⾏修改
* zooKeeper.setData(path, data,version);
*/
zooKeeper.setData("/zy_test01", "修改内容111".getBytes(), -1);
byte[] data1 = zooKeeper.getData("/zy_test01", false, null);
System.out.println("修改后的节点内容: " + new String(data1));
/*
* zooKeeper.exists(path,watch) :判断节点是否存在,是否监听
* zookeeper.delete(path,version) : 删除节点
*/
String nodeName = "/zy_test01";
if (zooKeeper.exists(nodeName, false) != null) {
System.out.println("删除节点前: " + zooKeeper.getChildren("/", false));
zooKeeper.delete(nodeName, -1);
System.out.println("删除 " + nodeName + " 节点成功!");
System.out.println("删除节点后: " + zooKeeper.getChildren("/", false));
} else {
System.out.println(nodeName + " 节点不存在!");
}
ZkClient client = new ZkClient("192.168.171.128:2181");
System.out.println("已经创建会话..........");
/*
* path: 路径
* createParents: 是否进行递归创建
*/
client.createPersistent("/zy_father/zy_son", true);
System.out.println("节点创建完成...");
/*
* 递归删除节点
*/
client.deleteRecursive("/zy_father");
System.out.println("节点递归删除完成...");
//获取子节点列表
List<String> children = client.getChildren("/zy_father");
System.out.println("children = " + children);
//注册监听事件
//客户端可以对一个不存在的节点进行监听,该节点的子节点发生变化或该节点被创建或删除都会触发监听
String path = "/zy_mother";
client.subscribeChildChanges(path, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println(path + " 节点发生了变化,变化后子节点为: " + currentChilds);
}
});
client.createPersistent(path);
Thread.sleep(1000);
client.createPersistent(path + "/zy_daughter");
Thread.sleep(1000);
//判断该节点是否存在
String path = "/zy_children";
boolean exists = client.exists(path);
if (!exists) {
//创建临时节点
System.out.println(path + " 节点不存在,进行节点创建...");
client.createEphemeral(path, "boy");
}
//获取节点内容
Object data = client.readData(path);
System.out.println(path + " 内容 = " + data);
//对指定节点内容进行监听
client.subscribeDataChanges(path, new IZkDataListener() {
/*
* 指定节点被更新后,该方法被执行
* dataPath: 节点路径
* data: 更新后的内容
*/
@Override
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println(dataPath + " 节点被更新了,更新后的内容为: " + data);
}
//指定节点被删除后调用该方法
@Override
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println(dataPath + " 节点被删除了...");
}
});
//更新节点
client.writeData(path, "girl");
Thread.sleep(1000);
//删除节点
client.deleteRecursive(path);
Thread.sleep(1000);
点击获取文章代码
其他章节 -> 跳转
end...