zookeeper作为配置中心

为什么要用统一配置?

我们做项目时用到的配置比如数据库配置等...我们都是写死在项目里面,如果需要更改,那么也是的修改配置文件然后再投产上去,那么问题来了,如果做集群的呢,有100台机器,这时候做修改那就太不切实际了;那么就需要用到统一配置管理啦。

解决思路

1.把公共配置抽取出来

2.对公共配置进行维护

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

采用方案

1.公共配置抽取存放于zookeeper中并落地数据库

2.对公共配置修改后发布到zookeeper中并落地数据库

3.对应用开启配置实时监听,zookeeper配置文件一旦被修改,应用可实时监听到并获取


下面基于zookeeper粗略实现了一个统一配置管理

需要用到的jar是zkclient

配置文件Config


 
 
  1. package com.cwh.zk.util;
  2. import java.io.Serializable;
  3. public class Config implements Serializable{
  4. /**
  5. *
  6. */
  7. private static final long serialVersionUID = 1L;
  8. private String userNm;
  9. private String userPw;
  10. public Config() {
  11. }
  12. public Config(String userNm, String userPw) {
  13. this.userNm = userNm;
  14. this.userPw = userPw;
  15. }
  16. public String getUserNm() {
  17. return userNm;
  18. }
  19. public void setUserNm(String userNm) {
  20. this.userNm = userNm;
  21. }
  22. public String getUserPw() {
  23. return userPw;
  24. }
  25. public void setUserPw(String userPw) {
  26. this.userPw = userPw;
  27. }
  28. @Override
  29. public String toString() {
  30. return "Config [userNm=" + userNm + ", userPw=" + userPw + "]";
  31. }
  32. }
配置管理中心ZkConfigMag

 
 
  1. package com.cwh.zk.util;
  2. import org.I0Itec.zkclient.ZkClient;
  3. public class ZkConfigMag {
  4. private Config config;
  5. /**
  6. * 从数据库加载配置
  7. */
  8. public Config downLoadConfigFromDB(){
  9. //getDB
  10. config = new Config( "nm", "pw");
  11. return config;
  12. }
  13. /**
  14. * 配置文件上传到数据库
  15. */
  16. public void upLoadConfigToDB(String nm, String pw){
  17. if(config== null)config = new Config();
  18. config.setUserNm(nm);
  19. config.setUserPw(pw);
  20. //updateDB
  21. }
  22. /**
  23. * 配置文件同步到zookeeper
  24. */
  25. public void syncConfigToZk(){
  26. ZkClient zk = new ZkClient( "localhost:2181");
  27. if(!zk.exists( "/zkConfig")){
  28. zk.createPersistent( "/zkConfig", true);
  29. }
  30. zk.writeData( "/zkConfig", config);
  31. zk.close();
  32. }
  33. }
应用监听实现ZkGetConfigClient

 
 
  1. package com.cwh.zk.util;
  2. import org.I0Itec.zkclient.IZkDataListener;
  3. import org.I0Itec.zkclient.ZkClient;
  4. public class ZkGetConfigClient {
  5. private Config config;
  6. public Config getConfig() {
  7. ZkClient zk = new ZkClient( "localhost:2181");
  8. config = (Config)zk.readData( "/zkConfig");
  9. System.out.println( "加载到配置:"+config.toString());
  10. //监听配置文件修改
  11. zk.subscribeDataChanges( "/zkConfig", new IZkDataListener(){
  12. @Override
  13. public void handleDataChange(String arg0, Object arg1)
  14. throws Exception {
  15. config = (Config) arg1;
  16. System.out.println( "监听到配置文件被修改:"+config.toString());
  17. }
  18. @Override
  19. public void handleDataDeleted(String arg0) throws Exception {
  20. config = null;
  21. System.out.println( "监听到配置文件被删除");
  22. }
  23. });
  24. return config;
  25. }
  26. public static void main(String[] args) {
  27. ZkGetConfigClient client = new ZkGetConfigClient();
  28. client.getConfig();
  29. System.out.println(client.config.toString());
  30. for( int i = 0;i< 10;i++){
  31. System.out.println(client.config.toString());
  32. try {
  33. Thread.sleep( 1000);
  34. } catch (InterruptedException e) {
  35. // TODO Auto-generated catch block
  36. e.printStackTrace();
  37. }
  38. }
  39. }
  40. }
测试,启动配置管理中心


 
 
  1. package com.cwh.zkConfig.test;
  2. import com.cwh.zk.util.Config;
  3. import com.cwh.zk.util.ZkConfigMag;
  4. public class ZkConfigTest {
  5. public static void main(String[] args) {
  6. ZkConfigMag mag = new ZkConfigMag();
  7. Config config = mag.downLoadConfigFromDB();
  8. System.out.println( "....加载数据库配置...."+config.toString());
  9. mag.syncConfigToZk();
  10. System.out.println( "....同步配置文件到zookeeper....");
  11. //歇会,这样看比较清晰
  12. try {
  13. Thread.sleep( 10000);
  14. } catch (InterruptedException e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. mag.upLoadConfigToDB( "cwhcc", "passwordcc");
  19. System.out.println( "....修改配置文件...."+config.toString());
  20. mag.syncConfigToZk();
  21. System.out.println( "....同步配置文件到zookeeper....");
  22. }
  23. }
测试结果:

配置管理中心打印:

应用监听:




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值