本文来说下Zookeeper的客户端Curator基本使用
Curator概述
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
Curator官网:https://curator.apache.org/
Curator包结构
Curator包含了几个包:
- curator-framework:对zookeeper的底层api的一些封装
- curator-client:提供一些客户端的操作,例如重试策略等
- curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等
常用的maven
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-client -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>5.1.0</version>
</dependency>
创建会话
使用静态工程方法创建客户端
首先应该打开zookeeper的服务端,我这里使用的是单机版
测试程序
package cn.wideth.buz.utils;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
/***
* curator创建连接session
*/
public class Main {
public static void main(String[] args) {
//设置重试策略,1000毫秒以内最大的重试次数为3
RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);
// CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181")
// .sessionTimeoutMs(5000).retryPolicy(policy).build();
// 这种方式和上面使用责任链的模式来创建连接session的效果是一样的
CuratorFramework client =
CuratorFrameworkFactory.newClient(
"127.0.0.1:2181",
5000,
3000,
policy);
client.start();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
newClient静态工厂方法包含四个主要参数:
参数名 | 说明 |
---|---|
connectionString | 服务器列表,格式host1:port1,host2:port2,… |
retryPolicy | 重试策略,内建有四种重试策略,也可以自行实现RetryPolicy接口 |
sessionTimeoutMs | 会话超时时间,单位毫秒,默认60000ms |
connectionTimeoutMs | 连接创建超时时间,单位毫秒,默认60000ms |
测试结果
Fluent风格的Api创建会话
核心参数变为流式设置,一个列子如下:
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client =
// 使用到了责任链的设计模式
CuratorFrameworkFactory
.builder()
.connectString(connectionInfo)
.sessionTimeoutMs(5000)
.connectionTimeoutMs(5000)
.retryPolicy(retryPolicy)
.build();
创建包含隔离命名空间的会话
为了实现不同的Zookeeper业务之间的隔离,需要为每个业务分配一个独立的命名空间(NameSpace),在多个应用共用一个Zookeeper集群的场景下,这对于实现不同应用之间的相互隔离十分有意义。我们知道zookeeper的本质是一个分布式的文件系统,其实就是为不同的会话创建了不同的一个根目录而已。
测试程序
package cn.wideth.buz.utils;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
/***
* 创建包含隔离命
* 名空间的会话
*/
public class Main {
public static void main(String[] args) {
//设置重试策略,1000毫秒以内最大的重试次数为3
RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client =
CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.sessionTimeoutMs(5000)
.connectionTimeoutMs(5000)
.retryPolicy(policy)
.namespace("base")
.build();
client.start();
try {
Thread.sleep(Integer.MAX_VALUE);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
数据节点操作
有许多常见的命令来操作zookeeper,在zk的客户端中输入help即可
使用上面的命令,进行了数据节点的增删改查操作
测试程序
package cn.wideth.buz.utils;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
/***
* 数据节点操作,其实curator就是将zk自带的
* 命令封装成了,可以让开发人员调用的API。
*/
public class Main {
public static void main(String[] args) {
//设置重试策略,1000毫秒以内最大的重试次数为3
RetryPolicy policy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client =
CuratorFrameworkFactory.builder()
.connectString("127.0.0.1:2181")
.sessionTimeoutMs(5000)
.connectionTimeoutMs(5000)
.retryPolicy(policy)
.build();
client.start();
try {
//创建一个节点
client.create()
// 能够自动递归创建所有所需的父节点
.creatingParentContainersIfNeeded()
.forPath("/zkTest","hello world".getBytes());
System.out.println("<=================1================>");
//获取某个节点的所有子节点路径
System.out.println(client.getChildren().forPath("/"));
System.out.println("<=================2================>");
//获取一个节点的数据内容,将字节转化成字符转
System.out.println(new String(client.getData().forPath("/zkTest")));
System.out.println("<=================3================>");
//更新一个数据节点的内容
client.setData().forPath("/zkTest","666777888".getBytes());
System.out.println("<=================4================>");
System.out.println(new String(client.getData().forPath("/zkTest")));
//删除一个节点
client.delete().forPath("/zkTest");
System.out.println("<=================5================>");
//获取某个节点的所有子节点路径
System.out.println(client.getChildren().forPath("/"));
System.out.println("<=================6================>");
//检查节点是否存在
System.out.println("zookeeper ===> " + client.checkExists().forPath("/zookeeper"));
System.out.println("zkTest ===>" + client.checkExists().forPath("/zkTest"));
System.out.println("<=================7================>");
} catch (Exception e) {
e.printStackTrace();
}
client.close();
}
}
程序结果
本文小结
本文介绍了curator的基本使用,后续会对curator更加高级的操作,比如说分布式锁等常见的功能进行详细的描述。curator是用来操作zookeeper的一个非常好用的工具。