Spring boot 的profile功能如何实现多环境配置自动切换
通常服务端应用开发需要经过以下几个流程:
开发 -> 测试 -> RC验证 -> 上线
这就涉及到四个不同的环境,开发环境、测试环境、RC环境以及生产环境,为了避免不同环境之间相互干扰,通常需要独立部署数据库、缓存服务器等,那么应用配置也要做相应的调整。
为了解决不同环境配置切换问题,很多人的做法是:把配置文件根据不同的环境,放到不同的目录或文件中,打包时通过gradle或maven,通过命令行参数指定要打哪个环境的包。这样就可以针对不同的环境生成不同的包。但这样的做法有以下几个问题:
- gradle或maven打包脚本文件需要重复编写“选择文件”打包的逻辑,增加很多重复劳动的成功;
- 在jenkins等集成环境中,需要针对每个应用,不同的环境做相应的设置;
- 需要管理不同环境的包,带来的成本;部署时,需要注意包与运行环境是否一致;
- 如果运行在docker中时,因为包不同所以要针对不同的环境,构建相应的镜像。
这时也许有人会说,把配置都从包里剥离出来,放到配置中心就可以了,但是不同环境对应的配置中心地址也是不一样的。
Spring中的Profile 是什么?
Spring中的Profile功能其实早在Spring 3.1的版本就已经出来,它可以理解为我们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring容器中。
举个更具体的例子,我们以前所定义的Bean,当Spring容器一启动的时候,就会一股脑的全部加载这些信息完成对Bean的创建;而使用了Profile之后,它会将Bean的定义进行更细粒度的划分,将这些定义的Bean划分为几个不同的组,当Spring容器加载配置信息的时候,首先查找激活的Profile,然后只会去加载被激活的组中所定义的Bean信息,而不被激活的Profile中所定义的Bean定义信息是不会加载用于创建Bean的。
为了使用不同的环境,我们首先对不同的环境,定义相应的profile名称。
比如,开发环境的profile为:dev;测试环境的profile为:test;RC环境的profile为:rc;生产环境的profile为:prod。
下面举个dubbo不同环境下,使用不同配置的方法:

上面例子中,当激活相应的profile时,相应的配置文件才会导入。
比如:profile为dev时,导入dubbo-dev.properties。
注意:所有spring xml schema的版本必须是4.0以上,比如:http://www.springframework.org/schema/util/spring-util-4.3.xsd。spring 默认profile为default, 在没有指定profile的,会被默认为default。
如果我们使用配置中心的话,上面的配置还可以更简单。等配置中心投产后我们再讨论。
Spring boot中使用profile切换配置
Spring boot中默认加载的配置文件是:application.properties或application.yml。当激活profile后(后面我们讨论如何激活profile),可以通过profile自动选择加载的application-{profile}.properties或application-{profile}.yml格式的配置文件。
比如:profile为dev时,会加载application.properties或application.yml外,还会加载application-dev.properties或application-dev.yml配置。
另外如果引入Spring cloud 时,也会加载启动配置bootstrap.properties或bootstrap.yml以及bootstrap-{profile}.properties 或 bootstrap-{profile}.yml。
所以把各个环境公共的配置写在application.properties或application.yml中。把不同环境的配置写在application-{profile}.properties或application-{profile}.yml中。
@Profile注解的使用
使用java进行配置时,可以通过@Profile注解,实现不同环境使用配置策略。比如swagger现在使用很普遍了,但是它存在一定的安全问题,如果生产环境中也暴露swagger的话,风险还是比较大的,建议只在开发环境和测试环境启用,配置例子如下:

将上面的代码保存到logback-spring.xml文件中,而不是logback.xml中。
logback中profile的使用
在开发环境或测试环境中,为了方便排查问题,我们会使用DEBUG甚至TRACE级别的日志,而在生产环境中,避免日志增长过快,尽量只是输出ERROR级别的日志。这就需要日志配置也要能根据不同的环境,使用不同的配置策略。
spring boot中的logback就可以满足这样的需求,例子如下:

将上面的代码保存到logback-spring.xml文件中,而不是logback.xml中。
Spring boot 激活 profile的几种方式
在配置文件中直接指定
spring.profiles.active=test
这种方式非常不灵活,在实际开发部不太会使用到
使用占位符
在打包时替换,以mavne为例:
首先在配置文件中增加:
spring.profiles.active=@package.target@
在pom.xml中增加不同环境打包的配置:

执行打包命令:
mvn package -Ptest
缺点:每次打包都要指定profile
JVM参数方式
java命令行指定:
java -jar app.jar --spring.profiles.active=dev
tomcat 中 catalina.bat(.sh中不用“set”) 添加JAVA_OPS。通过设置active选择不同配置文件:
set JAVA_OPTS="-Dspring.profiles.active=test"
eclipse 中启动tomcat。项目右键 run as –> run configuration–>Arguments–> VM arguments中添加。
-Dspring.profiles.active="dev"
在微服务的时代,会不会觉得有点麻烦呢?
web.xml方式
spring.profiles.active
prod
标注方式(junit单元测试非常实用)
@ActiveProfiles({"dev"})
ENV方式(建议使用此方式)
设置系统环境变量:SPRING_PROFILES_ACTIVE(注意:是大写)
比如mac开发环境中设置环境变量的方法:
vi ~/.bash_profile
在~/.bash_profile中增加如下内容:
export SPRING_PROFILES_ACTIVE=dev
注意: mac eclipse中是获取不到环境变量的解决办法,参考这文章进行处理,http://blog.csdn.net/zhzdeng/article/details/64921967
总结
上面关于profile的东西,基本能满足工作的需要了。使用profile后,可以减化因不同环境配置差异,而带来的配置管理以及打包工作。
尽量使用环境变量来激活profile,如果是可执行的包,也可以使用java命令行指定,其它方式不建议使用。
使用profile后,使得应用能更容易接入配置中心,以及使用docker容器技术,所以非常有意义。
Spring boot 的profile功能如何实现多环境配置自动切换的更多相关文章
- Spring Boot 之 Profile --快速搞定多环境使用与切换
Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...
- [Spring Boot 系列] 集成maven和Spring boot的profile功能
由于项目的需要, 今天给spirng boot项目添加了profile功能.再网上搜索了一圈,也没有找到满意的参考资料,其实配置并不难,就是没有一个one stop(一站式)讲解的地方,所以有了写这篇 ...
- 004-集成maven和Spring boot的profile功能打包
参考地址:https://blog.csdn.net/lihe2008125/article/details/50443491 一.主要目标 1.通过mvn在命令行中打包时,可以指定相应的profil ...
- Spring Boot之Profile--快速搞定多环境使用与切换
Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...
- 集成maven和Spring boot的profile功能
思路:maven支持profile功能,当使用maven profile打包时,可以打包指定目录和指定文件,且可以修改文件中的变量.spring boot也支持profile功能,只要在applica ...
- 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换
软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...
- spring boot入门笔记(四) - 多环境配置、加载顺序、静态资源映射
1.多环境配置 先描述下以前的开发流程:从SVN把项目下载到本地,各种修改配置文件,启动成功:完成功能后上传到公司的测试服务器,修改各种配置文件,启动成功:最后到上线的日子里,把新功能中涉及到的文件打 ...
- 【Spring Boot学习之七】自定义参数&多环境配置&修改端口号&yml
环境 eclipse 4.7 jdk 1.8 Spring Boot 1.5.2 一.自定义参数通过注解直接获取配置文件application.properties中配置key的value1.appl ...
- 集成maven和Spring boot的profile 专题
maven中配置profile节点: <project> .... <profiles> <profile> <!-- 生产环境 --> <id& ...
随机推荐
- Editplus编辑器在php文件中变色显示设置
咋editplus中我们编辑时有时会遇到不变色的问题,那么怎么设置呢,从语法配置就好,如下:
- mongodb使用实践---mongodb+mongo-java-driver+morphia
package com.lolaage.dals.dbfactory.mongodb; import java.net.UnknownHostException; import java.util.A ...
- webservice使用windows身份验证,ajax请求报错401未授权的解决办法
$.ajax({ type: "GET", url: service_url, dataType: "xml", data: "ParamId=&qu ...
- div,css&table布局有哪些区别
DIV+CSS布局与TABLE布局相比,有哪些优点? 1.代码少,页面文件小,下载快 Div+css的布局现在属于国际W3C标准,table不是. 都知道用div的布局代码肯定少,所有的样式都在CSS ...
- create-react-app找不到配置项
npm run eject 这个一个不可逆过程,一旦你执行了,就不能回到初始化
- IntelliJ IDEA开发工具println报错的解决方法
IntelliJ IDEA 编译 JSP,出现 out.println 报错,下图所示: 报错原因:println报红,这是因为没有关联好服务器! 解决方案:点击File->Project st ...
- 19_ThreadLocal
[概述] 线程局部变量,是一种多线程间并发访问变量的解决方案.与synchronized等加锁的方式不同,ThreadLocal完全不提供锁,而使用以空间换时间的手段,为每个线程提供变量的独立副本,以 ...
- C/C++ OpenCV读取视频与调用摄像头
原文:http://blog.csdn.net/qq78442761/article/details/54173104 OpenCV通过VideoCapture类,来对视频进行读取,调用摄像头 读取视 ...
- Logistic Regression 之错误翻译
根据周志华老师的讲法,这里 logistic 是对数几率的意思,所以正确的翻译方法应该叫 对数几率回归, 所以不要以为这个东西叫 逻辑回归,逻辑回归是错误的翻译.
- delphi 获取可执行文件的当前路径
在Delphi SysUtils 单元中有 ExtractFileDir 与 ExtractFilePath两个类似的函数, 两个函数有以下的区别: ExtractFilePath 传回值的最後一个字 ...