文档章节

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

ilaotan
 ilaotan
发布于 2017/02/26 09:35
字数 474
阅读 2531
收藏 65
点赞 2
评论 10

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 + shiro 权限注解、请求乱码解决、统一异常处理

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

wyait ⋅ 06/06 ⋅ 0

Spring Boot干货系列: (三)启动原理解析

     前言   前面几章我们见识了SpringBoot为我们做的自动配置,确实方便快捷,但是对于新手来说,如果不大懂SpringBoot内部启动原理,以后难免会吃亏。所以这次博主就跟你们一起一步步...

后端编程嘟 ⋅ 2017/03/13 ⋅ 0

(一)SpringBoot——helloworld

一、为什么会诞生SpringBoot? 先看看spring的优势: 1、代码解耦、简化开发:代码中不再需要new去构造对象,而是交由spring去管理对象。 2、支持AOP:面向切面的编程,方便进行权限拦截、日...

solidwang ⋅ 04/17 ⋅ 0

学习 Spring Boot 知识看这一篇就够了

从2016年因为工作原因开始研究 Spring Boot ,先后写了很多关于 Spring Boot 的文章,发表在技术社区、我的博客和我的公号内。粗略的统计了一下总共的文章加起来大概有六十多篇了,其中一部分...

ityouknow ⋅ 05/28 ⋅ 0

springboot开发简单的web应用前篇

你已经会spring了,也非常熟悉springmvc的开发,平时你搭建个web应用简单吗?好像也不难!那么今天我来试试用springboot来开发个简单的web应用来试试。 在正式讲解springboot开发web应用之前...

GeCoder ⋅ 05/04 ⋅ 0

Spring Cloud Config环境库

您要在哪里存储配置服务器的配置数据?管理此行为的策略是,服务于对象。此是Spring (包括作为主要功能)的域的浅层副本。资源由三个变量参数化: 映射到客户端的“spring.application.name...

itcloud ⋅ 06/06 ⋅ 0

恒宇少年/spring-boot-chapter

简书整套文档以及源码解析 专题 专题名称 专题描述 001 Spring Boot 核心技术 讲解SpringBoot一些企业级层面的核心组件 002 Spring Cloud 核心技术 对Spring Cloud核心技术全面讲解 003 Quer...

恒宇少年 ⋅ 04/19 ⋅ 0

第一章:Maven环境下如何配置QueryDSL环境

QueryDSL是一个通用的查询框架,框架的核心原则是创建安全类型的查询,开始QueryDSL仅支持Hibernate(HQL),在不断开源人士加入QueryDSL团队后,陆续发布了针对JPA,JDO,JDBC,Lucene,Hib...

恒宇少年 ⋅ 2017/07/01 ⋅ 0

SpringBoot 2.0 系列006 --启动实战之注解使用

SpringBoot 2.0 系列006 --启动实战之注解使用 一些误区说明 网上很多教程默认使用SpringBootApplcation注解,且只用这个即可扫描启动类包下所有的bean。 而官方默认教程使用的是@EnableAuto...

路上有你0314 ⋅ 05/18 ⋅ 0

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念

SpringBoot 2.0 系列001 -- 入门介绍以及相关概念 什么是SpringBoot? 项目地址:http://projects.spring.io/spring-boot/ SpringBoot介绍 Spring Boot使开发独立的,产品级别的基于Spring的...

路上有你0314 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内核线程、轻量级进程、用户线程

线程与进程概念 在现代操作系统中,进程支持多线程。 进程是资源管理的最小单元; 线程是程序执行的最小单元。 即线程作为调度和分配的基本单位,进程作为资源分配的基本单位 一个进程的组成...

117 ⋅ 13分钟前 ⋅ 0

elasticsearch2.4.6升级为elasticsearch-5.5.0的经历

将elasticsearch-5.5.0 中的配置 path.data 指向原来的数据路径 即 path.data: /usr/local/src/elasticsearch-2.4.6/data 注意: elasticsearch-5.5.0 需要将jdk版本升级到1.8...

晨猫 ⋅ 14分钟前 ⋅ 1

lvm讲解 磁盘故障小案例

1

oschina130111 ⋅ 18分钟前 ⋅ 0

那些提升开发人员工作效率的在线工具

本文转载自公众号 Hollis 作为一个Java开发人员,经常要和各种各样的工具打交道,除了我们常用的IDE工具以外,其实还有很多工具是我们在日常开发及学习过程中要经常使用到的。 Hollis偏爱使用...

时刻在奔跑 ⋅ 30分钟前 ⋅ 0

restful风格 实现DELETE PUT请求 的web.xml的配置

import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframe......

泉天下 ⋅ 35分钟前 ⋅ 0

Shell数组

Shell数组 Shell在编程方面比Windows批处理强大很多,无论是在循环、运算。 bash支持一维数组(不支持多维数组),并且没有限定数组的大小。类似与C语言,数组元素的下标由0开始编号。获取数...

蜗牛奔跑 ⋅ 45分钟前 ⋅ 0

nmap为了开发方便 可以做简单的修改

因为nmap扫描是默认使用的是nse脚本,但是在开发的过程中需要修改后缀(主要是因为后缀为lua才能显示高亮,所以这里用一个取巧的办法) nse_main.lua文件中我们找到如下代码 local t, path = cn...

超级大黑猫 ⋅ 49分钟前 ⋅ 0

springmvc获取axios数据为null情况

场景:前端用了vue没有用ajax与后台通信,用了axios,但是在代码运行过程中发现axios传递到后台的值接受到数据为null。 问题原因:此处的问题在与axios返回给后台的数据为json类型的,后台接...

王子城 ⋅ 51分钟前 ⋅ 0

hadoop技术入门学习之发行版选择

经常会看到这样的问题:零基础学习hadoop难不难?有的人回答说:零基础学习hadoop,没有想象的那么难,也没有想象的那么容易。看到这样的答案不免觉得有些尴尬,这个问题算是白问了,因为这个...

左手的倒影 ⋅ 51分钟前 ⋅ 0

806. Number of Lines To Write String - LeetCode

Question 806. Number of Lines To Write String Solution 思路:注意一点,如果a长度为4,当前行已经用了98个单元,要另起一行。 Java实现: public int[] numberOfLines(int[] widths, Str...

yysue ⋅ 58分钟前 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部