ZooKeeper Java API

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

ZooKeeper提供了Java API操作接口

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

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
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 @   草木物语  阅读(126)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
历史上的今天:
2021-11-10 IDEA的Diagram (UML类关系图)
2019-11-10 springboot docker 部署
点击右上角即可分享
微信分享提示