1.简介
Curator 框架是一个高级 API,它极大地简化了 ZooKeeper 的使用。它添加了许多基于 ZooKeeper 构建的功能,并处理管理与 ZooKeeper 集群的连接和重试操作的复杂性。其中一些功能是:
- 自动连接管理:
- 存在需要 ZooKeeper 客户端重新创建连接和/或重试操作的潜在错误情况。Curator 自动且透明地(大部分)处理这些情况。
- 监视 NodeDataChanged 事件并根据需要调用 updateServerList()。
- 更清洁的 API:
- 简化原始 ZooKeeper 方法、事件等。
- 提供现代、流畅的界面
- 其他实现:
- 领导选举
- 共享锁
- 路径缓存和观察者
- 分布式队列
- 分布式优先队列
2.分配 Curator 框架实例
CuratorFrameworks 是使用 CuratorFrameworkFactory 分配的,它提供了工厂方法和用于创建实例的构建器。重要提示:CuratorFramework 实例是完全线程安全的。您应该在应用程序中为每个 ZooKeeper 集群共享一个 CuratorFramework。
工厂方法 (newClient()) 提供了一种创建实例的简化方法。Builder 可以控制所有参数。拥有 CuratorFramework 实例后,您必须调用 start() 方法。在您的应用程序结束时,您应该调用 close()。
2.1命名空间
因为 ZooKeeper 集群是一个共享环境,所以遵守命名空间约定至关重要,这样使用给定集群的各种应用程序就不会使用冲突的 ZK 路径。
CuratorFramework 有一个“命名空间”的概念。您在创建 CuratorFramework 实例时设置命名空间(通过 Builder)。然后,CuratorFramework 会在调用其 API 之一时将命名空间添加到所有路径。
CuratorFramework client = CuratorFrameworkFactory.builder().namespace("MyApp") ... build();
client.create().forPath("/test", data);
3.使用
3.1添加依赖
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.10.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
3.2创建对应的Bean对象:
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
@Configuration
public class CuratorConfig {
/**
* destroyMethod 当对象销毁时会自动调用close方法
* curator framework服务
* @param zkServerAddress
* @return
*/
@Bean(destroyMethod ="close")
public CuratorFramework curatorFramework(@Value("${zk.server.address}") String zkServerAddress) {
ExponentialBackoffRetry retryPolicy = new ExponentialBackoffRetry(2000, 3);
CuratorFramework curatorFramework = CuratorFrameworkFactory.builder().connectString(zkServerAddress).retryPolicy(retryPolicy).namespace("namespace").build();
curatorFramework.start();
return curatorFramework;
}
}
4.领导选举的实现
可参考链接:LeaderLatch的使用与分析_Jay的博客-优快云博客_leaderlatch
public void init() {
leaderLatch = new LeaderLatch(curatorFramework, zkNodeProperties.getServers(), SystemUtil.getLocalIP());
leaderLatch.addListener(new LeaderLatchListener() {
@Override
public void isLeader() {
//当成为主节点时所作的操作
}
@Override
public void notLeader() {
//当成为从节点时所作的操作
}
});
leaderLatch.start();
}
5.监听节点
参考文献
CuratorFramework节点监听二 TreeCache_hit_ynsun的博客-优快云博客
workerNodePath = TreeCache.newBuilder(curatorFramework, zkNodeProperties.getTasks()).setCacheData(false).build();
workerNodePath.getListenable().addListener((client, event) -> {
//节点状态变化时所作的处理
});
workerNodePath.start();
参考链接: