Zookeeper(三)实战应用案例-代码实现,分布式配置,分布式锁

分布式配置

单机的应用,一般写一份本地配置文件就可以了;
分布式的应用,一个个的去修改就显得比较麻烦,费力;这时我们可以通过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() {
   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值