分布式配置
单机的应用,一般写一份本地配置文件就可以了;
分布式的应用,一个个的去修改就显得比较麻烦,费力;这时我们可以通过Zookeeper实现分布式配置.
Zookeeper的优势在于,它有watcher的callback机制,只要对应的path发生了修改,就会回调,即时知道;
如果用redis的话,就需要客户端不断地去查询了.
创建Zookeeper对象,指定connectString时,可以在connectString最后加上一个路径 比如/testConf, 后续所有的操作都以它为跟路径,多个应用间互相隔离.
思路:
在一个路径上存储配置,多个实例去取这个路径的数据,并且监听它(watcher), 一但发生了变化或者被删除了,马上做出应对措施.
下面是使用异步模式的一个例子:
ZkUtil:
public class ZkUtil {
public static ZooKeeper zk;
public static final String configPath = "/appConfig";
private static final String myRoot = "/mytest";
private static final String connectString = "192.168.200.11:2181,192.168.200.12:2181,192.168.200.13:2181,192.168.200.14:2181";
private static final int sessionTimeout = 30000;
private static final CountDownLatch cdl = new CountDownLatch(1);
public static ZooKeeper initZookeeper() {
try {
DefaultWatcher watcher = new DefaultWatcher();
watcher.setCdl(cdl);
zk = new ZooKeeper(connectString + myRoot, sessionTimeout, watcher);
cdl.await();
return zk;
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
e.printStackTrace();
}
return null;
}
}
DefaultWatcher:
public class DefaultWatcher implements Watcher {
private CountDownLatch cdl;
public CountDownLatch getCdl() {
return cdl;
}
public void setCdl(CountDownLatch cdl) {
this.cdl = cdl;
}
@Override
public void process(WatchedEvent event) {
System.out.println("default watcher : " + event.toString());
switch (event.getState()) {
case Disconnected:
break;
case SyncConnected:
cdl.countDown();
break;
case AuthFailed:
break;
case ConnectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expired:
break;
case Closed:
break;
default:
break;
}
}
}
MyConf:
public class MyConf {
private String conf;
public String getConf() {
return conf;
}
public void setConf(String conf) {
this.conf = conf;
}
}
WatcherCallback:
public class WatcherCallback implements Watcher, AsyncCallback.StatCallback, AsyncCallback.DataCallback {
private ZooKeeper zk;
private MyConf conf;
private CountDownLatch cdl = new CountDownLatch(1);
public ZooKeeper getZk() {
return zk;
}
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
public MyConf getConf() {