A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

zookeeper 监听存活节点
   应用场景,公司服务器不想做负载均衡,但又担心单点故障的情况发生,于是将服务器资源注册到zookeeper中,客户端从zookeeper中动态获取服务器资源,然后通过资源进行访问,可以注册多个服务器资源到zookeeper,客户端监听zookeeper中的服务资源,当服务端有故障,比如服务当机,则zookeeper中的资源因为长连接断开而自动移除资源,同时客户端的资源会自动重载过滤,达到自动选择存活节点的目的。
注意事项:
     1:创建节点时,需要创建临时节点ephemeral,session失效时间要按需求设置,session失效时间默认为30秒。
     2:创建节点时,先删除此节点。
    实现代码如下:
   
[Java] 纯文本查看 复制代码
public interface ZkConfig {

        /**
         * 配置平台根节点名称
         */
        static String root = "/server_node";

        /**
         * 初始化配置
         */
        void init();

        /**
         * 重新加载配置资源
         */
        void reload();

        /**
         * 添加配置
         * @param key
         * @param value
         */
        void add(String key, String value);

        /**
         * 更新配置
         * @param key
         * @param value
         */
        void update(String key, String value);

        /**
         * 删除配置
         * @param key
         */
        void delete(String key);

        /**
         * 获取配置
         * @param key
         * @return
         */
        String get(String key);

        /**
         * 获取所有的配置内容
         * @return
         */
        Map<String, String> getAll();
}


监听实现
[Java] 纯文本查看 复制代码
public class ZkWatcher {

    private ZkClient client;

    private ZkListener zkListener;

    private ZkConfig zkConfig ;

    public ZkWatcher(ZkClient client, ZkConfig zkConfig) {
        this.client = client;
        this.zkConfig = zkConfig ;
        this.initConfig();
    }

    private void initConfig(){
        zkListener = new ZkListener();
    }

    public void watcher(String key){
        client.subscribeDataChanges(key, configYardListener);
        client.subscribeChildChanges(key, configYardListener);
    }

    /**
     * 配置监听器
     * @author flyking
     *
     */
    private class ZkListener  implements IZkDataListener,IZkChildListener{
        public void handleDataChange(String dataPath, Object data)
                throws Exception {
           System.out.println("data "+dataPath+" change,start reload configProperties");
            configYard.reload();
        }

        public void handleDataDeleted(String dataPath) throws Exception {
            System.out.println("data "+dataPath+" delete,start reload configProperties");
            configYard.reload();
        }

        public void handleChildChange(String parentPath,
                                      List<String> currentChilds) throws Exception {
            System.out.println("data "+parentPath+" ChildChange,start reload configProperties");
            ZkConfig.reload();
        }

    }
}


接口方法实现
[AppleScript] 纯文本查看 复制代码
public class ZkConfigImpl implements ZkConfig {

    /**
     * 存储配置内容
     */
    private volatile Map<String, String> zkProperties = new HashMap<String, String>();

    private ZkClient client;

    private ZkWatcher  zkWatcher ;

    public ZkConfigImpl(String serverstring) {

        this.client = new  ZkClient(serverstring, 300, 3000);
        zkWatcher = new ZkWatcher(client,this);
        this.init();
    }

    /**
     * 初始化加载配置到内存
     */
    public void init() {
        if(!client.exists(root)){
            client.createEphemeral(root);
        }
        if (zkProperties == null) {
            System.out.println("start to init zkProperties");
            zkProperties = this.getAll();
            System.out.println("init zkProperties over");
        }
    }

    private String contactKey(String key){
        return root.concat("/").concat(key);
    }

    public void add(String key, String value) {
        String contactKey = this.contactKey(key);
        this.client.createEphemeral(contactKey, value);
        zkWatcher.watcher(contactKey);
    }

    public void update(String key, String value) {
        String contactKey = this.contactKey(key);
        this.client.writeData(contactKey, value);
        zkWatcher.watcher(contactKey);
    }

    public void delete(String key) {
        String contactKey = this.contactKey(key);
        this.client.delete(contactKey);
    }

    public String get(String key) {
        if(this.zkProperties.get(key) == null){
            String contactKey = this.contactKey(key);
            if(!this.client.exists(contactKey)){
                return null;
            }
            return this.client.readData(contactKey);
        }
        return zkProperties.get(key);
    }

    public Map<String, String> getAll() {
        if(zkProperties != null){
            return zkProperties;
        }
        List<String> list = this.client.getChildren(root);
        Map<String, String> currentProperties = new HashMap<String, String>();
        for(String zk : list){
            String value = this.client.readData(zk);
            String key = zk.substring(zk.indexOf("/")+1);
            currentProperties.put(key, value);
        }
        return zkProperties;
    }

    public void reload() {
        List<String> list = this.client.getChildren(root);
        Map<String, String> currentProperties = new HashMap<String, String>();
        for(String zk : list){
            String value = this.client.readData(this.contactKey(zk));
            System.out.println(zk +"========="+value);
            currentProperties.put(zk, value);
        }
        zkProperties = currentProperties;
    }

}


测试
[Java] 纯文本查看 复制代码
public static void main(String[] args) {


        ZkConfigImpl  zk = new ZkConfigImpl ("192.168.41.128:2181");
        zk.add("server1", "192.168.1.101:1101");
        zk.add("server2", "192.168.1.101:1102");

        System.out.println("value is===>"+zk.get("server1"));
        System.out.println("value is===>"+zk.get("server2"));

        yard.update("server1", "192.168.9.109:8080");
        System.out.println("update server1 value is===>"+zk.get("server1"));
        yard.delete("server1");
        yard.delete("server2");

    }
}


---------------------
作者:踏海寻天
来源:CSDN
原文:https://blog.csdn.net/u011066435/article/details/78158357
版权声明:本文为博主原创文章,转载请附上博文链接!


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马