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、服务上线注册功能开发
- 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设置的心跳时间来检测。