文档章节

springboot下配置文件统一加载、管理

ilaotan
 ilaotan
发布于 2017/02/26 09:35
字数 474
阅读 3701
收藏 65

springboot 就不必多说了吧,这货结合dubbo/thrift做微服务棒棒的. 笔者现在做的这个项目就是基于springboot的一堆服务,大约几十个吧. springboot的配置都在application.propertie里,尽管已经约束好了里面的配置,但还有诸多不便性,所以需要一个统一加载机制,来加载公共配置和个性化配置.

springCloud是有这么一套来着.本文就是参考的org.springframework.boot.cloud.CloudFoundryVcapEnvironmentPostProcessor 不过找着这个类也是扒拉了好久源代码.

好了,啰嗦了这么多,开始贴代码了.

public class LoadThirdEnv implements EnvironmentPostProcessor, Ordered {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        //此处可以http方式 到配置服务器拉取一堆公共配置+本项目个性配置的json串,拼到Properties里
        //......省略new Properties的过程
       MutablePropertySources propertySources = environment.getPropertySources();
       //addLast 结合下面的 getOrder() 保证顺序 读者也可以试试其他姿势的加载顺序
        propertySources.addLast(new PropertiesPropertySource("thirdEnv", properties));
    }
    @Override
    public int getOrder() {
        //  +1 保证application.propertie里的内容能覆盖掉本配置文件中默认的
        // 如果不想被覆盖 可以去掉 +1  或者 -1  试试
        return ConfigFileApplicationListener.DEFAULT_ORDER + 1;
    }
}

对,没错,就是这么几行. 还不够,还需要在resources/META-INF/spring.factories里添加

org.springframework.boot.env.EnvironmentPostProcessor=\
 com.ilaotan.LoadThirdEnv

好了,完工. springboot的配置文件参数,可以精简到几个. 其他都从http加载.以后需要改参数,直接配置平台改完,重启这个springboot服务即可.

spring.factories 是springboot的一种加载机制.这里不多赘述.

至于http请求的配置平台,实现得很简单,就是发不同的参数,那边返回json串.

© 著作权归作者所有

共有 人打赏支持
ilaotan

ilaotan

粉丝 10
博文 1
码字总数 474
作品 0
青岛
程序员
私信 提问
加载中

评论(10)

ilaotan
ilaotan

引用来自“TongLau”的评论

我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置

引用来自“ilaotan”的评论

那如果有30个项目,用rpc框架通信,其中有个数据库地址需要换,我需要改30个项目的配置文件吧。 单项目就没必要这么折腾了

引用来自“TongLau”的评论

这是策略问题,spring配置提供了集中配置的方法论,看你怎么使用了。
以上面的例子的意思,公共的配置可以写到dev里,个性配置是mysql或者oracle,但对于30个应用集体换数据库配置的这种需求来说,数据库配置应该放到dev里,因为属于公共配置,那么修改一次即可。
另外,还可以使用占位符,增加灵活性,降低可读性。

引用来自“ilaotan”的评论

我不清楚你说的集中配置什么意思,你所谓的分active,在底层其实就是根据active里的字段,load不同的properties。你说只修改公共配置,那30个项目,我得修改1次X30吧。按实际分布式开发来讲,30个项目,分布在上百台机器上,每个项目都部署了好几份。

引用来自“TongLau”的评论

我并没有说你做的不好,只是善意的在叙述,spring cloud config能满足你的需求。
另外,我举配置例子的那个回复是针对一楼来的,也是针对所谓“能否有更优雅的方式”。
最后,你是否可以看一下spring cloud config参考:
http://cloud.spring.io/spring-cloud-static/spring-cloud-config/1.3.0.M1/
这是一个里程碑版本。
我在http://git.oschina.net/dlpin/microservice-example-config放了一个例子,参考user.yml,你能理解我在说什么。
TongLau
TongLau

引用来自“TongLau”的评论

我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置

引用来自“ilaotan”的评论

那如果有30个项目,用rpc框架通信,其中有个数据库地址需要换,我需要改30个项目的配置文件吧。 单项目就没必要这么折腾了

引用来自“TongLau”的评论

这是策略问题,spring配置提供了集中配置的方法论,看你怎么使用了。
以上面的例子的意思,公共的配置可以写到dev里,个性配置是mysql或者oracle,但对于30个应用集体换数据库配置的这种需求来说,数据库配置应该放到dev里,因为属于公共配置,那么修改一次即可。
另外,还可以使用占位符,增加灵活性,降低可读性。

引用来自“ilaotan”的评论

我不清楚你说的集中配置什么意思,你所谓的分active,在底层其实就是根据active里的字段,load不同的properties。你说只修改公共配置,那30个项目,我得修改1次X30吧。按实际分布式开发来讲,30个项目,分布在上百台机器上,每个项目都部署了好几份。
我并没有说你做的不好,只是善意的在叙述,spring cloud config能满足你的需求。
另外,我举配置例子的那个回复是针对一楼来的,也是针对所谓“能否有更优雅的方式”。
最后,你是否可以看一下spring cloud config参考:
http://cloud.spring.io/spring-cloud-static/spring-cloud-config/1.3.0.M1/
这是一个里程碑版本。
我在http://git.oschina.net/dlpin/microservice-example-config放了一个例子,参考user.yml,你能理解我在说什么。
ilaotan
ilaotan

引用来自“TongLau”的评论

我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置

引用来自“ilaotan”的评论

那如果有30个项目,用rpc框架通信,其中有个数据库地址需要换,我需要改30个项目的配置文件吧。 单项目就没必要这么折腾了

