如何使用Cruator监听zookeeper事件变化

如何使用Cruator监听zookeeper事件变化,第1张

掌握zookeeper事件监听机制,非常重要,可以说是跨入了进阶的门槛,只有掌握了如何监听某个节点或路径,我们才能在节点变化后,做一些我们想做的事,包括:

1,配置文件同步

2,主从切换

3,分布式队列

4,分布式锁

5,其他

散仙,在以前的文章里面有写过使用zookeeper原生的api,监听zk节点变化,那么本篇我们就来看下,如何使用curator来完成监听,代码如下:

<pre name="code" class="java">package com.qin.curator.zk

import javax.sound.midi.Patch

import org.apache.curator.RetryPolicy

import org.apache.curator.framework.CuratorFramework

import org.apache.curator.framework.CuratorFrameworkFactory

import org.apache.curator.framework.CuratorFrameworkFactory.Builder

import org.apache.curator.framework.api.CuratorWatcher

import org.apache.curator.framework.recipes.cache.NodeCache

import org.apache.curator.framework.recipes.cache.NodeCacheListener

import org.apache.curator.framework.recipes.cache.PathChildrenCache

import org.apache.curator.framework.recipes.cache.PathChildrenCacheEvent

import org.apache.curator.framework.recipes.cache.PathChildrenCacheListener

import org.apache.curator.retry.ExponentialBackoffRetry

import org.apache.curator.utils.ZKPaths

import org.apache.zookeeper.WatchedEvent

/**

*

* 使用curator监听zookeeper节点

* @author qindongliang

* **/

public class CuratorWatch {

static CuratorFramework zkclient=null

static String nameSpace="php"

static {

String zkhost="192.168.46.22:2181"//zk的host

RetryPolicy rp=new ExponentialBackoffRetry(1000, 3)//重试机制

Builder builder = CuratorFrameworkFactory.builder().connectString(zkhost)

.connectionTimeoutMs(5000)

.sessionTimeoutMs(5000)

.retryPolicy(rp)

builder.namespace(nameSpace)

CuratorFramework zclient = builder.build()

zkclient=zclient

zkclient.start()// 放在这前面执行

zkclient.newNamespaceAwareEnsurePath(nameSpace)

}

public static void main(String[] args) throws Exception{

watch()

Thread.sleep(Long.MAX_VALUE)

}

/**

*

* 监听节点变化

*

* */

public static void watch()throws Exception{

PathChildrenCache cache = new PathChildrenCache(zkclient, "/zk", false)

cache.start()

System.out.println("监听开始/zk........")

PathChildrenCacheListener plis=new PathChildrenCacheListener() {

@Override

public void childEvent(CuratorFramework client, PathChildrenCacheEvent event)

throws Exception {

switch ( event.getType() )

{

case CHILD_ADDED:

{

System.out.println("Node added: " + ZKPaths.getNodeFromPath(event.getData().getPath()))

break

}

case CHILD_UPDATED:

{

System.out.println("Node changed: " + ZKPaths.getNodeFromPath(event.getData().getPath()))

break

}

case CHILD_REMOVED:

{

System.out.println("Node removed: " + ZKPaths.getNodeFromPath(event.getData().getPath()))

break

}

}

}

}

//注册监听

cache.getListenable().addListener(plis)

}

}

</pre>

运行后的控制台打印:

<pre name="code" class="java">18:33:07.722 [main] INFO o.a.c.f.imps.CuratorFrameworkImpl - Starting

18:33:07.727 [main] DEBUG o.a.curator.CuratorZookeeperClient - Starting

18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - Starting

18:33:07.727 [main] DEBUG org.apache.curator.ConnectionState - reset

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:zookeeper.version=3.4.6-1569965, built on 02/20/2014 09:09 GMT

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:host.name=QINDONGLIANG.dhgatecn.msf

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.version=1.7.0_04

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.vendor=Oracle Corporation

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.home=D:\Java\jdk1.7.0_04\jre

18:33:07.734 [main] INFO org.apache.zookeeper.ZooKeeper - Client environment:java.class.path=D:\eclipseworkspace2yw\opzk\binD:\eclipseworkspace2yw\opzk\lib\curator-client-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-examples-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-framework-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-recipes-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-test-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-x-discovery-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-x-discovery-server-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\curator-x-rpc-2.6.0.jarD:\eclipseworkspace2yw\opzk\lib\log4j-1.2.15.jarD:\eclipseworkspace2yw\opzk\lib\zookeeper-3.4.5.jarD:\eclipseworkspace2yw\opzk\lib\commons-io-2.1.jar

在了解 ZK 底层原理之前,咱们先简单了解常用的 ZK 命令,熟悉常用 ZK 命令有利于排查相关问题或了解基于 ZK 自研系统等场景。比如在开发的时候,发现有些Dubbo服务无法被调用,这有可能是服务没有注册到ZK或者断开连接;也有可能公司有自研的系统使用 ZK 作为配置中心,熟悉 ZK 命令就能知道是如何做到服务发现注册和配置动态更新。

