文档章节

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

ilaotan
 ilaotan
发布于 2017/02/26 09:35
字数 474
阅读 3147
收藏 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 为啥不出解决方案。
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
springboot + shiro 权限注解、请求乱码解决、统一异常处理

springboot + shiro 权限注解、请求乱码解决、统一异常处理 前篇 后台权限管理系统 相关: spring boot + mybatis + layui + shiro后台权限管理系统 springboot + shiro之登录人数限制、登录...

wyait
06/06
0
0
SpringBoot_总结_01_配置详解

一、入口类和@SpringBootApplication SpringBoot项目通常有一个名为*Application的入口类,入口方法为此类的main方法。 1. @SpringBootApplication @SpringBootApplication注解是一个组合注解...

shirayner
07/24
0
0
SpringBoot-Plus 1.1.4 发布,后台管理系统

SpringBoot-Plus 1.1.4 发布了,改进内容包括: #IKPAY 使用springboot最新版本2.0.3 #IKP57 非admin用户查询的时候数据权限问题 #IKNRN 改成多数据源错误修复 #IKM9B 生成代码--功能点生成:...

闲大赋
06/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Linux环境搭建 | VMware下共享文件夹的实现

在进行程序开发的过程中,我们经常要在主机与虚拟机之间传递文件,比如说,源代码位于虚拟机,而在主机下阅读或修改源代码,这里就需要使用到 「共享文件」 这个机制了。本文介绍了两种共享文...

良许Linux
56分钟前
4
0
JUC锁框架——AQS源码分析

JUC锁介绍 Java的并发框架JUC(java.util.concurrent)中锁是最重要的一个工具。因为锁,才能实现正确的并发访问。而AbstractQueuedSynchronizer(AQS)是一个用来构建锁和同步器的框架,使用A...

长头发-dawn
今天
1
0
docker中安装了RabbitMQ后无法访问其Web管理页面

在官网找了"$ docker run -d --hostname my-rabbit --name some-rabbit -p 8080:15672 rabbitmq:3-management"这条安装命令,在docker上安装了RabbitMQ,,结果输入http://localhost:8080并不......

钟然千落
今天
4
1
spring-cloud | 分布式session共享

写在前面的话 各位小伙伴,你们有福了,这一节不仅教大家怎么实现分布式session的问题,还用kotlin开发,喜欢kotlin的小伙伴是不是很开心! 以前在写Android的时候,就对客户端请求有一定的认...

冯文议
今天
3
0
c语言之内存分配笔记

先看一个数组: short array[5] = {1,2} // 这儿定义的一个int类型的数组,数组第1和第2个元素值是1和2.其余后面默认会给值为0; 或者 short array[] = {1,2};//这儿数组第1和第2个元素,数组...

DannyCoder
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部