基於zookeeper實現統一配置管理

進擊的java程式設計師k發表於2019-04-27

為什麼要用統一配置?

我們做專案時用到的配置比如資料庫配置等...我們都是寫死在專案裡面,如果需要更改,那麼也是的修改配置檔案然後再投產上去,那麼問題來了,如果做叢集的呢,有100臺機器,這時候做修改那就太不切實際了;那麼就需要用到統一配置管理啦。

解決思路

1.把公共配置抽取出來

2.對公共配置進行維護

3.修改公共配置後應用不需要重新部署

採用方案

1.公共配置抽取存放於zookeeper中並落地資料庫

2.對公共配置修改後釋出到zookeeper中並落地資料庫

3.對應用開啟配置實時監聽,zookeeper配置檔案一旦被修改,應用可實時監聽到並獲取

下面基於zookeeper粗略實現了一個統一配置管理

需要用到的jar是zkclient

配置檔案Config

package com.cwh.zk.util;
 
import java.io.Serializable;
 
public class Config implements Serializable{
 
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	private String userNm;
	private String userPw;
	
	public Config() {
	}
	public Config(String userNm, String userPw) {
		this.userNm = userNm;
		this.userPw = userPw;
	}
	public String getUserNm() {
		return userNm;
	}
	public void setUserNm(String userNm) {
		this.userNm = userNm;
	}
	public String getUserPw() {
		return userPw;
	}
	public void setUserPw(String userPw) {
		this.userPw = userPw;
	}
	@Override
	public String toString() {
		return "Config [userNm=" + userNm + ", userPw=" + userPw + "]";
	}
	
}複製程式碼

 配置管理中心ZkConfigMag 

 package com.cwh.zk.util;
 
import org.I0Itec.zkclient.ZkClient;
 
public class ZkConfigMag {
 
	private Config config;
	/**
	 * 從資料庫載入配置
	 */
	public Config downLoadConfigFromDB(){
		//getDB
		config = new Config("nm", "pw");
		return config;
	}
	
	/**
	 * 配置檔案上傳到資料庫
	 */
	public void upLoadConfigToDB(String nm, String pw){
		if(config==null)config = new Config();
		config.setUserNm(nm);
		config.setUserPw(pw);
		//updateDB
	}
	
	/**
	 * 配置檔案同步到zookeeper
	 */
	public void syncConfigToZk(){
		ZkClient zk = new ZkClient("localhost:2181");
		if(!zk.exists("/zkConfig")){
			zk.createPersistent("/zkConfig",true);
		}
		zk.writeData("/zkConfig", config);
		zk.close();
	}
}
複製程式碼

應用監聽實現ZkGetConfigClient 

 package com.cwh.zk.util;
 
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;
 
public class ZkGetConfigClient {
 
	private Config config;
 
	public Config getConfig() {
		ZkClient zk = new ZkClient("localhost:2181");
		config = (Config)zk.readData("/zkConfig");
		System.out.println("載入到配置:"+config.toString());
		
		//監聽配置檔案修改
		zk.subscribeDataChanges("/zkConfig", new IZkDataListener(){
			@Override
			public void handleDataChange(String arg0, Object arg1)
					throws Exception {
				config = (Config) arg1;
				System.out.println("監聽到配置檔案被修改:"+config.toString());
			}
 
			@Override
			public void handleDataDeleted(String arg0) throws Exception {
				config = null;
				System.out.println("監聽到配置檔案被刪除");
			}
			
		});
		return config;
	}
	public static void main(String[] args) {
		ZkGetConfigClient client = new ZkGetConfigClient();
		client.getConfig();
		System.out.println(client.config.toString());
		for(int i = 0;i<10;i++){
			System.out.println(client.config.toString());
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		
	}
 
	
}複製程式碼

 測試,啟動配置管理中心 

package com.cwh.zkConfig.test;
 
import com.cwh.zk.util.Config;
import com.cwh.zk.util.ZkConfigMag;
 
public class ZkConfigTest {
 
	public static void main(String[] args) {
		ZkConfigMag mag = new ZkConfigMag();
		Config config = mag.downLoadConfigFromDB();
		System.out.println("....載入資料庫配置...."+config.toString());
		mag.syncConfigToZk();
		System.out.println("....同步配置檔案到zookeeper....");
		
		//歇會,這樣看比較清晰
		try {
			Thread.sleep(10000);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		mag.upLoadConfigToDB("cwhcc", "passwordcc");
		System.out.println("....修改配置檔案...."+config.toString());
		mag.syncConfigToZk();
		System.out.println("....同步配置檔案到zookeeper....");
		
		
	}
	
}
複製程式碼

測試結果: 

配置管理中心列印

基於zookeeper實現統一配置管理

基於zookeeper實現統一配置管理

最後:

對文章有興趣的朋友可以關注下小編,以後會有更多的精品文章持續更新。


相關文章