话不多说,咱们先来了解常见的 ZK 命令吧!

实际上,ZK并没有help命令,你可以随意敲一两个字符也会这样显示,只不过基于使用Linux的习惯,姑且认为输入help能打印出ZK支持的命令吧。

ls 命令可以查看指定目录下的节点,使用可选的参数,能够更加详细的看到节点的相关信息

stat / 等价于 ls -s /

和 ls 命令相似的,加上-w参数添加监听

在ZK 3.5版本之后,新增了容器和TTL节点,分别是使用 -c 和 -t 创建。所以读者们要注意你当前使用的版本,如果版本低于3.5的,是没有容器和TTL节点。

特别说明一下容器节点和TTL节点的使用:

另外关于 TTL节点 的使用,需要特别注意的是,如果使用默认的配置文件启动zk,想创建有存活时间的节点,比如执行 create -t 10 /test 是会报 KeeperErrorCode = Unimplemented for XXX 这样的错误。解决办法是需要在ZK启动前,先在配置文件加上 extendedTypesEnabled=true 然后重启ZK(集群部署的话,所有ZK都需要修改配置文件再重启)

配置后重启,执行 create -t 10 /test 这样的命令就不会报错啦

例子:get -s /demo

例子:先查询节点版本号,模拟并发下修改同一节点

get -s /demo 可知当前 dataVersion = 1

客户端1:set -v 1 /demo demo-data1

客户端2:set -v 1 /demo demo-data2

客户端1比客户端2先执行,客户端2再执行的话,这时显示报错

-v version:和 set 命令相似,-v 参数用于判断当前 *** 作的版本

例子:先创建一个delNode节点,然后删除

在前面使用create命令的时候,有一个acl参数是设置节点权限的,那么我们应该怎么设置?

举个例子: create /testAcl demo world:anyone:crwda

这行命令的意思是,创建 testAcl 这个节点,节点值为demo,其权限策略是所有人都可以执行 crwda *** 作。那么接下来,咱们先看下 ACL 是什么东东?

ACL 全称是 Access Control List ,也就是访问控制列表,ACL可以设置节点的 *** 作权限。那么控制权限的粒度是怎样呢?

对于节点 ACL 权限控制,是通过使用: scheme:id:perm 来标识(也就是例子中的格式 ->world:anyone:crwda),其含义是:

Scheme 有哪些授权策略?

ID 授权对象有哪些?

Permission 权限有哪些?

根据上面的参数可知,我们可以通过给所有人、特定的账号密码、特定的 ip 设置节点权限,这样能够更加方面地管理节点的访问。

值得注意的是,节点可以设置多种授权策略,但对于上下节点而言,权限的设置只对当前节点有效。换言之,权限不存在继承关系,即使节点被设置权限,但不会影响上下节点原来的权限!

上面执行了 create /testAcl demo world:anyone:crwda 命令给节点设置权限,那怎么看节点的权限咧?

很简单,执行 getAcl 节点路径 就可以查看对应节点的权限,比如 getAcl /testAcl,执行结果如下

除了在执行create命令创建节点的时候设置权限,还可以通过 setAcl 指定节点设置权限,比如我想指定/testAcl这个节点只可以通过特定 IP *** 作,并且限制执行权限为crdw,那么可以执行 setAcl /testAcl ip:127.0.0.1:crwd ,再次执行 getAcl /testAcl 结果如下:

ZK 的命令还有部分没有演示,这并不阻碍咱们学习ZK的原理,先掌握常见的命令,如果日后有其他场景的话,再根据特定的命令学习就可以啦。

无意中发现有 Zookeeper的客户端,感兴趣的读者可以玩一下~ 友情提醒,可能在节点数量很多的时候,打开很慢,甚至卡死,所以这个可视化工具可以在自己本地玩玩,不建议应用在生产上哈。这也侧面的说明,学会 ZK 命令的重要性(认真脸.jpg)

解压缩后,进入ZooInspector的build目录,执行 java -jar zookeeper-dev-ZooInspector.jar 就可以启动工具。

连接上 ZK 后,就可以看到节点的信息和节点的ACL,具体玩法,可以再自己摸索哈~

好了,以上是 ZK 常见命令的基本使用和可视化工具的基本使用。

参考资料:

《从Paxos到Zookeeper分布式一致性原理与实践》

如果觉得文章不错的话,麻烦点个赞哈,你的鼓励就是我的动力!对于文章有哪里不清楚或者有误的地方,欢迎在评论区留言~


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/bake/11765768.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-18
下一篇2023-05-18

发表评论

登录后才能评论

评论列表(0条)

    保存