1 注册中心的原理
2 环境准备
需要一台linux
linux安装zookeeper,教程详情
https://blog.csdn.net/qq_41520636/article/details/114959972
3 下载ZooInspector可视化工具
下载地址: https://issues.apache.org/jira/secure/attachment/12436620/ZooInspector.zip
双击zookeeper-dev-ZooInspector.jar打开
输入ip和过期时间
建立连接,里面的dubbo是我前面练习产生的数据,如果没有使用过zookeeper,那么服务地址 只有zookeeper这个文件目录。
4 ZKClient的使用
导入pom.xml
<dependency><groupId>com.101tec</groupId><artifactId>zkclient</artifactId><version>0.11</version></dependency>
4.1 创建持久化节点
public class ZKUtils {public static void main(String[] args) {// uriString 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
4.2 创建普通节点
public class ZKUtils {public static void main(String[] args) {// uriString 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

几秒钟后,数据已经失效
4.3 创建临时节点
public class ZKUtils {public static void main(String[] args) {// uriString 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
也会在几秒钟后失效。
4.4 创建普通节点-写入序列化对象数据
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) {// uriString 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
4.5 获取子节点内容

public class ZKUtils {public static void main(String[] args) {// uriString 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
4.6 获取序列化的内容
注意:必须是序列化的数据才能读取出来
public class ZKUtils {public static void main(String[] args) {// uriString 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:张三
4.7 订阅节点
public class ZKUtils {public static void main(String[] args) {// uriString 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() {@Overridepublic 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]
4.8 订阅节点内容出现变化
public class ZKUtils {public static void main(String[] args) {// uriString 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() {@Overridepublic void handleDataChange(String path, Object data) throws Exception {System.out.println("节点里面的数据发生变化的地址"+path);System.out.println("节点里面的数据发生变化具体内容"+data.toString());}@Overridepublic void handleDataDeleted(String path) throws Exception {System.out.println("节点里面的数据被删除了"+path);}});}}
4.9 更新和删除节点
public class ZKUtils {public static void main(String[] args) {// uriString 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);}}}
