spring cloud 本地配置研究
发布日期:2021-06-28 19:59:42
浏览次数:2
分类:技术文章
本文共 2801 字,大约阅读时间需要 9 分钟。
已知:spring cloud先加载bootstrap,后加载远程config-server的application。
对于一个服务,需要公共配置:
- 注册中心地址;
- 日志级别
- configServer的server-id,profile,label
另外需要私有配置:
- spring.application.name服务名
- server.port端口名
- 需要在application拉取的配置名。
问题:目前所有服务都需要一个bootstrap.yml,并且不能公用。怎么才能简化本地配置?
解决方案:
- 想办法将bootstrap一分为二,加载一个服务器上共有的配置,并加载一个私有配置(或者直接以环境变量形式写在启动脚本中。)
- 在main方法之前,自己加载这两个配置,并存储到环境变量中。
- 自己加载公共配置文件,私有配置放入环境变量;并将自己加载的配置文件注入springboot
考虑方法1,先看源码。
入口:SpringApplication.run(String... args)
,,,,,,
另一个切入点:ConfigFileApplicationListener.onApplicationEvent
,,,,,,
可以尝试加入 s pring.config.location环境变量来指定加载配置文件。
考虑到执行SpringApplication.run方法之前可能还需要做其他事情。所以这个干脆也放在run方法外面了。采用方法2。
执行方法2时发现一个问题。可能springboot并不会从系统环境变量中读取相应配置,并且将所有服务配置都放到环境变量中,有点污染环境变量的感觉。于是想到方法3
读取源码发现,spring有一个ConfigurableEnvironment,其中有一个propertySources属性,维护了一个配置list。关键在于想办法把配置加载到这个list中
本地配置文件-bootstrap.yml加载时间点为:ConfigFileApplicationListener.onApplicationEvent。在spring触发这个事件的时候会加载相应配置文件。
代码如下。
@Override
public void onApplicationEvent(ApplicationEvent event) {
if (event instanceof ApplicationEnvironmentPreparedEvent) {
onApplicationEnvironmentPreparedEvent(
(ApplicationEnvironmentPreparedEvent) event) ;
}
if (event instanceof ApplicationPreparedEvent) {
onApplicationPreparedEvent(event) ;
}
}
在onApplicationEnvironmentPreparedEvent方法中,调用了 postProcessor.postProcessEnvironment(event.getEnvironment(),
event.getSpringApplication());方法。
两个方案:1. 自己写一个listener,监听 onApplicationEvent。2.实现EnvironmentPostProcessor接口,等着spring调用
使用方案2。
定义:public class CommonConfig implements EnvironmentPostProcessor
初始化配置方法:
private static Properties prop = new Properties() ;
public static void init(String[] args) {
String filePathStr = sysProp.getProperty( sysProp_filePath , defaultConfigFilePath) ;
if (!StringUtils. isEmpty(filePathStr)) {
// 加载配置文件
String[] filePaths = filePathStr.split( ";") ;
for (String filePath : filePaths) {
Properties properties = resolveFileAddProp(filePath , prop) ;
prop.putAll(properties) ;
}
}
}
实现接口方法:
@Override
public void postProcessEnvironment (ConfigurableEnvironment environment , SpringApplication application) {
try {
init ( null ) ;
PropertiesPropertySource propertiesPropertySource = new PropertiesPropertySource( "blogCommon" , prop ) ;
environment.getPropertySources().addLast(propertiesPropertySource) ;
LOG .info( "CommonConfig...postProcessEnvironment end!配置文件加载完毕" ) ;
} catch (Exception e) {
e.printStackTrace() ;
}
}
然后在META-INF/spring.factories中添加:
org.springframework.boot.env.EnvironmentPostProcessor =\
org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor,\
org.springframework.boot.env.SpringApplicationJsonEnvironmentPostProcessor,\
org.springframework.boot.env.SystemEnvironmentPropertySourceEnvironmentPostProcessor,\
com.xs.blog.env.CommonConfig
大功告成。启动之后会出现这一行日志。 “ CommonConfig...postProcessEnvironment end!配置文件加载完毕”
转载地址:https://blog.csdn.net/xxxxssss12/article/details/80967807 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
路过,博主的博客真漂亮。。
[***.116.15.85]2024年04月19日 14时29分46秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
SAP用户增强总结-采购订单建立增加客户数据增强示例
2019-04-28
journal of neuroscience:面孔的神经表征与眼动模式相协调
2019-04-28
The Neuroscientist:运动性脑震荡的长期影响
2019-04-28
机器学习实战学习笔记一
2019-04-28
【vn.py】 策略实盘自动交易
2019-04-28
仿牛客社区项目2.5登录模块———登录退出功能
2019-04-28
LeetCode 190. 颠倒二进制位
2019-04-29
LeetCode 268. 丢失的数字
2019-04-29
LeetCode 231. 2 的幂
2019-04-29
[经典排序算法][集锦]
2019-04-29
无处不在的二分查找
2019-04-29
Java集合框架List,Map,Set等全面介绍
2019-04-29
Java 泛型(二) 泛型之中的通配符(Wildcards)使用
2019-04-29
7-36 复数四则运算 (15 分)
2019-04-29
基于powershell的渗透测试工具nishang
2019-04-29
pycharm创建django项目linux部署
2019-04-29
利用Android Studio快速搭建App
2019-04-29
CompletableFuture的多线程和异步监听实现
2019-04-29
HashMap jdk1.7和1.8概述
2019-04-29