基于zookeeper实现配置集中管理【转】

基于ZK的优点:

  1. 简单。尽管前期搭建ZooKeeper服务器集群较为麻烦,但是实现该方案后,修改配置整个过程变得简单很多。用户只要修改配置,无需进行其他任何操作,配置自动生效
  2. 可靠。ZooKeeper服务集群具有无单点失效的特性,使整个系统更加可靠。即使ZooKeeper 集群中的一台机器失效,也不会影响整体服务,更不会影响分布式应用配置信息的更新。
  3. 实时。ZooKeeper的数据更新通知机制,可以在数据发生变化后,立即通知给分布式应用程序,具有很强的变化响应能力。

 

转自:http://www.cnblogs.com/yql1986/p/4116483.html

最近项目中要使用基于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 两个应用程序,截图如下:

 

 

posted @ 2016-04-04 10:10  okay4321  阅读(554)  评论(0编辑  收藏  举报