配置中心框架IConfCenter
本篇和大家分享的是一个简易配置中心框架IConfCenter,框架是利用空余时间写的,主要以配置文件+redis存储方式作为数据同步驱动,目前支持的配置文件格式有 .properties 和 .config,后期有时间可能增加 .xml 和 .yml文件的识别。
框架结构简单分为:
- confserver - 服务端
confAdmin - 配置中心后台管理
confCenter - 配置中心
- confclient - 客户端
每分钟获取配置
订阅配置中心刷新配置
发一张配置中心应用到项目中的手工设计图:
confAdmin - 配置中心后台管理
后台管理主要就是一个简单的操作界面,采用springboot+thymeleaf+jquery搭建,目前主要有两个功能:展示配置文件列表和启用某个配置
展示配置文件列表:其实就是读取本地磁盘目录中的配置文件信息,主要的service代码如下:
- /**
- * 配置文件列表
- *
- * @return
- */
- public List<File> getListConf() {
- File baseFile = new File(confCenterConf.confserver_confs_basepath);
- File[] files = baseFile.listFiles();
- List<File> list = Arrays.asList(files).
- stream().
- sorted(Comparator.comparing(File::lastModified).reversed()).
- collect(Collectors.toList());
- return list;
- }
启用某个配置:主要通过界面按钮触发ajax提交一个启动post请求,后端通过解析指定配置文件内容为Map结构,并永久存储于Redis缓存中(直到下一次配置内容更新),最后通过Redis的发布功能通知给订阅该配置的客户端,让客户端通过api重新获取并更新本地配置。主要的Service代码如下:
- /**
- * 启用某个配置+通知消费端(订阅channel规则:confs_配置文件名)
- *
- * @param confPath
- * @return
- */
- public MoRp qyConf(String confPath) {
- MoRp rp = new MoRp();
- rp.setStatus(EnumHelper.EmRpStatus.失败.getVal());
- try {
- //读取配置文件
- Map<String, Object> map = LoadConf.readConfToMap(confPath);
- if (map.isEmpty()) {
- rp.setMessage("加载配置文件失败,稍后重试");
- return rp;
- }
- //文件名称
- String filePathToName = LoadConf.getFilePathToName(confPath, true);
- //缓存key
- String cacheKey = String.format("confs_%s", filePathToName);
- //2018.09.13 临时增加配置文件修改时间
- File file = new File(confPath);
- MoGetConfRp confRp = new MoGetConfRp();
- confRp.setConfLastModified(file.lastModified());
- confRp.setConfs(map);
- confRp.setConfVersion(filePathToName);
- confRp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
- //存储到缓存中 永久
- if (jedisTool.set(cacheKey, confRp, )) {
- //发布消息,通知客户端更新配置
- jedisTool.publish(cacheKey, confRp.getConfVersion());
- rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
- rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
- }
- } catch (IOException e) {
- e.printStackTrace();
- }
- return rp;
- }
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;
- }
- //缓存key
- String cacheKey = String.format("confs_%s", rq.getConfVersion());
- //获取缓存中是否存在
- rp = jedisTool.get(cacheKey, MoGetConfRp.class);
- if (rp.getStatus() == EnumHelper.EmRpStatus.成功.getVal() &&
- rp.getConfs().size() >= ) {
- rp.setStatus(EnumHelper.EmRpStatus.成功.getVal());
- rp.setMessage(EnumHelper.EmRpStatus.成功.toString());
- return rp;
- }
- } catch (Exception e) {
- e.printStackTrace();
- }
- return rp;
- }
confclient - 客户端
主要干了两个事情:每分钟获取配置和订阅配置中心刷新配置。该客户端项目各位可以打包成jar引入项目中,加上相关配置即可引入配置中心客户端
每分钟获取配置
为了配置内容的一致性,这里采用了Scheduled每隔一分钟请求一下配置中心api,然后通过版本号对比是否有更新,如果对比有新版本那么即可更新缓存于本地的配置信息。主要代码如:
- /**
- * 每分钟获取配置,版本号不一致更新本地缓存
- *
- */
- @Scheduled(initialDelay = * ,fixedDelay = * )
- public void refreshConf() {
- System.out.println(new Date() + ":当前配置版本" +
- confCenterConf.confserver_confs_currentConfVersion);
- if (confCenterConf.confserver_confs_currentConfVersion.isEmpty()) {
- System.out.println("版本为空,无法自动拉取配置");
- return;
- }
- updateConf(confCenterConf.confserver_confs_currentConfVersion);
- }
- /**
- * 更新本地配置
- * @param strVersion
- */
- private void updateConf(String strVersion) {
- //获取配置中心配置
- MoGetConfRp rp = confCenterClientService.getConfCenterConf(strVersion);
- if (rp.getStatus() != EnumHelper.EmRpStatus.成功.getVal()) {
- return;
- }else if(rp.getConfLastModified() == confCenterClientService.getConfLastModified()){
- return;
- }
- System.out.println(new Date() + ":更新本地配置");
- //版本不一致,更新本地缓存
- confCenterClientService.setConf(rp);
- }
订阅配置中心刷新配置
通过实现CommandLineRunner接口的run方法,在项目启动时通过Redis订阅配置中心消息,达到配置中心主动通知更新配置的目的。主要代码:
- /**
- * 程序启动执行服务 订阅配置中心刷新配置通道
- *
- * @param strings
- * @throws Exception
- */
- @Override
- public void run(String... strings) throws Exception {
- //订阅配置中心刷新配置通道
- jedisTool.subscribe(
- "confs_" + confCenterConf.confserver_confs_currentConfVersion,
- b -> {
- System.out.println(new Date() + ":收到配置中心刷新配置通知,版本-" + b);
- updateConf(b.toString());
- });
- }
在文章结尾时,发一张配置中心后台管理界面图,并希望各位能够喜欢配置中心框架IConfCenter
配置中心框架IConfCenter的更多相关文章
- 玩转Spring Cloud之配置中心(config server &config client)
本文内容导航: 一.搭建配置服务中心(config server) 1.1.git方式 1.2.svn方式 1.3.本地文件方式 1.4.解决配置中包含中文内容返回乱码问题 二.搭建配置消费客户端( ...
- 分布式配置中心 携程(apollo)
1.传统配置文件与分布式配置文件区别 传统配置文件:如果修改了配置文件,需要重新打包发布,重新发布服务,而且每个环境的变更配置文件,比较繁琐. 分布式配置文件:将配置文件注册到配置中心上去,可以使用分 ...
- SrpingCloud 之SrpingCloud config分布式配置中心
Config架构 当一个系统中的配置文件发生改变的时候,我们需要重新启动该服务,才能使得新的配置文件生效,spring cloud config可以实现微服务中的所有系统的配置文件的统一管理,而且还可 ...
- 【Distributed】分布式配置中心
一.概述 1.1 什么是分布式配置中心 常用分布式配置中心框架 二.Apollo阿波罗 2.1 Apollo特点 2.2 Apollo整体架构原理 2.3 Apollo Portol 环境搭建 Lin ...
- 分布式配置中心Apollo
1,什么是分布式配置中心 项目中配置文件比较繁杂,而且不同环境的不同配置修改相对频繁,每次发布都需要对应修改配置,如果配置出现错误,需要重新打包发布,时间成本较高,因此需要做统一的分布式注册中心,能做 ...
- Apollo配置中心的实战
31.携程 Apollo 配置中心介绍~1.mp4 32.Apollo核心概念~1.mp4 32.Apollo核心概念~1.mp4 每个应用需要有一个唯一的AppID 要在指定的机器上的server. ...
- .Net Core with 微服务 - Consul 配置中心
上一次我们介绍了Elastic APM组件.这一次我们继续介绍微服务相关组件配置中心的使用方法.本来打算介绍下携程开源的重型配置中心框架 apollo 但是体系实在是太过于庞大,还是让我爱不起来.因为 ...
- go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])
目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...
- java框架之SpringCloud(7)-Config分布式配置中心
前言 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中标会出现大量的服务.由于每个服务都需要必要的配置信息才能运行,所以一套集中式的.动 ...
随机推荐
- Android 进阶 教你打造 Android 中的 IOC 框架 【ViewInject】 (上)
转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39269193,本文出自:[张鸿洋的博客] 1.概述 首先我们来吹吹牛,什么叫Io ...
- vue简介
vue的介绍 vue官网说:Vue.js(读音 /vjuː/,类似于 view) 是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计. vue的优点 1.易用 ...
- Python中使用MongoEngine3
最近重新拾起Django,但是Django并不支持mongodb,但是有一个模块mongoengine可以实现Django Model类似的封装.但是mongoengine的中文文档几乎没有,有的也是 ...
- 【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,求 ...
- 约会 倍增lca
题意:一棵树,给两个点,求树上有多少点到他俩距离相等 倍增lca,分好多情况讨论.. #include<cstdio> #include<cstring> #include&l ...
- bzoj 1098 poi2007 办公楼 bfs+链表
题意很好理解,求给出图反图的联通块个数. 考虑这样一个事情:一个联通块里的点,最多只会被遍历一次,再遍历时没有任何意义 所以用链表来存,每遍历到一个点就将该点删掉 #include<cstdio ...
- laravel 5.4中手动创建分页
这里是参考的的链接https://blog.csdn.net/hxx_yang/article/details/51753134 use Illuminate\Pagination\LengthAwa ...
- 磁盘IOPS计算与测量
IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),是衡量磁盘性能的主要指标之一.IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的I/O请求 ...
- sql中1=1的and和or问题
SELECT * FROM mentor_teacher WHERE 1 = 1 AND status = ? limit 0, 10 sql语句中如果有1=1的问题, 那么,如果是and并且的关 ...
- TensorFlow之RNN:堆叠RNN、LSTM、GRU及双向LSTM
RNN(Recurrent Neural Networks,循环神经网络)是一种具有短期记忆能力的神经网络模型,可以处理任意长度的序列,在自然语言处理中的应用非常广泛,比如机器翻译.文本生成.问答系统 ...