使用场景
整个系统中分master和server两种角色,每个master、server都需要知道集群内当前可用的server列表。
原处理方式:master负责集群server信息的收集和分发。server启动后和master建立长连接并心跳检测,master收集server的新增和disconnect,并将收集到的信息分发给所有server。
原存在问题:master和server耦合较重;master比较难扩展。
使用方式
概述
每个server对应一个Zookeeper的一个子节点,所有master和push通过获取所有子节点取得server列表,当server disconnect时Zookeeper通知所有机器重新获取Server列表。
详细
根节点路劲:/service/serverlist
1.初始化Zookeeper连接
publicstatic void initZk() {
try{
#####初始化,如果当前有alive的zk连接就不初始化了
if(zk == null|| !zk.getState().isAlive()) {
synchronized(obj) {
if(zk == null|| !zk.getState().isAlive()) {
###把之前的close掉
closeZk();
PropertyReader p = newPropertyReader(ZK_PROPERTIES_FILE);
String zkServerStr = p.getValueAsString("zookeeper.server", ZK_SERVER_STR_DEFAULT);
intsessionTimeout = p.getValueAsInt("zookeeper.sessionTimeout", ZK_SESSION_TIMEOUT);
###重新建立连接
zk = newZooKeeper(zkServerStr, sessionTimeout,newDefaultWatcher());
}
}
}
}catch(Exception e) {
thrownew RuntimeException("Zookeeper Init Error!", e);
}
}