头歌zookeeper第1关:创建/删除节点
时间: 2024-11-05 20:33:53 浏览: 29
ZooKeeper是一个分布式协调服务,用于维护分布式系统中的配置信息、命名空间等数据。第一关通常涉及基础操作,如创建和删除节点(zk节点)。以下是创建和删除节点的基本步骤:
1. **创建节点(Create Node)**:
- 使用`create()`命令创建一个新的节点。例如,你可以这样创建一个名为"myNode"的数据节点:
```
String path = "/myFolder/myNode";
byte[] data = "Hello ZooKeeper!".getBytes();
zookeeper.create(path, data, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
```
`create()`方法接受路径、数据内容、权限和创建模式作为参数。这里`OPEN_ACL_UNSAFE`表示无安全限制,`EPHEMERAL`意味着节点将在会话结束时自动删除。
2. **删除节点(Delete Node)**:
- 使用`delete()`方法删除节点。如果要删除的是数据节点,首先需要确认它没有子节点:
```
zookeeper.delete(path, -1); // -1表示等待所有观察者断开连接后再删除
```
如果删除的是目录节点,可以直接调用`delete()`并指定` recursive=true`,以递归删除包含的所有子节点及其数据。
相关问题
使用Apache Curator 结合 JUnit4 通过创建单元测试方法完成以下任务: 创建一个客户端, 连接到ZooKeeper服务器, 指定namespace为niit 为节点/foo/bar设置NodeCache缓存并添加监听, 监听事件触发则打印缓存数据相关信息 分别演示创建(递归), 修改, 删除(递归)/foo/bar节点 观察日志输出.是否可以触发NodeCache的监听事件的详细步骤怎么操作
首先,需要在 Maven 项目中添加 Apache Curator 和 JUnit4 的依赖:
```xml
<dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.2</version>
<scope>test</scope>
</dependency>
</dependencies>
```
接下来,可以编写测试代码:
```java
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.cache.NodeCache;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
public class NodeCacheTest {
private static CuratorFramework client;
private static NodeCache cache;
@BeforeClass
public static void setup() throws Exception {
client = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(1000, 3));
client.start();
client.create().creatingParentsIfNeeded().forPath("/niit/foo/bar", "Hello".getBytes());
cache = new NodeCache(client, "/niit/foo/bar");
cache.start(true);
}
@AfterClass
public static void teardown() throws Exception {
cache.close();
client.delete().deletingChildrenIfNeeded().forPath("/niit");
client.close();
}
@Test
public void testNodeCache() throws Exception {
cache.getListenable().addListener(() -> {
System.out.println("Node changed: " + new String(cache.getCurrentData().getData()));
});
client.setData().forPath("/niit/foo/bar", "World".getBytes());
Thread.sleep(1000);
client.delete().deletingChildrenIfNeeded().forPath("/niit/foo/bar");
Thread.sleep(1000);
}
}
```
这段代码包含了以下步骤:
1. 创建一个 CuratorFramework 对象,连接到 ZooKeeper 服务器。
2. 使用 CuratorFramework 对象创建节点 `/niit/foo/bar` 并设置初始值为 `"Hello"`。
3. 创建一个 NodeCache 对象,指定要监听的节点为 `/niit/foo/bar`。
4. 启动节点缓存。
5. 添加监听器,当节点数据发生变化时将输出当前节点数据。
6. 修改节点数据为 `"World"`,触发监听器输出。
7. 删除节点 `/niit/foo/bar`,触发监听器输出。
运行测试代码后,可以观察到日志输出:
```
Node changed: World
Node changed: null
```
第一行表示节点数据发生了变化,变成了 `"World"`;第二行表示节点被删除。
利用Java API调用Zookeeper,实现创建节点、获取节点、修改节点、判断节点是否存在以及删除节点。
在Java中,利用Apache ZooKeeper客户端API(如ZooKeeperJDKClient或Curator框架)操作Zookeeper,你可以按照以下步骤进行:
1. **创建节点(Node Creation)**:
```java
import org.apache.zookeeper.CreateMode;
ZooKeeper zookeeper = ...; // 初始化ZooKeeper连接
String path = "/my/new/node";
zookeeper.create(path, new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
```
这里`CreateMode.EPHEMERAL`表示节点是临时的,当连接关闭时自动消失。
2. **获取节点(Node Retrieval)**:
```java
try {
byte[] data = zookeeper.getData(path, false, null); // 第三个参数为true时返回元数据
String content = new String(data);
} catch ( KeeperException | InterruptedException e ) {
e.printStackTrace();
}
```
3. **修改节点(Node Modification)**:
```java
byte[] newData = ...; // 新的数据字节数组
zookeeper.setData(path, newData, -1); // -1 表示设置版本不受限制
```
4. **判断节点是否存在(Checking Node Existence)**:
```java
boolean exists;
try {
exists = zookeeper.exists(path, false);
} catch ( KeeperException | InterruptedException e ) {
exists = false;
}
```
5. **删除节点(Deleting a Node)**:
```java
zookeeper.delete(path, -1); // 删除指定路径,-1 表示设置版本不受限制
```
注意:上述代码应在异常处理中适当捕获`KeeperException`和`InterruptedException`。
阅读全文