本篇和大家分享的是一个简易配置中心框架IConfCenter,框架是利用空余时间写的,主要以配置文件+redis存储方式作为数据同步驱动,目前支持的配置文件格式有 .properties 和 .config,后期有时间可能增加 .xml 和 .yml文件的识别。

框架结构简单分为:

  • confserver - 服务端

    confAdmin - 配置中心后台管理

    confCenter - 配置中心

  • confclient - 客户端

    每分钟获取配置

    订阅配置中心刷新配置

发一张配置中心应用到项目中的手工设计图:

confAdmin - 配置中心后台管理

后台管理主要就是一个简单的操作界面,采用springboot+thymeleaf+jquery搭建,目前主要有两个功能:展示配置文件列表和启用某个配置

展示配置文件列表:其实就是读取本地磁盘目录中的配置文件信息,主要的service代码如下:

  1. /**
  2. * 配置文件列表
  3. *
  4. * @return
  5. */
  6. public List<File> getListConf() {
  7. File baseFile = new File(confCenterConf.confserver_confs_basepath);
  8. File[] files = baseFile.listFiles();
  9. List<File> list = Arrays.asList(files).
  10. stream().
  11. sorted(Comparator.comparing(File::lastModified).reversed()).
  12. collect(Collectors.toList());
  13. return list;
  14. }

启用某个配置:主要通过界面按钮触发ajax提交一个启动post请求,后端通过解析指定配置文件内容为Map结构,并永久存储于Redis缓存中(直到下一次配置内容更新),最后通过Redis的发布功能通知给订阅该配置的客户端,让客户端通过api重新获取并更新本地配置。主要的Service代码如下:

  1. /**
  2. * 启用某个配置+通知消费端(订阅channel规则:confs_配置文件名)
  3. *
  4. * @param confPath
  5. * @return
  6. */
  7. public MoRp qyConf(String confPath) {
  8. MoRp rp = new MoRp();
  9. rp.setStatus(EnumHelper.EmRpStatus.失败.getVal());
  10.  
  11. try {
  12. //读取配置文件
  13. Map<String, Object> map = LoadConf.readConfToMap(confPath);
  14. if (map.isEmpty()) {
  15. rp.setMessage("加载配置文件失败,稍后重试");
  16. return rp;
  17. }
  18.  
  19. //文件名称
  20. String filePathToName = LoadConf.getFilePathToName(confPath, true);
  21.  
  22. //缓存key
  23. String cacheKey = String.format("confs_%s", filePathToName);
  24.  
  25. //2018.09.13 临时增加配置文件修改时间
  26. File file = new File(confPath);
  27. MoGetConfRp confRp = new MoGetConfRp();
  28. confRp.setConfLastModified(file.lastModified());
  29. confRp.setConfs(map);
  30. confRp.setConfVersion(filePathToName);
  31. confRp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
  32.  
  33. //存储到缓存中 永久
  34. if (jedisTool.set(cacheKey, confRp, )) {
  35.  
  36. //发布消息,通知客户端更新配置
  37. jedisTool.publish(cacheKey, confRp.getConfVersion());
  38. rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
  39. rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
  40. }
  41. } catch (IOException e) {
  42. e.printStackTrace();
  43. }
  44. return rp;
  45. }

confCenter - 配置中心

主要提供了一个获取指定版本的配置文件信息api,信息来源由Redis缓存提供,当Redis缓存不存在时不会去解析配置文件,因此主要用ConfiAdmin管理后台触发数据来源。其主要代码:

  1. /**
  2. * 获取配置信息
  3. *
  4. * @param rq
  5. * @return
  6. */
  7. public MoGetConfRp getconf(MoGetConfRq rq) {
  8.  
  9. MoGetConfRp rp = new MoGetConfRp();
  10. try {
  11. //未指定配置版本,采用默认配置版本
  12. if (rq.getConfVersion().isEmpty()) {
  13. rq.setConfVersion(confCenterConf.confserver_confs_currentConfVersion);
  14. }
  15. if (rq.getConfVersion().isEmpty()) {
  16. rp.setMessage("未找到配置版本");
  17. return rp;
  18. }
  19.  
  20. //缓存key
  21. String cacheKey = String.format("confs_%s", rq.getConfVersion());
  22.  
  23. //获取缓存中是否存在
  24. rp = jedisTool.get(cacheKey, MoGetConfRp.class);
  25. if (rp.getStatus() == EnumHelper.EmRpStatus.成功.getVal() &&
  26. rp.getConfs().size() >= ) {
  27. rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
  28. rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
  29. return rp;
  30. }
  31. } catch (Exception e) {
  32. e.printStackTrace();
  33. }
  34. return rp;
  35. }

confclient - 客户端

主要干了两个事情:每分钟获取配置和订阅配置中心刷新配置。该客户端项目各位可以打包成jar引入项目中,加上相关配置即可引入配置中心客户端

每分钟获取配置

