zookeeper的ZKClient的使用

注册中心的原理

环境准备 

需要一台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);
		}
    }
}

猜你喜欢

转载自blog.csdn.net/qq_41520636/article/details/115017709