简易版配置中心&原理窥探
本地配置的情况
一般情况下,在开始一个新的项目的时候,可能我们多半会把配置信息写在工程目录下,使用不同的文件来配置不同环境下的配置。比如:

然后在spring的配置文件会出现类似这样的配置:

这样的处理有一个弊端,那就是一些系统的敏感信息也会写入在配置文件中,比如我们公司之前的配置:

上面的诸如 alipayAppPrivateKey alipayAliPublicKey 这些敏感信息从安全角度不应该出现在配置文件中的,要知道有了这些信息是可以通过api进行转账操作的。于是如果有一个配置中心,我们只需要把配置信息放到配置中心里就可以解决这个问题了。
现在工业上有很多开源的配置中心,比如Apollo 、Spring Cloud Config等等,但由于本人所在公司资源精力有限,决定自己做一个简易版的配置服务。通过这个简易版的配置服务,我们也能窥探现在成熟的功能更加完善的配置中心是怎样的一个原理。
整体设计

业务服务器在启动的时候(其实不一定,这里为了简化只在启动的时候拉取)向配置服务器拉取配置信息,然后进行初始化等一系列操作。
交互的方式就是很普通的http接口(也可以设计为tcp等通信方式),具体设计如下:
请求参数
- appName :应用的名字
- mode :拉取什么环境的配置,比如local test prod
- appConfigSecret :盐 ,主要为了安全性,可以周期性的更换这个
返回值: 这里返回值设置为string, string的格式为了方便看和兼容之前的配置,采用了properties文件的方式。业务服务器拉取配置后,进行对应格式的解析。
配置服务器
配置信息的存储为了简单,也采用了mysql进行存储。这里就剔除了配置信息回滚的功能,只完成核心功能。 表结构如下:

app_name + app_mode + app_config_secret 三个信息组合成一个联合唯一索引(字段长度也许不合理哈,这里就没有深究这个了),通过这三个信息来查询 app_config 字段的信息。app_config 字段的格式就是properties形式的字符串。
通过这三个字段读取配置信息的这个http接口就不用赘述了是吧(这个接口根据自身需要可以添加其他的一些安全策略)
写好接口后,发布到内网或者公网作为一个独立的服务即可。
业务服务器
在这块我们的核心问题就是写代码去请求配置服务,拉取配置信息。
这里有个关键类:PropertyPlaceholderConfigurer ,我们只需要继承这个类,重写下 processProperties 或者其他方法即可。我这里就处理得很简单了,代码如下:


代码中可以看到,我这里还是对项目中的配置文件保留了一个基本的配置,也就是配置文件还是有,但只保留必要的几个配置,如下

前面三个参数时配置服务需要的,第四个参数是指定配置服务器的host地址
剩下是日志相关的配置。
代码有了,下面就是更改spirng的配置: 把之前所有用到
<util:properties id="config" location="classpath:config.properties"/>
的地方都替换为:

然后还需改一个地方,那就是把引用配置的地方改为形式(#和的区别,这里也不赘述了),如下图:

改为:
万事俱备只欠东风
往配置服务的数据表里添加对应的配置信息,搞定。
感兴趣的朋友可以加微信群。
系统推荐
- Cordova+Umi项目搭建步骤
- JVM参数设置
- 数据同步方案
- MAC CMS
- 搭建基于docker的elk平台来分析java日志
- 行转列不再复杂:SQL高手都在用的技巧揭秘
- CountDownLatch源码解读
- 分布式事务Seata
- Java面试基础
- Nginx的双向认证配置
- BBR加速
- Hbase 总览
- 随机毒鸡汤:觉得你暗恋的人也在暗恋你,你知道这叫什么吗?这叫想象力。