为了配置内容的一致性,这里采用了Scheduled每隔一分钟请求一下配置中心api,然后通过版本号对比是否有更新,如果对比有新版本那么即可更新缓存于本地的配置信息。主要代码如:

  1. /**
  2. * 每分钟获取配置,版本号不一致更新本地缓存
  3. *
  4. */
  5. @Scheduled(initialDelay = * ,fixedDelay = * )
  6. public void refreshConf() {
  7. System.out.println(new Date() + ":当前配置版本" +
  8. confCenterConf.confserver_confs_currentConfVersion);
  9. if (confCenterConf.confserver_confs_currentConfVersion.isEmpty()) {
  10. System.out.println("版本为空,无法自动拉取配置");
  11. return;
  12. }
  13. updateConf(confCenterConf.confserver_confs_currentConfVersion);
  14. }
  15.  
  16. /**
  17. * 更新本地配置
  18. * @param strVersion
  19. */
  20. private void updateConf(String strVersion) {
  21. //获取配置中心配置
  22. MoGetConfRp rp = confCenterClientService.getConfCenterConf(strVersion);
  23. if (rp.getStatus() != EnumHelper.EmRpStatus.成功.getVal()) {
  24. return;
  25. }else if(rp.getConfLastModified() == confCenterClientService.getConfLastModified()){
  26. return;
  27. }
  28. System.out.println(new Date() + ":更新本地配置");
  29. //版本不一致,更新本地缓存
  30. confCenterClientService.setConf(rp);
  31. }

订阅配置中心刷新配置

通过实现CommandLineRunner接口的run方法,在项目启动时通过Redis订阅配置中心消息,达到配置中心主动通知更新配置的目的。主要代码:

  1. /**
  2. * 程序启动执行服务 订阅配置中心刷新配置通道
  3. *
  4. * @param strings
  5. * @throws Exception
  6. */
  7. @Override
  8. public void run(String... strings) throws Exception {
  9. //订阅配置中心刷新配置通道
  10. jedisTool.subscribe(
  11. "confs_" + confCenterConf.confserver_confs_currentConfVersion,
  12. b -> {
  13. System.out.println(new Date() + ":收到配置中心刷新配置通知,版本-" + b);
  14. updateConf(b.toString());
  15. });
  16. }

在文章结尾时,发一张配置中心后台管理界面图,并希望各位能够喜欢配置中心框架IConfCenter

配置中心框架IConfCenter的更多相关文章

  1. 玩转Spring Cloud之配置中心(config server &config client)

     本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1.2.svn方式 1.3.本地文件方式 1.4.解决配置中包含中文内容返回乱码问题 二.搭建配置消费客户端( ...

  2. 分布式配置中心 携程(apollo)

    1.传统配置文件与分布式配置文件区别 传统配置文件:如果修改了配置文件,需要重新打包发布,重新发布服务,而且每个环境的变更配置文件,比较繁琐. 分布式配置文件:将配置文件注册到配置中心上去,可以使用分 ...

  3. SrpingCloud 之SrpingCloud config分布式配置中心

    Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...

  4. 【Distributed】分布式配置中心

    一.概述 1.1 什么是分布式配置中心 常用分布式配置中心框架 二.Apollo阿波罗 2.1 Apollo特点 2.2 Apollo整体架构原理 2.3 Apollo Portol 环境搭建 Lin ...

  5. 分布式配置中心Apollo

    1,什么是分布式配置中心 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做 ...

  6. Apollo配置中心的实战

    31.携程 Apollo 配置中心介绍~1.mp4 32.Apollo核心概念~1.mp4 32.Apollo核心概念~1.mp4 每个应用需要有一个唯一的AppID 要在指定的机器上的server. ...

  7. .Net Core with 微服务 - Consul 配置中心

    上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...

  8. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  9. java框架之SpringCloud(7)-Config分布式配置中心

    前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...

随机推荐

  1. Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...

  2. vue简介

    vue的介绍 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. vue的优点 1.易用 ...

  3. Python中使用MongoEngine3

    最近重新拾起Django,但是Django并不支持mongodb,但是有一个模块mongoengine可以实现Django Model类似的封装.但是mongoengine的中文文档几乎没有,有的也是 ...

  4. 【bzoj 3309 】 DZY Loves Math

    Description 对于正整数n,定义f(n)为n所含质因子的最大幂指数.例如f(1960)=f(2^3 * 5^1 * 7^2)=3, f(10007)=1, f(1)=0.给定正整数a,b,求 ...

  5. 约会 倍增lca

    题意:一棵树,给两个点,求树上有多少点到他俩距离相等 倍增lca,分好多情况讨论.. #include<cstdio> #include<cstring> #include&l ...

  6. bzoj 1098 poi2007 办公楼 bfs+链表

    题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio ...

  7. laravel 5.4中手动创建分页

    这里是参考的的链接https://blog.csdn.net/hxx_yang/article/details/51753134 use Illuminate\Pagination\LengthAwa ...

  8. 磁盘IOPS计算与测量

    IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一.IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求 ...

  9. sql中1=1的and和or问题

    SELECT *  FROM mentor_teacher WHERE 1 = 1  AND status = ? limit 0, 10 sql语句中如果有1=1的问题, 那么,如果是and并且的关 ...

  10. TensorFlow之RNN:堆叠RNN、LSTM、GRU及双向LSTM

    RNN(Recurrent Neural Networks,循环神经网络)是一种具有短期记忆能力的神经网络模型,可以处理任意长度的序列,在自然语言处理中的应用非常广泛,比如机器翻译.文本生成.问答系统 ...