zookeeper
1.zookeeper 概述
简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。其由JAVA编写,支持JAVA 和C两种语言的客户端。
常见的应用场景
1.服务注册中心
2.分布式锁
2.zookeeper常用命令
常用的zookeeper节点命令:
help查看提供的命令列表
create
语法:
create [-s] [-e] [-c] [-t ttl] path [data] [acl]
创建节点:
zk的基本单元是基于类似文件系统的path唯一路径存放的数据结构节点:znode。
znode分为四种类型:持久节点、持久序号节点、临时节点、临时序号节点。
#默认创建的就是持久节点,创建的节点名称以path路径形式创建:create /hello
持久序号节点: create -s /hello-world
临时节点: create -e /hello-world-e
临时序号节点: create -e -s /hello-world-e-s
节点类型小结:
zookeeper的znode节点默认创建的是持久节点。
临时节点的特征是只要创建该临时节点的客户端连接关闭了或者session超时连接,那么服务端会自动将该客户端所创建的所有临时节点全部删除。
zookeeper还支持序号节点,创建节点的时候会根据节点的path作为前缀,序号进行递增。
ls
语法: ls [-s] [-w] [-R] path
path:节点路径
与linux的ls差不多,列出子节点。-s 同时显示节点对应的状态,-w 监控某个节点,-R 递归列出所有子节点
基本查询: ls /
递归查询 : ls / -R
节点监控 -w watch 只能监控子节点的创建、删除 一次性 : ls -w /hello
addWatch(了解命令)
监控节点
基本语法:addWatch [-m mode] path
set
create命令创建了znode节点,此时还没给节点赋值。你也可以理解为文件夹创建好了,里面内容还是空的,通过set命令可以赋值操作:
基本语法:set [-s] [-v version] path data
-s设置完值后同时查看节点状态
-v设置值的同时带上版本号
set /hello 123
get
查看节点数据
基础语法:get [-s] [-w] path
-w 监控当前节点的数据变化
-s 同时查看节点状态
开启节点数据监控: get -w /hello
delete
删除节点:只能删除没有子节点的节点
基础语法:delete [-v version] path
deleteall
递归删除,会将当前节点以及所有子节点都删除
基本语法:deleteall path
3.第三方ZKClient操作Zookeeper
zkClient 是在zookeeper客户端基础之上封装的,使用上更加友好。
主要变化如下:
- 可以设置持久监听,或删除某个监听
- 可以插入JAVA对象,自动进行序列化和反序列化
- 简化了基本的增删改查操作。
创建一个maven项目,项目名称为:zk-connection-zkclient
添加maven依赖:
<dependencies>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
zkclient使用示例代码:
1 zkClient创建节点
public static void main(String[] args) {
//1.连接服务器
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
if(zkClient.exists("/zkclient") == false){
zkClient.createPersistent("/zkclient","hello zkclient 李四");
}
//读取znode数据
String data = zkClient.readData("/zkclient");
System.out.println("data:" + data);
}
2 zkClient 存储对象数据
准备实体类:
package cn.itcast.zkclient;
import java.io.Serializable;
public class User implements Serializable {
private Long id;
private String name;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
//1.连接服务器
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
// 2. 创建节点 赋值
if(zkClient.exists("/zkclient1") == false){
User user = new User();
user.setId(1L);
user.setName("李四'");
zkClient.createPersistent("/zkclient",user);
}
//3. 读取znode数据
User data = zkClient.readData("/zkclient1");
System.out.println("data:" + data);
3 节点数据监听
对已经创建的节点,监听
编写代码:
package cn.itcast.zkclient;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import java.io.IOException;
public class ZkClientZookeeperWatch {
public static void main(String[] args) throws IOException {
//1.连接服务器
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
//监听数据变化
zkClient.subscribeDataChanges("/zkclientw", new IZkDataListener() {
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println("目标节点路径::" + dataPath);
System.out.println("目标节点数据 :" + data);
}
// 处理节点数据监听
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("handleDataDeleted-----");
System.out.println("dataPath:" + dataPath);
}
});
System.out.println("我正在监听--------------");
System.in.read();
}
}
4 子节点以及数据监听
package cn.itcast.zkclient;
import cn.itcast.zkserializer.StringValueSerializer;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
import java.io.IOException;
import java.util.List;
public class ZkClientZookeeperChildrenWatch {
public static void main(String[] args) throws IOException {
//1.连接服务器
ZkClient zkClient = new ZkClient("127.0.0.1:2181");
zkClient.setZkSerializer(new StringValueSerializer());
//监听子节点变化
List<String> children = zkClient.subscribeChildChanges("/zk", (parentPath, currentChilds) ->{
System.out.println("parentPath:" + parentPath);
System.out.println("currentChilds:" + currentChilds);
});
//监听子节点数据变化
for (String child : children) {
zkClient.subscribeDataChanges("/zk/"+child, new IZkDataListener() {
public void handleDataChange(String dataPath, Object data) throws Exception {
System.out.println("目标子节点路径::" + dataPath);
System.out.println("目标子节点更新数据 :" + data);
}
// 处理子节点数据监听
public void handleDataDeleted(String dataPath) throws Exception {
System.out.println("handleDataDeleted-----");
System.out.println("dataPath:" + dataPath);
}
});
}
System.in.read();
System.out.println("我正在监听--------------");
zkClient.close();
}
}