zookeeper的简单使用
前言最近项目中要使用基于zookeeper的集中配置管理系统,而对于zookeeper仅在当初使用阿里开源分布式服务调用框架dubbo时简单的了解一下。本
文的主要目的,调用zkclient (maven 地址见下面)实现监听当某个节点的数据发生变化时,将变化的信息打印到控制台。
zkclient的maven地址
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.4</version>
</dependency>
master app 应用程序
编写 master app应用程序,该程序主要功能是创建一个"root1"的节点,并每20s改变该节点的数据。程序代码如下:
1 import java.util.UUID;
2
3 import org.I0Itec.zkclient.ZkClient;
4 import org.apache.zookeeper.CreateMode;
5
6
7 public class App {
8
9 private ZkClient zkClient;
10
11 public ZkClient getZkClient() {
12 return zkClient;
13 }
14
15 public void setZkClient(ZkClient zkClient) {
16 this.zkClient = zkClient;
17 }
18
19
20 /**
21 * 函数入口
22 * @param args
23 */
24 public static void main( String[] args ) {
25
26 App bootStrap=new App();
27 bootStrap.initialize();
28
29 try {
30 Thread.sleep(100000000);
31 } catch (InterruptedException e) {
32 e.printStackTrace();
33 }
34
35 }
36
37
38 /**
39 * 初始化zookeeper
40 */
41 public void initialize() {
42
43 String connectionString="192.168.19.128:2181";
44 int connectionTimeout=50000;
45
46 zkClient=new ZkClient(connectionString, connectionTimeout);
47
48 if(!zkClient.exists("/root1")) {
49 zkClient.create("/root1", new Long(System.currentTimeMillis()), CreateMode.EPHEMERAL);
50 }
51
52 new Thread(new RootNodeChangeThread()).start();
53 }
54
55 /**
56 * 每20s改变一次 'root1'节点的数据
57 * @author yang
58 *
59 */
60 private class RootNodeChangeThread implements Runnable{
61
62 public void run() {
63
64 while(true) {
65
66 try {
67 Thread.sleep(20000);
68 } catch (InterruptedException e) {
69 //ignore
70 }
71
72 String uuidStr=UUID.randomUUID().toString();
73
74 System.out.println(">>>>>>>>>> 产生随机的 uuid string,'uuidStr'===>"+uuidStr);
75
76 zkClient.writeData("/root1", uuidStr);
77
78 }
79
80 }
81
82 }
83 }
slave app应用程序
编写 slave app应用程序,该程序主要功能是监听"root1"的节点,当其数据发生变化时,在控制台中打印中相关信息。程序代码如下:
1 import org.I0Itec.zkclient.IZkDataListener;
2 import org.I0Itec.zkclient.ZkClient;
3
4 public class App {
5
6 private ZkClient zkClient;
7
8 public ZkClient getZkClient() {
9 return zkClient;
10 }
11
12 public void setZkClient(ZkClient zkClient) {
13 this.zkClient = zkClient;
14 }
15
16 /**
17 * 初始化zookeeper
18 */
19 public void initialize() {
20
21 String connectionString="192.168.19.128:2181";
22 int connectionTimeout=500000;
23
24 zkClient=new ZkClient(connectionString, connectionTimeout);
25
26 new Thread(new Runnable() {
27
28 public void run() {
29
30 zkClient.subscribeDataChanges("/root1", new IZkDataListener() {
31
32 public void handleDataDeleted(String dataPath) throws Exception {
33 System.out.println("the node 'dataPath'===>");
34 }
35
36 public void handleDataChange(String dataPath, Object data) throws Exception {
37 System.out.println("the node 'dataPath'===>"+dataPath+", data has changed.it's data is "+String.valueOf(data));
38
39 }
40 });
41
42 }
43
44 }).start();
45 }
46
47 /**
48 * 函数入口
49 * @param args
50 */
51 public static void main( String[] args ) {
52
53 App bootStrap=new App();
54 bootStrap.initialize();
55
56 try {
57 Thread.sleep(100000000);
58 } catch (InterruptedException e) {
59 e.printStackTrace();
60 }
61
62 }
63 }
环境准备
启动zookeeper,并关闭linux防火墙。
运行程序
运行 master app和slave app 两个应用程序,截图如下:
页:
[1]