ZooKeeper 提供了一组核心服务和特性,旨在简化分布式系统的构建。它通过一个简单的接口来实现同步、配置管理、分组和命名等功能。下面我将提供一个关于ZooKeeper所提供的服务和特性的思维导图大纲,并给出一些Java代码示例以说明如何使用这些功能。
/
作为根节点,子节点用斜杠分隔org.apache.zookeeper.ZooKeeper
stat
, ruok
, mntr
等用于检查状态import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
public class ZKCreatePersistentNode {
private static final String ZOOKEEPER_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
// 创建ZooKeeper实例
ZooKeeper zk = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, event -> {
if (event.getState() == Watcher.Event.KeeperState.SyncConnected) {
System.out.println("Connected to ZooKeeper");
}
});
// 等待连接建立
Thread.sleep(1000);
try {
// 创建持久节点
String path = "/example/persistent-node";
byte[] data = "Hello Persistent Node".getBytes();
zk.create(path, data, Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println("Created persistent node: " + path);
// 获取节点数据
byte[] retrievedData = zk.getData(path, false, null);
System.out.println("Node data: " + new String(retrievedData));
} finally {
zk.close();
}
}
}
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.KeeperException;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import java.io.IOException;
public class ZKCreateEphemeralSequentialNode {
private static final String ZOOKEEPER_ADDRESS = "localhost:2181";
private static final int SESSION_TIMEOUT = 3000;
public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
// 创建ZooKeeper实例
ZooKeeper zk = new ZooKeeper(ZOOKEEPER_ADDRESS, SESSION_TIMEOUT, event -> {});
// 等待连接建立
Thread.sleep(1000);
try {
// 创建临时节点
String ephemeralPath = zk.create("/example/ephemeral-node", "Ephemeral Data".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
System.out.println("Created ephemeral node: " + ephemeralPath);
// 创建序号节点
String sequentialPath = zk.create("/example/sequential-node-", "Sequential Data".getBytes(),
Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
System.out.println("Created sequential node: " + sequentialPath);
} finally {
zk.close();
}
}
}
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooKeeper;
public class ZKWatcher implements Watcher {
private ZooKeeper zk;
public ZKWatcher(ZooKeeper zk) {
this.zk = zk;
}
@Override
public void process(WatchedEvent event) {
System.out.println("Received event: " + event.getType());
if (event.getType() == Event.EventType.NodeCreated) {
System.out.println("Node created: " + event.getPath());
} else if (event.getType() == Event.EventType.NodeDeleted) {
System.out.println("Node deleted: " + event.getPath());
} else if (event.getType() == Event.EventType.NodeDataChanged) {
System.out.println("Node data changed: " + event.getPath());
}
// 重新注册Watcher以便持续监听
try {
zk.exists(event.getPath(), this);
} catch (Exception e) {
e.printStackTrace();
}
}
}
在主程序中使用这个Watcher:
// 在获取节点数据时注册Watcher
byte[] data = zk.getData("/example/persistent-node", new ZKWatcher(zk), null);
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.leader.LeaderSelector;
import org.apache.curator.framework.recipes.leader.LeaderSelectorListenerAdapter;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class LeaderElectionExample extends LeaderSelectorListenerAdapter {
private CuratorFramework client;
private LeaderSelector selector;
public LeaderElectionExample(String connectString, String namespace) {
client = CuratorFrameworkFactory.newClient(connectString, new ExponentialBackoffRetry(1000, 3));
client.start();
selector = new LeaderSelector(client, "/" + namespace + "/leadership", this);
selector.autoRequeue();
}
@Override
public void takeLeadership(CuratorFramework client) throws Exception {
System.out.println("I am the leader!");
// 执行领导者职责...
Thread.sleep(5000); // 模拟工作时间
}
public void start() {
selector.start();
}
public void close() throws InterruptedException {
selector.close();
client.close();
}
public static void main(String[] args) throws InterruptedException {
LeaderElectionExample election = new LeaderElectionExample("localhost:2181", "example");
election.start();
Thread.sleep(60000); // 让程序运行一段时间
election.close();
}
}
请注意,上述代码片段展示了如何使用Curator框架来简化ZooKeeper的操作,特别是对于复杂的模式如领导者选举。如果你还没有添加Curator依赖,请确保项目中包含了正确的库依赖。例如,在Maven项目中可以在pom.xml
中添加以下依赖项:
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-frameworkartifactId>
<version>5.2.0version>
dependency>
<dependency>
<groupId>org.apache.curatorgroupId>
<artifactId>curator-recipesartifactId>
<version>5.2.0version>
dependency>
希望这个思维导图大纲和代码示例能帮助你更好地理解和使用ZooKeeper提供的各种服务。如果你有更具体的问题或需要进一步的帮助,请随时告诉我。