Apache Curator是Apache ZooKeeper(一种分布式协调服务)的Java/JVM客户端库。它包含一个高级的API框架和实用程序,使Apache ZooKeeper的使用更加容易和可靠。它还包括常见用例和扩展(如服务发现和Java 8异步DSL)的方法。
效果展示:
代码如下:
package ha;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import java.util.List;
/**
* @ClassName: CuratorServiceDiscover
* @Description:
* @Author: xuezhouyi
* @Version: V1.0
**/
public class CuratorServiceDiscover implements Watcher {
final private String path = "/zk";
private CuratorFramework client;
private List<String> children;
public CuratorServiceDiscover() {
try {
client = CuratorFrameworkFactory
.builder()
.connectString("hadoop:2181")
.retryPolicy(new ExponentialBackoffRetry(1000, 3))
.build();
/* 使用前必须启动 */
client.start();
/* 获取初始节点列表 */
children = client.getChildren().usingWatcher(this).forPath(path);
System.out.println("初始监听目录节点列表:" + children);
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void process(WatchedEvent event) {
try {
/* 获取最新节点列表 */
final List<String> newChildren = client.getChildren().usingWatcher(this).forPath(path);
/* 新节点列表大于旧节点列表,说明有节点上线,反之有节点下线 */
if (newChildren.size() > children.size()) {
for (String child : newChildren) {
/* 取出旧节点列表中不包含新节点,即为上线 */
if (!children.contains(child)) {
System.out.println("上线节点:" + child);
}
}
} else {
for (String child : children) {
/* 取出新节点列表中不包含旧节点,即为下线 */
if (!newChildren.contains(child)) {
System.out.println("下线节点:" + child);
}
}
}
/* 更新节点列表 */
children = newChildren;
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
CuratorServiceDiscover csd = new CuratorServiceDiscover();
csd.start();
}
private void start() {
for (; ; ) {
}
}
}