0


zkCli常用命令+ Zookeeper实战

zkCli常用命令

zkCli 是 ZooKeeper 提供的一个命令行工具,用于与 ZooKeeper 集群进行交互和调试。以下是一些常用的 zkCli 命令:

3.1 连接到ZooKeeper服务器

直接运行zkCli.cmd(sh)命令,默认连接本地 2181 端口,也可以指定要连接的服务器和端口。

3.2 create 创建节点

创建指定节点, 并赋值数据 (需要提前手动创建好父节点, 否则异常)

不加-参数,创建的就是持久化节点

-s 创建有序节点

如果在创建znode时,我们使用排序标志的话,ZooKeeper会在我们指定的znode名字后面增加一个数字。我们继续加入相同名字的znode时,这个数字会不断增加。这个序号的计数器是由这些排序znode的父节点来维护的。

-e 创建临时节点

znode有两种类型:临时和持久。

1.当创建的是持久化节点时候,不管客户端是否断开,这些节点永久存在

2.当创建的是临时节点的时候,只要客户端断开连接,这些节点就自动删掉.

3.3 ls [-w] 查看节点信息

ls /path

查看某个路径下的子路径, -s 表示获取详细信息。

ls -w /path

watch(监视器)当前路径下添加或删除节点,就会触发该 watch。watch 可以使客户端得到通知。watch 只能被触发一次。如果要一直获得znode的创建和删除的通知,那么就需要不断的在znode上开启观察模式。在其他节点下创建子节点,不会触发该 watch。

3.4 get [-w] 获取节点数据

get /path

获取某个节点上的数据, -s 表示获取详细信息。

3.5 set 设置节点数据

设置节点数据

3.6 delete 删除节点

删除某个路径 (此命令不允许删除非空子节点的路径)

3.7 deleteall 删除节点

deleteall /path

删除某个路径 (此命令允许删除非空子节点的路径)

3.8 关闭连接

Zookeeper实战

使用Curator Framework(Apache Curator)作为ZooKeeper的客户端,Curator Framework提供了一组易于使用的高级API,能够简化ZooKeeper的操作。

https://curator.apache.org/docs/about

1.添加依赖: 在pom.xml文件中添加Apache Curator的依赖。

因为client要与zk server 版本要一致,所以要找到对应的版本号

  1. <dependency>
  2. <groupId>org.apache.curator</groupId>
  3. <artifactId>curator-recipes</artifactId>
  4. <version>5.2.0</version>
  5. <exclusions>
  6. <exclusion>
  7. <groupId>org.apache.curator</groupId>
  8. <artifactId>curator-framework</artifactId>
  9. </exclusion>
  10. </exclusions>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.apache.curator</groupId>
  14. <artifactId>curator-framework</artifactId>
  15. <version>5.2.0</version>
  16. </dependency>

2.创建Zookeeper客户端配置类:

  1. @Configuration
  2. public class ZookeeperConfig {
  3. @Value("${zookeeper.connect-string}")
  4. private String connectString;
  5. @Bean
  6. public CuratorFramework curatorFramework() {
  7. RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
  8. CuratorFramework client = CuratorFrameworkFactory.builder()
  9. .connectString(connectString)
  10. .sessionTimeoutMs(5000) 设置会话超时时间为5
  11. .connectionTimeoutMs(60*1000) //连接超时时间,尝试连接到ZK服务器的最大等待时间,连接超时时间10s
  12. .retryPolicy(retryPolicy)// 重试策略
  13. .build();
  14. client.start();
  15. return client;
  16. }
  17. }
  18. 

3.在application.properties中配置Zookeeper连接字符串:

  1. zookeeper.connect-string=localhost:2181

