zookeeper之动态监控/观察者模式

1、介绍

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务!

zookeeper集群中,每一个节点叫做znode,而每一个节点又可以有多个子节点。每一个节点znode和子节点都可以存储少量的数据貌似是1Mib,而且这些数据在集群中是同步共享的;

zookeepe集群作为服务端,集群多个znode间存在一个leader,其他都是follower,当集群中有一半以上的znode损坏时,zookeeper停止工作,固zookeeper适合安装在基数台电脑中;

zookeeper的节点创建时,znode有四种形式:临时的,临时+序列,持久,持久+序列;

zookeeper的客户端Client既可以和服务端存在于同一个节点,又可以完全独立于zookeeper集群之外。

Client使用zookeeper集群时,需要向zookeeper集群中注册一个zookeeper bean;

2、观察者模式

zookeeper作为分布式应用程序的协调服务,其最常用的功能便是观察者模式observe;

双11要来了,平时的1台tomcat无法支持更大的访问量,我们租10台服务器,我们一共有11台机器;

我们做如下分配:

  1台作为访问转发,一台作为备用机,其他9台按照3:3:3来分别作为MVC模式的Controller、Service、Dao的服务;

  这里我们使用zookeeper集群:每一台电脑既作为客户端也作为服务端,当然一台电脑也可以作为zookeeper服务端,但是这台电脑坏了怎么办,zookeeper集群是为了高可靠性而设计的;

  我们用zookeeper动态监视每一台电脑ip,来防止突发情况;

 

 1 package app;
 2 
 3 import java.util.ArrayList;
 4 import java.util.List;
 5 
 6 import org.apache.zookeeper.WatchedEvent;
 7 import org.apache.zookeeper.Watcher;
 8 import org.apache.zookeeper.Watcher.Event.EventType;
 9 import org.apache.zookeeper.ZooKeeper;
10 import org.apache.zookeeper.data.Stat;
11 
12 public class Client {
13   //
14     private String groupNode = "/servergroup";
15     private ZooKeeper zk;
16     private Stat stat = new Stat();
17 
18     private volatile List<String> serverlist;
19 
20     private String hosts = "192.168.47.128:2181,192.168.47.129:2181,192.168.47.130:2181";
21 
22     public void connectZooKeeper() throws Exception{
23         zk=new ZooKeeper(hosts, 5000, new Watcher(){
24 
25             @Override
26             public void process(WatchedEvent event) {
27                 // 如果/servergroup 发生关于子节点变化事件,更新serverlist,并重新监听
28                 if(event.getType()==EventType.NodeChildrenChanged && groupNode.equals(event.getPath())){
29                     try {
30                         updateServerList();
31                     } catch (Exception e) {
32                         e.printStackTrace();
33                     }    
34                 }
35             }            
36         });    
37         updateServerList();
38     }
39 
40     // 更新serverlist
41     public void updateServerList()throws Exception{
42         List<String> newserverlist = new ArrayList<String>();
43         List<String> sublist =zk.getChildren(groupNode, true);
44         for(String subNode:sublist){
45             byte[] data =zk.getData(groupNode+"/"+subNode, false, stat);
46             String a = new String(data,"utf-8");
47             newserverlist.add(a);
48         }
49         serverlist=newserverlist;
50         System.out.println("serverlist updated:"+serverlist);
51     }
52     
53     /*
54      * client的工作逻辑编写在这个方法中
55      * 我们先不做任务处理,让client sleep
56      */
57     
58     public void handle() throws Exception{
59         //这里的线程休眠是让eclipse一直处于运行状态,这样才能动态接收到服务端传来的信息
60         Thread.sleep(Long.MAX_VALUE);
61     }
62     
63     public static void main(String[] args) throws Exception {
64         
65         Client client = new Client();
66         client.connectZooKeeper();
67         client.handle();
68         
69     }
70 
71 }

我们在linux系统下安装zookeeper后 每台机器都启动;

命令:zkServer.sh start; 这个是服务端启动;

我们执行java程序结果如下:

我们在linux下开启客户端,进行一些操作:

命令:zkCli.sh -server

 

我看到eclipse的Console结果:

这种动态监视的模式很值得学习吧?

posted on 2017-11-06 10:41  剑姬  阅读(5412)  评论(0编辑  收藏  举报

导航