通常服务端应用开发需要经过以下几个流程:

开发 -> 测试 -> 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容器技术,所以非常有意义。

转载于:https://www.cnblogs.com/heishao/p/10008436.html

Spring boot 的profile功能如何实现多环境配置自动切换相关推荐

  1. dubbo yml配置_Spring boot 的profile功能如何实现多环境配置自动切换

    通常服务端应用开发需要经过以下几个流程: 开发 -> 测试 -> RC验证 -> 上线 这就涉及到四个不同的环境,开发环境.测试环境.RC环境以及生产环境,为了避免不同环境之间相互干 ...

  2. Spring Boot实现验证码功能

    ✨Spring Boot实现验证码功能 验证码的作用 案例要求 前端页面准备 随机验证码工具类 后端控制器 测试

  3. Spring Boot:(六)默认日志logback配置解析

    Spring Boot:(六)默认日志logback配置解析 前言 今天来介绍下Spring Boot如何配置日志logback,我刚学习的时候,是带着下面几个问题来查资料的,你呢 如何引入日志? 日 ...

  4. Spring Boot 实践折腾记(四):配置即使用,常用配置

    生活不可能像你想象的那么好,但也不会像你想象的那么糟.我觉得人的脆弱和坚强都超乎自己的想象.有时,可能脆弱得一句话就泪流满面:有时,也发现自己咬着牙走了很长的路.--源自 莫泊桑 开始前- 本章内容主 ...

  5. spring boot / cloud (十七) 快速搭建注册中心和配置中心

    spring boot / cloud (十七) 快速搭建注册中心和配置中心 本文将使用spring cloud的eureka和config server来搭建. 然后搭建的模式,有很多种,本文主要聊 ...

  6. JavaScript + Thymeleaf + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十八)模板脚本

    前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 Spring Boot- ...

  7. Vue + Element UI + Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(十)问题管理页面

    前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 Spring Boot- ...

  8. 【Spring Boot 源码研究 】- 自动化装配条件化配置AutoConfigurationImportFilter剖析

    1. AutoConfigurationImportFilter的作用 1.1 之前讲解了SpringBoot的Conditional的自动化条件配置,我们分析了内部是如何具体实现,在整个实现当中, ...

  9. Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(六)后端改造

    前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 Spring Boot- ...

  10. Spring Boot——易班优课YOOC课群在线测试自动答题解决方案(三)答案查询

    前文 JavaScript--易班优课YOOC课群在线测试自动答题解决方案(一)答案获取 Spring Boot--易班优课YOOC课群在线测试自动答题解决方案(二)答案储存 问题分析 Maven & ...

最新文章

  1. 【Luogu】P1013进制位(搜索)
  2. Linux拜拜!微软给WSL加入GPU支持,Windows终于迎来命令行包管理工具
  3. 0004python中的map,reduce,lambda,filter
  4. RobotFrameWork控制流之if语句——Run Keyword If
  5. 面向对象(静态变量和成员变量的区别)
  6. DNS服务器分离解析 RAID阵列 进程管理 日志管理 systemd作用
  7. HTML+CSS+JavaScript复习笔记持更(九)——CSS3常用属性之盒模型
  8. Spark初识-弹性分布式数据集RDD
  9. 7、JsonCpp简单使用(3)
  10. 用python实现语音的传输功能_用Python+WechatPCAPI实现微信消息防撤回
  11. Redis持久化的原理及优化
  12. bzoj4571/luogu3293 美味 (主席树+贪心)
  13. 通过Callable和FutureTask创建线程
  14. 谷歌浏览器设置暗黑模式
  15. python 绘制正弦余弦函数 matplotlib的基本使用
  16. NCRE——网络工程师——操作系统
  17. Cloud 80% 客制化键盘分享,模块拼色设计
  18. bugku 我永远喜欢穹妹
  19. 学生积分管理系统改进-python
  20. Latex中如何加粗字体 如何打出圆圈序号

热门文章

  1. 基础服务系列-Hyper-V 安装centos7
  2. 揭秘全球最大网站 Facebook 背后应用软件
  3. 【FLUENT案例】04:利用DDPM+DEM模拟鼓泡流化床
  4. 利用存储过程批量生成数据
  5. ROS防止外网DDOS的最有效方法
  6. Windows Debugging之六
  7. HashPasswordForStoringInConfigFile 已过时
  8. SpringMVC 工作流程
  9. 我的Python学习笔记(四):动态添加属性和方法
  10. 十一、JUC包中的锁