Zookeeper是一种分布式,开源的应用协调服务也即是“服务中间件”;主要提供的功能包括:“配置管理”,“分布式锁”,“集群管理”。
1、配置管理:管理服务对象的信息(IP、端口、服务提供功能接口)。
2、分布式锁:控制服务对象的资源(锁住之后,只能有一个服务对象可操作,其它服务对象等待)。
3、集群管理:管理服务对象的节点(每个节点提供的服务相同,则组成一个集群),组成高可用
Zookeeper原理
Zookeeper是一个树形目录服务,其数据模型拥有一个层次化的结构;从图中可看出:一个节点可以保存自己的数据和节点信息,也可以拥有子节点。
Zookeeper指令
1.服务端指令
linux指令 | 说明 |
---|---|
./zkServer.sh.start | 启动服务 |
./zkServer.sh.status | 服务状态 |
./zkServer.sh.stop | 停止服务 |
./zkServer.sh.restart | 重启服务 |
2.客户端命令
linux指令 | 说明 |
---|---|
./zkcli.sh -server ip:port | 连接服务端 |
quit | 断开连接 |
ls path | 显示指定目录下节点 |
create -[e/s/es] / path value | 创建单个节点 |
set /path value | 设置节点 |
get /path | 获取节点值 |
delete /path | 删除单个节点 |
deleteall /path | 删除所有节点 |
Curator 客户端
curator是Zookeeper的java客户端工具,也是阿帕奇基金组织的顶级项目;他封装了Zookeeper一些javaAPI的方法来对节点进行操作。
1.建立连接
public class CuratorTest {
//==============================Connect:建立连接========================================================================
private CuratorFramework client;
/**
* 建立连接
* 第一种:CuratorFrameworkFactory.newClient
* 第二种:CuratorFrameworkFactory.builder()
*/
@Before
public void testConnect() {
/*
* 第一种连接方式
* CuratorFrameworkFactory.newClient
* @param connectString 连接字符串。zk server 地址和端口 "192.168.149.135:2181"
* @param sessionTimeoutMs 会话超时时间 单位ms
* @param connectionTimeoutMs 连接超时时间 单位ms
* @param retryPolicy 重试策略
*/
// 重试策略
// RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
// 创建连接对象
// CuratorFramework client = CuratorFrameworkFactory.newClient("ZKIP:2181",
// 60 * 1000, 15 * 1000, retryPolicy);
// 开启连接
// client.start();
/**
* 第二种连接方式
* CuratorFrameworkFactory.builder()
* namespace:/myCurator/创建的节点
*/
//重试策略
RetryPolicy retryPolicy = new ExponentialBackoffRetry(3000, 10);
//创建连接对象
client = CuratorFrameworkFactory.builder()
.connectString("ZKIP:2181")
.sessionTimeoutMs(60 * 1000)
.connectionTimeoutMs(15 * 1000)
.retryPolicy(retryPolicy)
.namespace("myCurator")
.build();
//开启连接
client.start();
}
2.创建节点
public class CuratorTest {
//==============================Create:创建节点========================================================================
/**
* 创建节点:create
* 节点类型:持久,临时,持久顺序,临时顺序节点
* 1.基本创建 :create().forPath("")
* 2.创建节点 带有数据:create().forPath("",data)
* 3.设置节点的类型:create().withMode().forPath("",data)
* 4.创建多级节点 /app1/p1 :create().creatingParentsIfNeeded().forPath("",data)
*/
@Test
public void testCreate1() throws Exception {
//1.基本创建:如果创建节点,没有指定数据,则默认将当前客户端的ip作为数据存储
String s = client.create().forPath("/app1");
System.out.println(s);
}
@Test
public void testCreate2() throws Exception {
//2.创建节点,带数据
String path = client.create().forPath("/app2", "大王来巡山".getBytes());
System.out.println(path);
}
@Test
public void testCreate3() throws Exception {
//3.设置节点类型
// PERSISTENT:持久化节点
// PERSISTENT_SEQUENTIAL:持久化顺序节点
// EPHEMERAL:临时节点