12. Zookeeper 实战一: 监控节点动态上下线

本文介绍了如何利用Zookeeper的临时节点特性实现对集群节点动态上下线的监控。通过创建全局和局部监听器,监听节点的创建和删除,并在事件触发后重新查询子节点数据以更新列表。文章详细讲解了注册端和监听端的开发,包括监听器的创建、Zookeeper客户端的初始化,以及测试过程。
摘要由CSDN通过智能技术生成

利用Zookeeper 临时型节点特性(当断开连接时, 创建的临时性节点自动销毁), 可实现监听集群节点动态上下线的功能. 所谓监听监听节点动态上下线是指, 当有节点新增或删除时, 监听端都会收到信息. zookeeper 实现的监听节点动态上下线特点:

  • 通过向节点注册监听器, 来监听该节点子节点的创建和删除
  • 当子节点有创建和删除操作时, 监听端会接收到事件, 但是却不知道具体是新增或删除哪个节点, 需要重新查询所有子节点数据, 来进行更新列表
  • 使用局部监听器时,需要注意局部监听器只能监听一次事件. 当监听到事件后, 需要将监听器自身再次注册为监听器, 才能保证继续监听
  • zk 监听类似于广播, 当一个节点注册了多个监听器时, 当有事件发生时, 事件会通知给所有监听器

1. 注册端开发

1.1 创建全局监听器

笔者习惯于也建议, 创建一个全局监听器类, 而不是采用内部类实现, 纵使笔者的全局事件监听器并未做任何处理. 笔者觉得这样会使代码更清晰.

public class RegisterGlobalWatcher implements Watcher {
   
    @Override
    public void process(WatchedEvent event) {
   
    }
}

1.2 创建zk 客户端连接,并注册监听器

笔者采用静态代码块儿来初始化zk 连接, 这样能保证连zk 连接只会被创建一次. 当结合spring 使用时, 只需要使用@Component 将此类的实例注册为sprin 容器的一个组件即可.

public class ZkRegisteClient {
   

    private static Logger logger = LoggerFactory.getLogger(ZkRegisteClient.class);

    private static ZooKeeper zooKeeper;

    // 使用static 方式, 在类加载时, 只执行一次
    static {
   
        // 创建zookeeper 连接时, 设置全局监听器
        try {
   
            zooKeeper = new ZooKeeper(ZkConstant.SERVER, ZkConstant.SESSION_TIMEOUT, new RegisterGlobalWatcher());
        } catch (IOException e) {
   
            throw new RuntimeException("创建连接失败");
        }

        //注册节点
        rigeste();
    }

    /**
     * @Description: 注册节点
     * @author: zongf
     * @time:  17:30:07
     */
    private static void rigeste(){
   

        try {
   
            // 如果nodes 节点不存在, 则创建nodes 节点
            if(null == zooKeeper.exists(ZkConstant.PATH_NODES, false)){
   
                zooKeeper.create(ZkConstant.PATH_NODES, "集群节点列表".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
            }

            // 获取本机主机ip
            String address = InetAddressUtil.getHostIp();

            // 节点路径 TODO 根据自居需要设置在数据内容
            String nodePath = ZkConstant.PATH_NODES + "/" + address + "-";

            // 节点数据 TODO 根据自居需要设置在数据内容
            String data = "{\"host\":\"" + address + "\", time:\"" + getDateTime() + "\"}";

            // 如果节点存在则先删除
            Stat stat = zooKeeper.exists(nodePath, false);
            if(stat != null){
   
                zooKeeper.delete(nodePath, stat.
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值