引用来自“TongLau”的评论

这是策略问题,spring配置提供了集中配置的方法论,看你怎么使用了。
以上面的例子的意思,公共的配置可以写到dev里,个性配置是mysql或者oracle,但对于30个应用集体换数据库配置的这种需求来说,数据库配置应该放到dev里,因为属于公共配置,那么修改一次即可。
另外,还可以使用占位符,增加灵活性,降低可读性。
我不清楚你说的集中配置什么意思,你所谓的分active,在底层其实就是根据active里的字段,load不同的properties。你说只修改公共配置,那30个项目,我得修改1次X30吧。按实际分布式开发来讲,30个项目,分布在上百台机器上,每个项目都部署了好几份。
TongLau
TongLau

引用来自“TongLau”的评论

我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置

引用来自“ilaotan”的评论

那如果有30个项目,用rpc框架通信,其中有个数据库地址需要换,我需要改30个项目的配置文件吧。 单项目就没必要这么折腾了
这是策略问题,spring配置提供了集中配置的方法论,看你怎么使用了。
以上面的例子的意思,公共的配置可以写到dev里,个性配置是mysql或者oracle,但对于30个应用集体换数据库配置的这种需求来说,数据库配置应该放到dev里,因为属于公共配置,那么修改一次即可。
另外,还可以使用占位符,增加灵活性,降低可读性。
ilaotan
ilaotan

引用来自“TongLau”的评论

我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置
那如果有30个项目,用rpc框架通信,其中有个数据库地址需要换,我需要改30个项目的配置文件吧。 单项目就没必要这么折腾了
TongLau
TongLau
我觉得这不是spring的问题,或者有其他办法解决,例如微服务有一个统一配置文件,而激活的部分不同
spring:
application:
name: foo
profiles:
active: dev,mysql

如果是开发环境需要oracle配置
spring:
application:
name: foo
profiles:
active: dev,oracle
dev就是所谓公共部分,mysql和oracle就是个性配置
TongLau
TongLau
如果直接使用spring cloud config可能更好,不需要自己实现spring启动加载功能,还可以切换本地和远程配置。
每周精粹
每周精粹
加载配置文件要这么复杂?
kucoll
kucoll
可以用disconf阿
wellyao
wellyao
我使用的Spring Cloud Config。但是确实存在一个问题:公共配置,每个配置文件都会写,比如邮件配置,没必要在每个profile配置文件都配置,只需要配置到公共配置项,你这个方法很好,但是,能否有更优雅的方式,不明白Spring Cloud Config 为啥不出解决方案。
微服务 SpringBoot 2.0(三):启动剖析之@SpringBootApplication

我原以为就一个注解,背后竟然还有3个 —— Java面试必修 引言 前面两章我们先后认识了SpringBoot和它的极简配置,为新手入门的学习降低了门槛,会基本的使用后,接下来我们将进一步认识Spr...

阿郎_
09/24
0
0
Spring Boot入门资料整理

Spring Boot 初识 SpringBoot前世今生 本文主要讲述spring boot的由来,即其它诞生的背景,初衷,现状,及对未来的展望。 Spring Boot参考指南中文版--Chapter1.Spring Boot中文文档 本节提供...

小致dad
2017/11/07
0
0
【SpringBoot专题】快速体验

前言 在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正是因为这些问题,Spring开...

张丰哲
08/05
0
0
iBase4J-Spring boot 1.0版本发布

使用spring boot重新构建iBase4J快速开发平台; 1、统一配置文件管理; 2、不同环境使用不同配置文件; 3、main方法启动快速; 4、motan/dubbo通过配置文件切换,切换方便; https://gitee....

iBase4J
2017/08/15
0
0
007SpringBoot之配置文件加载的优先级以及位置

一、基础 1、定义 之前我们的文件都放到了下,然后SpringBoot项目启动后会自动读取并加载,那么这个文件放在哪呢?只能放到下吗?不是。 2、位置以及优先级 SpringBoot启动后会扫描以下位置的...

编程界的小学生
05/28
0
0

没有更多内容

加载失败,请刷新页面

加载更多

添加并发

<!-- 认购线程池,支持最大并发送10 最大排队队列为一万--> <task:executor id="investBuyPool" pool-size="1-10" queue-capacity="10000"/> 方法添加注解@Async("investBuyPool")......

一夜
13分钟前
1
0
Gensim?

Gensim是一款开源的第三方Python工具包,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。它支持包括TF-IDF,LSA,LDA,和word2vec在内的多种主题模型算法,支持流式训...

火力全開
26分钟前
1
0
图片验证码

图片验证码,线上登录是最常见的场景,也有发送手机验证码之前进行图片验证码的验证。 图片验证码很大程度上防止机器人撞库登录或频繁发起短信验证码从而使系统暂时性"瘫痪"。 以下是项目中用...

貔貅叔
30分钟前
3
0
科班出身程序员和培训出来的程序员区别在哪?

科班出身只是代表你要从事的职业和你的专业是一致的,代表着你具备了得天独厚的优势,至于是不是优势看你上班好不好学,平时逃课没,上班是认真听还是玩手机。一般而言科班出来的理论性比较强...

java菜分享
30分钟前
1
0
java框架学习日志-8(AOP简介)

小王被委托开发一款游戏,程序分为启动页面,登陆页面,战斗页面等。小王就采用了面向对象编程思想(OOP),把整个程序分解成下图 这种就是传统的自上而下的编程,或者说纵向的编程,负责启动...

白话
30分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部