注册中心的原理
环境准备
需要一台linux
linux安装zookeeper,教程详情
https://blog.csdn.net/qq_41520636/article/details/114959972
下载ZooInspector可视化工具
下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
双击zookeeper-dev-ZooInspector.jar打开
输入ip和过期时间
建立连接,里面的dubbo是我前面练习产生的数据,如果没有使用过zookeeper,那么服务地址 只有zookeeper这个文件目录。
ZKClient的使用
导入pom.xml
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.11</version>
</dependency>
注意
在注册中心的服务地址是唯一的,不能重复创建。
创建持久化节点
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
// 创建会话
ZkClient zkClient = new ZkClient(ZKServer);
// 1.创建持久化节点(创建后,即便客户端与服务端断开连接,该节点依然存在)
zkClient.createPersistent("/http");
}
}
结果
23:44:47.104 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001b, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,95,0 request:: '/http,,v{s{31,s{'world,'anyone}}},0 response:: '/http
创建普通节点
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
// 创建会话
ZkClient zkClient = new ZkClient(ZKServer);
String s = zkClient.create(uri, "/dubbo/123", CreateMode.EPHEMERAL);
}
}
结果
23:50:22.145 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001c, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,98,0 request:: '/dubbo/com.hikktn.service.TestService,#ffffffacffffffed05740a2f647562626f2f313233,v{s{31,s{'world,'anyone}}},1 response:: '/dubbo/com.hikktn.service.TestService
几秒钟后,数据已经失效
创建临时节点
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
// 创建会话
ZkClient zkClient = new ZkClient(ZKServer);
zkClient.createEphemeral("/dubbo/localhost:8888");
}
}
结果
00:03:14.657 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001e, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,104,0 request:: '/dubbo/localhost:8888,,v{s{31,s{'world,'anyone}}},1 response:: '/dubbo/localhost:8888
也会在几秒钟后失效。
创建普通节点-写入序列化对象数据
import java.io.Serializable;
public class User implements Serializable {
private Integer id;
private String name;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
// 创建会话
ZkClient zkClient = new ZkClient(ZKServer,10000,10000,new SerializableSerializer());
User user =new User();
user.setId(1);
user.setName("张三");
String path = zkClient.create("/dubbo/com.hikktn.service.TestService", user, CreateMode.PERSISTENT);
System.out.println(path);
}
}
结果
00:07:43.369 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df001f, packet:: clientPath:null serverPath:null finished:false header:: 1,1 replyHeader:: 1,107,0 request:: '/dubbo/com.hikktn.service.TestService,#ffffffacffffffed057372015636f6d2e68696b6b746e2e7574696c732e55736572ffffffa62b36ffffff8652ffffffdeffffffb0582024c026964740134c6a6176612f6c616e672f496e74656765723b4c046e616d65740124c6a6176612f6c616e672f537472696e673b787073720116a6176612e6c616e672e496e746567657212ffffffe2ffffffa0ffffffa4fffffff7ffffff81ffffff8738201490576616c756578720106a6176612e6c616e672e4e756d626572ffffff86ffffffacffffff951dbffffff94ffffffe0ffffff8b200787000017406ffffffe5ffffffbcffffffa0ffffffe4ffffffb8ffffff89,v{s{31,s{'world,'anyone}}},0 response:: '/dubbo/com.hikktn.service.TestService
获取子节点内容
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
// 创建会话
ZkClient zkClient = new ZkClient(ZKServer,5000,100000);
List<String> children = zkClient.getChildren("/dubbo/localhost:8888");
children.forEach((k) ->{
System.out.println(k);
});
}
}
结果
00:28:21.647 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0024, packet:: clientPath:null serverPath:null finished:false header:: 1,8 replyHeader:: 1,121,0 request:: '/dubbo/com.hikktn.service.TestService,F response:: v{'localhost:8889,'localhost:8888}
localhost:8889
localhost:8888
获取序列化的内容(必须是序列化的数据才能读取出来)
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
User user = zkClient.readData("/dubbo/com.hikktn.service.TestService");
System.out.println(user.getId()+":"+user.getName());
}
}
结果
00:33:21.553 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0025, packet:: clientPath:null serverPath:null finished:false header:: 1,4 replyHeader:: 1,123,0 request:: '/dubbo/com.hikktn.service.TestService,F response:: #ffffffacffffffed057372015636f6d2e68696b6b746e2e7574696c732e55736572ffffffa62b36ffffff8652ffffffdeffffffb0582024c026964740134c6a6176612f6c616e672f496e74656765723b4c046e616d65740124c6a6176612f6c616e672f537472696e673b787073720116a6176612e6c616e672e496e746567657212ffffffe2ffffffa0ffffffa4fffffff7ffffff81ffffff8738201490576616c756578720106a6176612e6c616e672e4e756d626572ffffff86ffffffacffffff951dbffffff94ffffffe0ffffff8b200787000017406ffffffe5ffffffbcffffffa0ffffffe4ffffffb8ffffff89,s{107,107,1616170063293,1616170063293,0,2,0,0,183,2,110}
1:张三
订阅节点
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
String uri ="/dubbo/com.hikktn.service.TestService";
// 创建会话
ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
zkClient.subscribeChildChanges(uri, new IZkChildListener() {
@Override
public void handleChildChange(String parentPath, List<String> currentChilds) throws Exception {
System.out.println("该节点里面有变化"+parentPath);
System.out.println("该节点当前的子节点发生变化"+currentChilds);
}
});
try {
System.in.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
删除了节点:localhost:8888
结果
00:53:21.581 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0028, packet:: clientPath:null serverPath:null finished:false header:: 3,3 replyHeader:: 3,132,0 request:: '/dubbo/com.hikktn.service.TestService,T response:: s{107,128,1616170063293,1616172655802,1,3,0,0,183,1,131}
00:53:21.584 [main-SendThread(192.168.135.20:2181)] DEBUG org.apache.zookeeper.ClientCnxn - Reading reply sessionid:0x100058112df0028, packet:: clientPath:null serverPath:null finished:false header:: 4,8 replyHeader:: 4,132,0 request:: '/dubbo/com.hikktn.service.TestService,T response:: v{'localhost:8889}
该节点里面有变化/dubbo/com.hikktn.service.TestService
该节点当前的子节点发生变化[localhost:8889]
订阅节点内容出现变化
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
String uri ="/dubbo/com.hikktn.service.TestService";
// 创建会话
ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
zkClient.subscribeDataChanges(uri, new IZkDataListener() {
@Override
public void handleDataChange(String path, Object data) throws Exception {
System.out.println("节点里面的数据发生变化的地址"+path);
System.out.println("节点里面的数据发生变化具体内容"+data.toString());
}
@Override
public void handleDataDeleted(String path) throws Exception {
System.out.println("节点里面的数据被删除了"+path);
}
});
}
}
更新和删除节点
public class ZKUtils {
public static void main(String[] args) {
// uri
String ZKServer = "192.168.135.20:2181";
ZkClient zkClient = new ZkClient(ZKServer,5000,100000,new SerializableSerializer());
String uri ="/dubbo/com.hikktn.service.TestService";
// 创建会话
ZkClient zkClient = new ZkClient(zkServer,10000,10000,new SerializableSerializer());
// 判断节点是否存在
boolean exists = zkClient.exists(uri);
if (exists){
User user =new User();
user.setId(2);
user.setName("李四");
// 写入节点(会直接覆盖)
zkClient.writeData(uri,user);
}else {
// 删除节点
zkClient.delete(uri);
zkClient.deleteRecursive(uri);
}
}
}