Matthewl 发表于 2015-9-5 14:18:26

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]
查看完整版本: zookeeper的简单使用