使用Curator也可以简化Ephemeral Node (临时节点)的操作。 临时节点驻存在ZooKeeper中,当连接和session断掉时被删除。
比如通过ZooKeeper发布服务,服务启动时将自己的信息注册为临时节点,当服务断掉时ZooKeeper将此临时节点删除,这样client就不会得到服务的信息了。
PersistentEphemeralNode
类代表临时节点。 通过下面的构造函数创建:
public PersistentEphemeralNode(CuratorFramework client,
PersistentEphemeralNode.Mode mode,
String basePath,
byte[] data)
参数说明:
- client – client instance
- mode – creation/protection mode
- basePath – the base path for the node
- data – data for the node
其它参数还好理解, 不好理解的是PersistentEphemeralNode.Mode。
- EPHEMERAL: 以ZooKeeper的 CreateMode.EPHEMERAL方式创建节点。
- EPHEMERAL_SEQUENTIAL: 如果path已经存在,以CreateMode.EPHEMERAL创建节点,否则以CreateMode.EPHEMERAL_SEQUENTIAL方式创建节点。
- PROTECTED_EPHEMERAL: 以CreateMode.EPHEMERAL创建,提供保护方式。
- PROTECTED_EPHEMERAL_SEQUENTIAL: 类似EPHEMERAL_SEQUENTIAL,提供保护方式。
保护方式是指一种很边缘的情况: 当服务器将节点创建好,但是节点名还没有返回给client,这时候服务器可能崩溃了,然后此时ZK session仍然合法, 所以此临时节点不会被删除。对于client来说, 它无法知道哪个节点是它们创建的。
即使不是sequential-ephemeral,也可能服务器创建成功但是客户端由于某些原因不知道创建的节点。
Curator对这些可能无人看管的节点提供了保护机制。 这些节点创建时会加上一个GUID。 如果节点创建失败正常的重试机制会发生。 重试时, 首先搜索父path, 根据GUID搜索节点,如果找到这样的节点, 则认为这些节点是第一次尝试创建时创建成功但丢失的节点,然后返回给调用者。
节点必须调用start
方法启动。 不用时调用close
方法。
PersistentEphemeralNode 内部自己处理错误状态。
我们的例子创建了两个节点,一个是临时节点,一个事持久化的节点。 可以看到, client重连后临时节点不存在了。
package com.colobu.zkrecipe.node;
import java.util.concurrent.TimeUnit;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode;
import org.apache.curator.framework.recipes.nodes.PersistentEphemeralNode.Mode;
import org.apache.curator.framework.state.ConnectionState;
import org.apache.curator.framework.state.ConnectionStateListener;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.curator.test.KillSession;
import org.apache.curator.test.TestingServer;
import org.apache.curator.utils.CloseableUtils;
public class PersistentEphemeralNodeExample {
private static final String PATH = "/example/ephemeralNode";
private static final String PATH2 = "/example/node";
public static void main(String[] args) throws Exception {
TestingServer server = new TestingServer();
CuratorFramework client = null;
PersistentEphemeralNode node = null;
try {
client = CuratorFrameworkFactory.newClient(server.getConnectString(), new ExponentialBackoffRetry(1000, 3));
client.getConnectionStateListenable().addListener(new ConnectionStateListener() {
@Override
public void stateChanged(CuratorFramework client, ConnectionState newState) {
System.out.println("client state:" + newState.name());
}
});
client.start();
//http://zookeeper.apache.org/doc/r3.2.2/api/org/apache/zookeeper/CreateMode.html
node = new PersistentEphemeralNode(client, Mode.EPHEMERAL,PATH, "test".getBytes());
node.start();
node.waitForInitialCreate(3, TimeUnit.SECONDS);
String actualPath = node.getActualPath();
System.out.println("node " + actualPath + " value: " + new String(client.getData().forPath(actualPath)));
client.create().forPath(PATH2, "persistent node".getBytes());
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
KillSession.kill(client.getZookeeperClient().getZooKeeper(), server.getConnectString());
System.out.println("node " + actualPath + " doesn't exist: " + (client.checkExists().forPath(actualPath) == null));
System.out.println("node " + PATH2 + " value: " + new String(client.getData().forPath(PATH2)));
} catch (Exception ex) {
ex.printStackTrace();
} finally {
CloseableUtils.closeQuietly(node);
CloseableUtils.closeQuietly(client);
CloseableUtils.closeQuietly(server);
}
}
}
相关推荐
2. 读取配置:使用`getData()`方法从Zookeeper获取特定路径的配置信息,通常这个路径对应于微服务的配置节点。 ```java byte[] data = zookeeper.getData("/config/serviceA", false, null); String config = new ...
ZooKeeper 的使用方法实例详解可以分为四个基本要求:(1)客户端所带参数、(2)ZooKeeper 服务地址、(3)被监视的 Znode 节点名称、(4)可执行程序及其所带的参数。 在 ZooKeeper 的 Java API 中,开发人员可以...
`premain`方法是Java代理入口,用于初始化`Agent`实例,`init`方法用于建立Zookeeper连接,`buildRoot`和`createServerNode`创建节点结构,`updateServerNode`定时更新服务节点状态。此外,还定义了一个监听器`...
通过这个简单的ZooKeeper实例,我们可以学习到如何在实际应用中利用ZooKeeper进行数据管理,以及如何实现基于观察器的事件响应。在分布式环境中,ZooKeeper广泛用于配置管理、命名服务、分布式锁、队列服务等场景,...
6. **设置观察器**:使用 `zookeeper.exists` 或 `zookeeper.get` 方法时可以设置观察器,当节点状态变化时会触发回调函数。 **zkpython 特性** - 支持 Zookeeper 的所有基本操作。 - 集成了对 Zookeeper 事件的...
创建节点可以通过 org.apache.zookeeper.ZooKeeper#create() 方法实现,其参数包括: * path:节点路径 * data:节点数据 * aclList:访问控制列表 * createMode:创建模式 查看节点可以通过 org.apache.zookeeper...
2. 节点(Node):Zookeeper中的数据存储单元,分为临时节点和永久节点,临时节点在会话断开后自动删除,永久节点则不会。 3. 数据变更事件(Watch):一种单次触发机制,当节点数据或状态发生改变时,注册了该节点...
5. **监控节点**: 可以使用`watch`命令对节点进行监控,当节点数据发生变化时,ZooKeeper会通知客户端。 四、ZooKeeper的应用场景 1. **分布式锁**: ZooKeeper可以用来实现分布式锁,保证在分布式环境下的数据一致...
内容概要:本文详细介绍了Zookeeper作为分布式协调服务提供的核心组件——节点(znode)的各项基本操作,涵盖从建立与Zookeeper服务器连接开始的各个关键步骤,包括创建节点(create),获取节点数据(getData),修改节点...
分布式设计与开发是现代互联网架构中的重要组成部分,它允许我们将大型复杂系统分解为多个相互协作的独立...在实际学习过程中,结合具体的代码示例和实际操作,将有助于更深入地理解Zookeeper的工作原理和使用技巧。
Zookeeper 是一个分布式协调服务...在实际使用中,你可能还需要学习更多高级用法,例如 ACL 设置、选举算法、数据同步策略等。通过这份教程资料,你可以逐步掌握 Zookeeper 的核心功能,并将其应用于你的分布式系统中。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据节点提交的反馈进行下一步合理操作。最终将简单易用的接口和性能高效、功能稳定的系统提供给用户。...
**Zookeeper 3.4.6 知识点详解** Zookeeper 是 Apache 开源项目中的一个关键组件,专为分布式应用程序设计,它提供了一种在分布式...对于理解和掌握分布式系统的设计原理以及实现方法,学习 Zookeeper 是必不可少的。
在IT行业中,ZooKeeper是一个广泛使用的分布式协调服务,它由...通过阅读提供的博客文章和分析`Demo1.java`和`Demo2.java`的代码,我们可以深入学习ZooKeeper的API用法和实际应用场景,提升在分布式环境下的编程能力。
6. **锁的释放:** 通常在客户端使用完共享资源后,需要删除之前创建的临时节点来释放锁,这是通过删除Zookeeper上的对应节点实现的。 综上所述,`LockUtil`类通过封装了Zookeeper的连接、节点操作、监听机制以及重...
**Zookeeper:分布式协调服务详解** Zookeeper是一个高性能的分布式协调服务,由Apache Hadoop项目开发,用于解决分布式环境中...通过深入学习和实践`testzookeeper`中的例子,可以更好地理解和掌握Zookeeper的用法。
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,它是集群的管理者,监视着集群中各个节点的状态根据...在实际应用中,理解并熟练掌握Zookeeper的各项特性和使用方法对于提升系统的稳定性和效率至关重要。
在使用Zookeeper API之前,你需要创建一个`ZooKeeper`实例,通常通过`ZooKeeper(String connectString, int sessionTimeout, Watcher watcher)`构造函数实现。`connectString`是Zookeeper服务器的地址,`session...
- **分布式锁**:利用Zookeeper的临时节点特性,可以实现分布式锁,保证多线程或分布式环境下的资源独占。 - **服务发现**:例如在Hadoop、Kafka等分布式系统中,Zookeeper被用来发现和注册服务节点。 6. **最佳...
《Zookeeper深度剖析:基于官方推荐实例的改进》 Zookeeper,这个由Apache软件...通过学习和实践提供的代码实例,开发者不仅可以掌握Zookeeper的基本用法,还能深入了解其实现原理,提升在分布式系统开发中的能力。