本篇和大家分享的是一个简易配置中心框架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的更多相关文章

  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. SVN学习之windows下svn的安装

    svn是apache的一个开源项目,全称为subversion.是一个基于版本的项目管理软件,一般在多人开发的项目中使用,目前svn已经替代了原来的cvs.大多数情况下,svn服务安装在linux服务 ...

  2. VMware12安装虚拟机教程、Ubuntu16.04安装教程(包括vmware tools的安装)

    转自https://jingyan.baidu.com/article/c275f6ba07e269e33d756714.html 方法/步骤 1 虚拟机.Linux操作系统介绍及下载地址 虚拟机VM ...

  3. Java中能否利用函数参数来返回值

    转自https://blog.csdn.net/da_da_xiong/article/details/70039532 我们在写代码时通常会遇到一种情况,就是我们可能希望在一个函数操作完成后返回两个 ...

  4. c# 如何找到项目中图片的相对路径

    c# 如何找到项目中图片的相对路径 string path = System.Environment.CurrentDirectory;//非Web程序if (System.Environment.C ...

  5. 在本地没有安装Oracle的情况下,使用plsql远程连接数据库

    远程连接数据库的方式不止一种.这里主要写在本地没有安装Oracle的情况下,使用plsql可视化工具远程连接数据库的方式. 一.前提 首先你本地得安装有plsql工具.具体的安装步骤就不多说了. 二. ...

  6. client_v2.go

        }     return false }

  7. go语言 nsq源码解读四 nsqlookupd源码options.go、context.go和wait_group_wrapper.go

    本节会解读nsqlookupd.go文件中涉及到的其中三个文件:options.go.context.go和wait_group_wrapper.go. options.go 123456789101 ...

  8. Goroutine陷阱

    Go在语言层面通过Goroutine与channel来支持并发编程,使并发编程看似变得异常简单,但通过最近一段时间的编码,越来越觉得简单的东西,很容易会被滥用.Java的标准库也让多线程编程变得简单, ...

  9. BZOJ 1260:[CQOI2007]涂色paint

    (⊙o⊙)-,常规课考试又炸了!目测此次我要完蛋了... 又玩脱了,考数学的时候装B装大了! 算了,先进入正题... 题目描述:Description假设你有一条长度为5的木版,初始时没有涂过任何颜色 ...

  10. 支付宝使用流程和踩坑小记(附Demo)

    # 支付宝使用整理 html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym, ...