Curator框架是zookeeper客户端框架,官网有句话说的很简洁:curator对于zookeeper就像Guava对于java。
重复策略,实例化,众多实用的食谱菜单(分布式锁,计数器,队列,栅栏,信号量,路径缓存)。
初始化
1.直接调用CuratorFrameworkFactory的newClient方法
/**
* 创建客户端
* @param connectString zk地址
* @param sessionTimeoutMs session超时
* @param connectionTimeoutMs 路径超时
* @param retryPolicy 重复策略
* @return client
*/
public static CuratorFramework newClient(String connectString, int sessionTimeoutMs,
int connectionTimeoutMs, RetryPolicy retryPolicy)
{
return builder().
connectString(connectString).
sessionTimeoutMs(sessionTimeoutMs).
connectionTimeoutMs(connectionTimeoutMs).
retryPolicy(retryPolicy).
build();
}
/**
* 返回一个用来创建CuratorFramework新的builder
* @return new builder
*/
public static Builder builder()
{
return new Builder();
}
返回的Builder是CuratorFrameworkFactory的内部类,主要用于流式的创建CuratorFramework,里面包含所需参数
private EnsembleProvider ensembleProvider;
private int sessionTimeoutMs = DEFAULT_SESSION_TIMEOUT_MS;
private int connectionTimeoutMs = DEFAULT_CONNECTION_TIMEOUT_MS;
private int maxCloseWaitMs = DEFAULT_CLOSE_WAIT_MS;
private RetryPolicy retryPolicy;
private ThreadFactory threadFactory = null;
private String namespace;
private List<AuthInfo> authInfos = null;
private byte[] defaultData = LOCAL_ADDRESS;
private CompressionProvider compressionProvider = DEFAULT_COMPRESSION_PROVIDER;
private ZookeeperFactory zookeeperFactory = DEFAULT_ZOOKEEPER_FACTORY;
private ACLProvider aclProvider = DEFAULT_ACL_PROVIDER;
private boolean canBeReadOnly = false;
private boolean useContainerParentsIfAvailable = true;
ensembleProvider(配置提供者) 可以通过在Builder里的以下2个方法构造。设置服务器的链接地址,
格式: host:port,host2:port2…..
主要由此提供链接地址,供后期zookeeper里使用。
public Builder connectString(String connectString)
{
ensembleProvider = new FixedEnsembleProvider(connectString);
return this;
}
public Builder ensembleProvider(EnsembleProvider ensembleProvider)
{
this.ensembleProvider = ensembleProvider;
return this;
}
2.通过Builder的build函数创建客户端。
/**
* 根据builder里的值创建新的CuratorFramework
* @return new CuratorFramework
*/
public CuratorFramework build()
{
return new CuratorFrameworkImpl(this);
}
3.CuratorFrameworkImpl定义
CuratorFrameworkImpl为CuratorFramework接口的一个实现,平时主要用到的就是此client。
该构造函数主要还是使用Builder里的默认配置的一些参数,这些参数可以通过CuratorFrameworkFactory李的Builder去流式创建。
设置如下参数,如ZookeeperFactory 工厂,CuratorZookeeperClient【重点,客户端的工作主要靠它】,listeners 监听,backgroundOperations 后台运行行为,namespace 命名空间(用于放置在路径的前缀),
threadFactory CuratorFrameworkImpl的线程工厂,connectionStateManager 链接状态管理器, compressionProvider 压缩器等等。
public CuratorFrameworkImpl(CuratorFrameworkFactory.Builder builder)
{
ZookeeperFactory localZookeeperFactory = makeZookeeperFactory(builder.getZookeeperFactory());
this.client = new CuratorZookeeperClient(localZookeeperFactory, builder.getEnsembleProvider(), builder.getSessionTimeoutMs(), builder.getConnectionTimeoutMs(), new Watcher()
{
@Override
public void process(WatchedEvent watchedEvent)
{
CuratorEvent event = new CuratorEventImpl(CuratorFrameworkImpl.this, CuratorEventType.WATCHED, watchedEvent.getState().getIntValue(), unfixForNamespace(watchedEvent.getPath()),
null, null, null, null, null, watchedEvent, null);
processEvent(