1. 程式人生 > 其它 >基於Zookeeper實現統一配置管理

基於Zookeeper實現統一配置管理

為什麼需要統一配置?

我們在開發系統時,一般會將一些資訊新增到配置檔案中,比如資料庫資訊、日誌等,如果需要更改也是修改配置檔案然後再發布到生產中,這種方式在叢集的環境下就會顯得很麻煩。那麼有什麼解決方法呢?

  1. 將公共配置抽取出來
  2. 提供統一的配置入口對公共配置進行修改
  3. 修改後的內容能夠同步到各集群系統中

Zookeeper方案

這裡我們採取zookeeper實現統一配置管理,配置資訊存放在zookeeper的節點中,一旦配置資訊發生改變,zk會通知監聽該節點的客戶端系統,客戶端系統獲取最新的配置資訊,然後進行配置資訊的重新載入。
下面基於zookeeper實現了一個粗略的統一配置管理
通過Maven引入zkclient.jar

<dependency>
  <groupId>com.101tec</groupId>
  <artifactId>zkclient</artifactId>
  <version>0.11</version>
</dependency>

建立配置資訊實體 Config.java

package com.wrxiang.zk.util;

import java.io.Serializable;

public class Config implements Serializable {

    private static final long serialVersionUID = -3960940730727782588L;

    private String userName;
    private String password;

    public Config(String userName, String password){
        this.userName = userName;
        this.password = password;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "Config{" +
                "userName='" + userName + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}

配置管理中心ZkConfigMag

package com.wrxiang.zk.util;

import org.I0Itec.zkclient.ZkClient;

public class ZkConfigMag {

    private Config config;

    /**
     * 模擬獲取配置檔案,從資料庫載入或從前臺獲取
     * @return
     */
    public Config downLoadConfig(){
        config = new Config("test", "123");
        return config;
    }

    /**
     * 更新配置資訊
     * @param userName
     * @param password
     */
    public void upLoadConfig(String userName, String password){
        if(config == null){
            config = new Config(userName, password);
        }else{
            config.setUserName(userName);
            config.setPassword(password);
        }
    }



    public void syncConfigToZk(){

        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        if(!zkClient.exists("/zkConfig")){
            zkClient.createPersistent("/zkConfig", true);
        }
        zkClient.writeData("/zkConfig", config);
        zkClient.close();
    }

}

應用監聽實現ZkGetConfigClient

package com.wrxiang.zk.util;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

public class ZkGetConfigClient {

    private Config config;

    public Config getConfig() throws Exception {
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        if(!zkClient.exists("/zkConfig")){
            throw new Exception("配置資訊節點不存在");
        }
        config = zkClient.readData("/zkConfig");
        System.out.println("載入到配置資訊:" + config.toString());

        zkClient.subscribeDataChanges("/zkConfig", new IZkDataListener() {
            @Override
            public void handleDataChange(String s, Object o) throws Exception {
                config = (Config)o;
                System.out.println("監聽到配置資訊被修改" + config.toString());
            }

            @Override
            public void handleDataDeleted(String s) throws Exception {
                config = null;
                System.out.println("監聽到配置資訊被刪除");
            }
        });
        return config;
    }
}

測試,啟動配置管理中心

package com.wrxiang.zk.util;

public class ZkConfigTest {
    public static void main(String[] args) throws Exception {
        ZkConfigMag zkConfigMag = new ZkConfigMag();
        Config config = zkConfigMag.downLoadConfig();
        System.out.println("初始化載入配置資訊:" + config.toString());
        zkConfigMag.syncConfigToZk();
        System.out.println("同步配置資訊至zookeeper");

        ZkGetConfigClient zkGetConfigClient = new ZkGetConfigClient();
        zkGetConfigClient.getConfig();

        //暫停一會
        Thread.sleep(1000);

        zkConfigMag.upLoadConfig("test222", "3336666");
        System.out.println("修改配置檔案:" + config.toString());
        zkConfigMag.syncConfigToZk();
        System.out.println("同步配置檔案至zookeeper");

        Thread.sleep(1000);
    }
}

啟動測試後,控制檯輸出

初始化載入配置資訊:Config{userName='test', password='123'}
同步配置資訊至zookeeper
載入到配置資訊:Config{userName='test', password='123'}
修改配置檔案:Config{userName='test222', password='3336666'}
同步配置檔案至zookeeper
監聽到配置資訊被修改Config{userName='test222', password='3336666'}

通過上述例子介紹如何使用zokeeper實現簡單的配置管理,實際系統應用肯定更加複雜,但是原理類似。

本文來自部落格園,作者:風煙景,轉載請註明原文連結:https://www.cnblogs.com/wrxiang/p/15145405.html