前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用zookeeper实现服务上线(离线)自动感知

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

作者头像
天策
发布2018-06-22 13:56:09
8830
发布2018-06-22 13:56:09
举报
文章被收录于专栏:行者悟空行者悟空

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、服务上线注册功能开发
代码语言:javascript
复制
package com.itunic.zookeeper.server;

import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.test.ClientBase;

/**
 * 利用zookeeper实现服务上线功能
 * 
 * @author itunic
 * 
 */
public class Server {
 // zookeeper 服务注册根节点
 static final String SERVER_HOME = "/server";

 public static void main(String[] args) throws Exception {
 // 连接zk
        ZooKeeper zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
                ClientBase.CONNECTION_TIMEOUT, new Watcher() {
 @Override
 public void process(WatchedEvent arg0) {
                        System.out.println("启动");
                    }
                });
        createNode(zk, args);
        Thread.sleep(Long.MAX_VALUE);
    }

 /**
     * 更新zk节点
     * 
     * @param zk
     * @param args
     * @throws Exception
     */
 public static void createNode(ZooKeeper zk, String[] args) throws Exception {
        zk.create(SERVER_HOME + "/" + args[0], args[0].getBytes(), Ids.OPEN_ACL_UNSAFE,
                CreateMode.EPHEMERAL_SEQUENTIAL);
    }
}
2.2、实现服务上线/离线自动感知
package com.itunic.zookeeper.client;

import java.util.ArrayList;
import java.util.List;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.test.ClientBase;

/**
 * 利用zookeeper实现服务上线离线自动感知
 *
 * @author itunic
 *
 */
public class Client {
 static final String SERVER_HOME = "/server";
 private ZooKeeper zk = null;

 // 获取zk连接
 private void getZkClient() throws Exception {
        zk = new ZooKeeper("zookeeperServer1:2181,zookeeperServer2:2181,zookeeperServer3:2181",
                ClientBase.CONNECTION_TIMEOUT, new Watcher() {
 @Override
 public void process(WatchedEvent event) {
 if (event.getType() == EventType.None)
 return;
 try {
 // 获取新的服务器列表,重新注册监听
                            updateServers();
                        } catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                });
    }

 /**
     * 从zk中获取在线服务器信息
     */
 public void updateServers() throws Exception {
 // 从servers父节点下获取到所有子节点,并注册监听
        List<String> children = zk.getChildren(SERVER_HOME, true);
        ArrayList<String> serverList = new ArrayList<String>();
 for (String child : children) {
 byte[] data = zk.getData(SERVER_HOME + "/" + child, false, null);
            serverList.add(new String(data));
        }
        System.out.println("最新服务器节点");
 for (String server : serverList) {
            System.out.println(server);
        }
    }

 public static void main(String[] args) throws Exception {
        Client client = new Client();
 // 先构造一个zk的连接
        client.getZkClient();
 // 获取服务器列表
        client.updateServers();
        Thread.sleep(Long.MAX_VALUE);
    }
}

3、打包测试

3.1将Server.java && Client.java 打包为 Runnable JAR file
3.2、运行client

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

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

启动后查看zk控制台

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

ok,已经感知到了testServer01上线

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016年10月14日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、环境说明
    • 1.1、zookeeper环境
      • 1.2、开发及测试环境
      • 2、代码实现
        • 2.1、服务上线注册功能开发
        • 3、打包测试
          • 3.1将Server.java && Client.java 打包为 Runnable JAR file
            • 3.2、运行client
              • 3.3、启动一个Server并取名为testServer01
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档