目录

统一配置管理简介

代码开发 


注意:本文参考  什么是ZooKeeper?

基于zookeeper实现统一配置管理_菜 头的博客-CSDN博客_zookeeper统一配置管理

统一配置管理简介

比如我们现在有三个系统A、B、C,他们有三份配置,分别是ASystem.yml、BSystem.yml、CSystem.yml,然后,这三份配置又非常类似,很多的配置项几乎都一样。

此时,如果我们要改变其中一份配置项的信息,很可能其他两份都要改。并且,改变了配置项的信息很可能就要重启系统

于是,我们希望把ASystem.yml、BSystem.yml、CSystem.yml相同的配置项抽取出来成一份公用的配置common.yml,并且即便common.yml改了,也不需要系统A、B、C重启。

做法:我们可以将common.yml这份配置放在ZooKeeper的Znode节点中,系统A、B、C监听着这个Znode节点有无变更,如果变更了,及时响应。

代码开发 

下面基于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....");
		
		
	}
	
}

测试结果:

配置管理中心打印:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