利用zookeeper实现服务上线(离线)自动感知

1、环境说明

1.1、zookeeper环境

运行于centos 6.5 X64系统zookeeper-3.4.8版本,运行于三台节点ha环境,分别对应如下:

[java]zookeeperServer1、zookeeperServer2、zookeeperServer3[/java]

1.2、开发及测试环境

win10系统jdk1.7版本

2、代码实现

2.1、服务上线注册功能开发

  1. package com.itunic.zookeeper.server;
  2. import org.apache.zookeeper.CreateMode;
  3. import org.apache.zookeeper.WatchedEvent;
  4. import org.apache.zookeeper.Watcher;
  5. import org.apache.zookeeper.ZooDefs.Ids;
  6. import org.apache.zookeeper.ZooKeeper;
  7. import org.apache.zookeeper.test.ClientBase;
  8. /**
  9.  * 利用zookeeper实现服务上线功能
  10.  * 
  11.  * @author itunic
  12.  * 
  13.  */
  14. public class Server {
  15.     // zookeeper 服务注册根节点
  16.     static final String SERVER_HOME = "/server";
  17.     public static void main(String[] args) throws Exception {
  18.         // 连接zk
  19.         ZooKeeper zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
  20.                 ClientBase.CONNECTION_TIMEOUT, new Watcher() {
  21.                     @Override
  22.                     public void process(WatchedEvent arg0) {
  23.                         System.out.println("启动");
  24.                     }
  25.                 });
  26.         createNode(zk, args);
  27.         Thread.sleep(Long.MAX_VALUE);
  28.     }
  29.     /**
  30.      * 更新zk节点
  31.      * 
  32.      * @param zk
  33.      * @param args
  34.      * @throws Exception
  35.      */
  36.     public static void createNode(ZooKeeper zk, String[] args) throws Exception {
  37.         zk.create(SERVER_HOME + "/" + args[0], args[0].getBytes(), Ids.OPEN_ACL_UNSAFE,
  38.                 CreateMode.EPHEMERAL_SEQUENTIAL);
  39.     }
  40. }

2.2、实现服务上线/离线自动感知

  1. package com.itunic.zookeeper.client;
  2. import java.util.ArrayList;
  3. import java.util.List;
  4. import org.apache.zookeeper.WatchedEvent;
  5. import org.apache.zookeeper.Watcher;
  6. import org.apache.zookeeper.Watcher.Event.EventType;
  7. import org.apache.zookeeper.ZooKeeper;
  8. import org.apache.zookeeper.test.ClientBase;
  9. /**
  10.  * 利用zookeeper实现服务上线离线自动感知
  11.  *
  12.  * @author itunic
  13.  *
  14.  */
  15. public class Client {
  16.     static final String SERVER_HOME = "/server";
  17.     private ZooKeeper zk = null;
  18.     // 获取zk连接
  19.     private void getZkClient() throws Exception {
  20.         zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
  21.                 ClientBase.CONNECTION_TIMEOUT, new Watcher() {
  22.                     @Override
  23.                     public void process(WatchedEvent event) {
  24.                         if (event.getType() == EventType.None)
  25.                             return;
  26.                         try {
  27.                             // 获取新的服务器列表,重新注册监听
  28.                             updateServers();
  29.                         } catch (Exception e) {
  30.                             e.printStackTrace();
  31.                         }
  32.                     }
  33.                 });
  34.     }
  35.     /**
  36.      * 从zk中获取在线服务器信息
  37.      */
  38.     public void updateServers() throws Exception {
  39.         // 从servers父节点下获取到所有子节点,并注册监听
  40.         List<String> children = zk.getChildren(SERVER_HOME, true);
  41.         ArrayList<String> serverList = new ArrayList<String>();
  42.         for (String child : children) {
  43.             byte[] data = zk.getData(SERVER_HOME + "/" + child, falsenull);
  44.             serverList.add(new String(data));
  45.         }
  46.         System.out.println("最新服务器节点");
  47.         for (String server : serverList) {
  48.             System.out.println(server);
  49.         }
  50.     }
  51.     public static void main(String[] args) throws Exception {
  52.         Client client = new Client();
  53.         // 先构造一个zk的连接
  54.         client.getZkClient();
  55.         // 获取服务器列表
  56.         client.updateServers();
  57.         Thread.sleep(Long.MAX_VALUE);
  58.     }
  59. }

3、打包测试

3.1将Server.java && Client.java 打包为 Runnable JAR file

3.2、运行client

利用zookeeper实现服务上线(离线)自动感知

这里可以看到zk下根节点server下面是没有东西的

利用zookeeper实现服务上线(离线)自动感知

3.3、启动一个Server并取名为testServer01

利用zookeeper实现服务上线(离线)自动感知

启动后查看zk控制台

利用zookeeper实现服务上线(离线)自动感知

这里可以看到已经有了一个节点了,再看一下client控制台是否能感知到

利用zookeeper实现服务上线(离线)自动感知

ok,已经感知到了testServer01上线

关于服务离线检测时间问题:服务离线后并不会像上线一样立即感知,而是基于zk设置的心跳时间来检测。

  • 利用zookeeper实现服务上线(离线)自动感知已关闭评论
  • 50 views
  • A+
所属分类:未分类
avatar