本篇和大家分享的是一个简易配置中心框架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, 0)) {
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管理后台触发数据来源。其主要代码:

    /*** 获取配置信息** @param rq* @return*/public MoGetConfRp getconf(MoGetConfRq rq) {MoGetConfRp rp = new MoGetConfRp();try {//未指定配置版本,采用默认配置版本if (rq.getConfVersion().isEmpty()) {rq.setConfVersion(confCenterConf.confserver_confs_currentConfVersion);}if (rq.getConfVersion().isEmpty()) {rp.setMessage("未找到配置版本");return rp;}//缓存keyString cacheKey = String.format("confs_%s", rq.getConfVersion());//获取缓存中是否存在rp = jedisTool.get(cacheKey, MoGetConfRp.class);if (rp.getStatus() == EnumHelper.EmRpStatus.成功.getVal() &&rp.getConfs().size() >= 1) {rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());rp.setMessage(EnumHelper.EmRpStatus.成功.toString());return rp;}} catch (Exception e) {e.printStackTrace();}return rp;}

confclient - 客户端

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

每分钟获取配置

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

 1 /**
 2      * 每分钟获取配置,版本号不一致更新本地缓存
 3      *
 4      */
 5     @Scheduled(initialDelay =  1000 * 60,fixedDelay = 1000 * 60)
 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订阅配置中心消息,达到配置中心主动通知更新配置的目的。主要代码:

    /*** 程序启动执行服务 订阅配置中心刷新配置通道* * @param strings* @throws Exception*/@Overridepublic void run(String... strings) throws Exception {//订阅配置中心刷新配置通道
        jedisTool.subscribe("confs_" + confCenterConf.confserver_confs_currentConfVersion,b -> {System.out.println(new Date() + ":收到配置中心刷新配置通知,版本-" + b);updateConf(b.toString());});}

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

转载于:https://www.cnblogs.com/wangrudong003/p/9668798.html

配置中心框架IConfCenter相关推荐

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

    玩转Spring Cloud之配置中心(config server &config client)  本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1 ...

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

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

  3. .NET Core with 微服务 - Consul 配置中心

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

  4. 微服务配置中心是干啥的_微服务化改造系列之三:配置中心

    配置中心概述 这篇文章是微服务化改造系列的第三篇,主题是配置中心.上一篇我们谈到服务注册中心,即通过提供某种注册和发现的机制,解决服务互通的问题.那么问题来了,一个服务如何知道服务注册中心的地址呢?这 ...

  5. 搭建SpringCloud配置中心 Config Server

    项目地址: 链接:https://pan.baidu.com/s/1Mxo0ltvZbpz_r8mCU-mSpw  提取码:3j4a 问题解答: SpringCloud Config 分布式配置文件中 ...

  6. ASP.NET Core 配置中心

    前言 正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大 ...

  7. RPC分布式网络通信框架(三)—— 服务配置中心Zookeeper模块

    文章目录 一.使用Zookeeper的意义 二.Zookeeper基础 1 文件系统 2 通知机制 3 原生zkclient API存在的问题 4 服务配置中心Zookeeper模块 三.Zk类实现 ...

  8. springcloud简单微服务框架 | 第六章 分布式配置中心

    在微服务中,配置文件一旦出现问题,则需要重新打包部署,若是一个服务出现问题处理起来不是很麻烦,但是如果很多服务都出现了问题,则需要浪费大量时间,基于这个问题,Spring Cloud提供了分布式配置中 ...

  9. 用了这么久配置中心,还不知道长轮询是什么?

    前言 传统的静态配置方式想要修改某个配置时,必须重新启动一次应用,如果是数据库连接串的变更,那可能还容易接受一些,但如果变更的是一些运行时实时感知的配置,如某个功能项的开关,重启应用就显得有点大动干戈 ...

最新文章

  1. windows的几个原则
  2. 攻防世界-web-bug-从0到1的解题历程writeup
  3. 【Python3】【爬虫】meizituSpider
  4. 解决vmware“二进制转换和长模式与此平台兼容.....”问题
  5. cvt公链采用什么结构_好马配好鞍,迈锐宝上全新的CVT变速箱,是什么来头?
  6. 【知识点总结】电力系统基础
  7. iOS开发-使用dSYM文件符号化Crash日志
  8. 用于热水器行业气密性检测的五款快速密封接头
  9. CommonAPI-SomeIP 使用
  10. 谷歌:但使龙城飞将在 不教算法度阴山
  11. 中国的操作系统都有哪些?
  12. 模版消息智能推送!我们教你发得更快更多更省
  13. 1 buffers were freed while being dequeued
  14. 部署LNMP并利用LNMP搭建wordpress论坛
  15. 大学生没有项目经验该怎么拿测开岗位的office?
  16. 基于51单片机的寻迹小车
  17. hp服务器集成显卡不显示,集成显卡无法显示是什么原因?
  18. Bear Rallies Turn Market Into a Circus
  19. 它山之石,可以攻玉(二)
  20. Windows10连不上网报错代码

热门文章

  1. 【SSM框架系列】Spring - JdbcTemplate声明式事务
  2. 【NOIP2016提高A组模拟9.9】闭门造车
  3. bzoj [Scoi2016]美味
  4. HTML5中常用的标签(及标签的属性和作用)
  5. Scalaz(32)- Free :lift - Monad生产线
  6. c# socket 解决粘包,半包
  7. Spring Security 匿名认证
  8. 关于“IE下无法查看此样式表,因为它的源页面不在同一个域中”的问题
  9. windows版本git的下载地址
  10. IE 9 Preview尝鲜