4.节点操作

  1. @Autowired
  2. private CuratorFramework client;
  3. @Test
  4. void create() throws Exception {
  5. client.create().forPath("/a","zhangbozhi".getBytes());
  6. }
  7. @Test
  8. void create2() throws Exception {
  9. client.create().withMode(CreateMode.PERSISTENT).forPath("/a/a1","xiaolong".getBytes());
  10. String mm ="";
  11. }
  12. @Test
  13. void setData() throws Exception {
  14. client.setData().forPath("/a/a1","haiyang".getBytes());
  15. String mm ="";
  16. }
  17. @Test
  18. void getData() throws Exception {
  19. byte[] bytes = client.getData().forPath("/a/a1");
  20. System.out.println(new String(bytes));
  21. String mm ="";
  22. }
  23. @Test
  24. void delete() throws Exception {
  25. client.delete().forPath("/a/a1");
  26. String mm ="";
  27. }

5.节点监控Watch

CuratorCache作用:

本地缓存:CuratorCache会在客户端维护一份ZooKeeper中指定路径下节点的本地缓存。这意味着,当你需要频繁查询某个节点及其子节点的状态时,不必每次请求都通过网络与ZooKeeper服务器通信,从而提高了查询效率和降低了网络开销。

事件驱动:CuratorCache能够实时监听ZooKeeper中缓存节点的任何更改,包括节点的创建、更新、删除等事件。当节点发生变化时,CuratorCache会立即感知并在客户端触发相应的事件处理器,使得应用程序能够及时作出反应。

  1. // 创建并启动 CuratorCache
  2. CuratorCache cache = CuratorCache.build(client, "/a");
  3. //listener1 监听值的变化
  4. CuratorCacheListener listener1 = CuratorCacheListener.builder()
  5. .forChanges((ChildData oldNode, ChildData node)->{
  6. System.out.println("老值:"+new String(oldNode.getData()));
  7. System.out.println("新值:"+new String(node.getData()));
  8. })
  9. .build();
  10. //listener2 监听节点的创建
  11. CuratorCacheListener listener2 = CuratorCacheListener.builder()
  12. .forCreates((ChildData a)->{
  13. String mm ="";
  14. })
  15. .build();
  16. //listener3 监听节点的删除
  17. CuratorCacheListener listener3 = CuratorCacheListener.builder()
  18. .forDeletes(a->{
  19. String mm ="";
  20. })
  21. .build();
  22. //listener4 监听节点的删除
  23. CuratorCacheListener listener4 = CuratorCacheListener.builder()
  24. .forAll((CuratorCacheListener.Type type, ChildData oldData, ChildData data)->{
  25. System.out.println("type:"+type);
  26. })
  27. .build();
  28. cache.listenable().addListener(listener2);
  29. cache.listenable().addListener(listener4);// 可以同时监听多个listener cache.start();

6. 分布式锁

  1. String node = "/locks";
  2. //互斥锁
  3. final InterProcessLock lock1 = new InterProcessMutex(curatorClint, node);
  4. ExecutorService executorService = Executors.newCachedThreadPool();
  5. for(int i=1; i<=20 ; i++){
  6. executorService.execute(()->{
  7. //干活
  8. try {
  9. lock1.acquire();
  10. log.debug("线程:{} 获取锁",Thread.currentThread().getName());
  11. //线程沉睡
  12. ThreadUtil.safeSleep(5*1000);
  13. //线程解锁
  14. lock1.release();
  15. log.debug("线程:{} 释放了锁",Thread.currentThread().getName());
  16. } catch (Exception e) {
  17. // e.printStackTrace();
  18. }
  19. });
  20. }
  21. System.in.read();

7. 注册中心

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-zookeeper-discovery</artifactId>
  4. </dependency>
  5. 
  1. spring.cloud.zookeeper.connect-string = localhost:2181


本文转载自: https://blog.csdn.net/zhzjn/article/details/143078803
版权归原作者 这孩子叫逆 所有, 如有侵权,请联系我们删除。

“zkCli常用命令+ Zookeeper实战”的评论:

还没有评论