ZooKeeper Java API

ZooKeeper是一个分布式应用程序协调服务,主要用于解决分布式集群中应用系统的一致性问题。它能提供类似文件系统的目录节点树方式的数据存储,主要用途是维护和监控所存数据的状态变化,以实现对集群的管理。

ZooKeeper提供了Java API操作接口

        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>

 

package com.xc.xcspringboot.test;

import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;

import java.io.IOException;

/**
 * 对ZooKeeper节点数据的查询、删除和修改
 */
public class NodeTestDemo {

    static ZooKeeper zk;

    static {
        String connectStr = "172.19.25.170:2181,172.19.25.171:2181,172.19.25.172:2181";
        // 参数1:服务器连接字符串
        // 参数2:连接超时时间
        // 参数3:观察者对象(回调方法)
        try {
            zk = new ZooKeeper(connectStr, 3000, null);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) throws Exception {
        create();
//        setNodeData();
//        getNodeData();
//        getNodeDataWatch();
//        getNodeDataWatch2();
//        deletePath();
        existsPath();
    }

    /**
     * 创建ZooKeeper节点,并设置元数据
     */
    public static void create() throws Exception {
        /*
         * CreateMode 取值如下:
         * PERSISTENT:持久节点
         * PERSISTENT_SEQUENTIAL:持久顺序节点(自动编号)
         * EPHEMERAL:临时节点,客户端断开连接时,这种节点会被自动删除
         * EPHEMERAL_SEQUENTIAL:临时顺序节点
         */
        String path = zk.create("/zk001", "zk001_data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("path " + path);
    }

    /**
     * 修改节点数据
     */
    public static void setNodeData() throws Exception {
        Stat stat = zk.setData("/zk001", "zk001_data_new".getBytes(), -1);
        //输出节点版本号
        System.out.println("输出节点版本号 " + stat.getVersion());
    }

    /**
     * 获取节点元数据
     */
    public static void getNodeData() throws Exception {
        Stat stat = new Stat();
        //返回指定路径上的节点数据和节点状态,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", null, stat);
        //输出节点元数据
        System.out.println("输出节点元数据 " + new String(bytes));
    }

    /**
     * 获取节点数据,并加入观察者对象Watcher(一次监听)
     */
    public static void getNodeDataWatch() throws Exception {
        Stat stat = new Stat();
        //返回指定路径上的节点数据和节点状态,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", new Watcher() {
            //实现process()方法
            public void process(WatchedEvent event) {
                System.out.println("实现process()方法 " + event.getType());
            }
        }, stat);

        System.out.println("输出节点元数据 " + new String(bytes));
        //改变节点数据,触发watch
        zk.setData("/zk001", "zk001_data_testwatch".getBytes(), -1);
        //为了验证是否触发了watch,不让程序结束
        while (true) {
            Thread.sleep(3000);
        }
    }

    /**
     * 获取节点数据,并加入观察者对象Watcher,实现持续监听
     */
    public static void getNodeDataWatch2() throws Exception {
        final Stat stat = new Stat();
        //定义Watcher对象
        Watcher watcher = new Watcher() {
            //实现process()方法
            public void process(WatchedEvent event) {
                //输出事件类型
                System.out.println("实现process()方法 " + event.getType());
                //重新设置监听,参数this代表当前Watcher对象
                try {
                    zk.getData("/zk001", this, stat);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        };

        //返回指定路径上的节点数据和节点状态,并设置Watcher监听,节点的状态会放入stat对象中
        byte[] bytes = zk.getData("/zk001", watcher, stat);
        System.out.println("输出节点元数据 " + new String(bytes));
        //为了验证是否触发了watch,不让程序结束
        while (true) {
            //改变节点数据,触发watch
            zk.setData("/zk001", "zk001_data_testwatch2".getBytes(), -1);
            Thread.sleep(3000);
        }
    }

    /**
     * 删除节点
     */
    public static void deletePath() throws Exception {
        //删除节点
        zk.delete("/zk001", -1);
    }

    public static void existsPath() throws Exception {
        Stat stat = zk.exists("/zk001", null);
        System.out.println("exists " + stat.toString());
    }

}

  

书籍: Hadoop大数据技术开发实战 6.4 ZooKeeper Java API操作

https://gitee.com/caoyeoo0/xc-springboot/blob/zookeeper/src/main/java/com/xc/xcspringboot/test/NodeTestDemo.java

 

posted @ 2022-11-10 10:46  草木物语  阅读(112)  评论(0编辑  收藏  举报