zookeeper实现分布式配置:
服务器向zookeeper去get或者watch,当配置产生修改时,zookeeper会回调服务器。
//自己想要管理的配置
public class MyConf {
private String conf ;
public String getConf() {
return conf;
}
public void setConf(String conf) {
this.conf = conf;
}
}
//new zookeeper 时放入的watch
public class DefaultWatch implements Watcher {
CountDownLatch cc ;
public void setCc(CountDownLatch cc) {
this.cc = cc;
}
@Override
public void process(WatchedEvent event) {
System.out.println(event.toString());
switch (event.getState()) {
case Unknown:
break;
case Disconnected:
break;
case NoSyncConnected:
break;
case SyncConnected:
cc.countDown();
break;
case AuthFailed:
break;
case ConnectedReadOnly:
break;
case SaslAuthenticated:
break;
case Expired:
break;
}
}
//callBack和watch公共类
public class WatchCallBack implements Watcher ,AsyncCallback.StatCallback, AsyncCallback.DataCallback {
ZooKeeper zk ;
MyConf conf ;
CountDownLatch cc = new CountDownLatch(1);
public MyConf getConf() {
return conf;
}
public void setConf(MyConf conf) {
this.conf = conf;
}
public ZooKeeper getZk() {
return zk;
}
public void setZk(ZooKeeper zk) {
this.zk = zk;
}
public void aWait(){
zk.exists("/AppConf",this,this ,"ABC");
try {
cc.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void processResult(int rc, String path, Object ctx, byte[] data, Stat stat) {
if(data != null ){
String s = new String(data);
conf.setConf(s);
cc.countDown();
}
}
@Override
public void processResult(int rc, String path, Object ctx, Stat stat) {
if(stat != null){
zk.getData("/AppConf",this,this,"sdfs");
}
}
@Override
public void process(WatchedEvent event) {
switch (event.getType()) {
case None:
break;
case NodeCreated:
zk.getData("/AppConf",this,this,"sdfs");
break;
case NodeDeleted:
//容忍性
conf.setConf("");
cc = new CountDownLatch(1);
break;
case NodeDataChanged:
zk.getData("/AppConf",this,this,"sdfs");
break;
case NodeChildrenChanged:
break;
}
}
}
public class ZKUtils {
private static ZooKeeper zk;
private static String address = "zk集群:port/testConf";
private static DefaultWatch watch = new DefaultWatch();
private static CountDownLatch init = new CountDownLatch(1);
public static ZooKeeper getZK(){
try {
zk = new ZooKeeper(address,1000,watch);
watch.setCc(init);
init.await();
} catch (Exception e) {
e.printStackTrace();
}
return zk;
}
}
public class TestConfig {
ZooKeeper zk;
@Before
public void conn (){
zk = ZKUtils.getZK();
}
@After
public void close (){
try {
zk.close();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Test
public void getConf(){
WatchCallBack watchCallBack = new WatchCallBack();
watchCallBack.setZk(zk);
MyConf myConf = new MyConf();
watchCallBack.setConf(myConf);
watchCallBack.aWait();
//1,节点不存在
//2,节点存在
while(true){
if(myConf.getConf().equals("")){
System.out.println("配置被删除了");
watchCallBack.aWait();
}else{
System.out.println(myConf.getConf());
}
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}