运行于centos 6.5 X64系统zookeeper-3.4.8版本,运行于三台节点ha环境,分别对应如下:
[java]zookeeperServer1、zookeeperServer2、zookeeperServer3[/java]
win10系统jdk1.7版本
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);
}
}
这里可以看到zk下根节点server下面是没有东西的
启动后查看zk控制台
这里可以看到已经有了一个节点了,再看一下client控制台是否能感知到
ok,已经感知到了testServer01上线
关于服务离线检测时间问题:服务离线后并不会像上线一样立即感知,而是基于zk设置的心跳时间来检测。