基於Zookeeper實現統一配置管理
阿新 • • 發佈:2021-08-16
為什麼需要統一配置?
我們在開發系統時,一般會將一些資訊新增到配置檔案中,比如資料庫資訊、日誌等,如果需要更改也是修改配置檔案然後再發布到生產中,這種方式在叢集的環境下就會顯得很麻煩。那麼有什麼解決方法呢?
- 將公共配置抽取出來
- 提供統一的配置入口對公共配置進行修改
- 修改後的內容能夠同步到各集群系統中
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