一般服务端应用开发须要通过如下几个流程:java
开发 -> 测试 -> RC验证 -> 上线web
这就涉及到四个不一样的环境,开发环境、测试环境、RC环境以及生产环境,为了不不一样环境之间相互干扰,一般须要独立部署数据库、缓存服务器等,那么应用配置也要作相应的调整。spring
为了解决不一样环境配置切换问题,不少人的作法是:把配置文件根据不一样的环境,放到不一样的目录或文件中,打包时经过gradle或maven,经过命令行参数指定要打哪一个环境的包。这样就能够针对不一样的环境生成不一样的包。但这样的作法有如下几个问题:docker
Spring中的Profile功能其实早在Spring 3.1的版本就已经出来,它能够理解为咱们在Spring容器中所定义的Bean的逻辑组名称,只有当这些Profile被激活的时候,才会将Profile中所对应的Bean注册到Spring容器中。数据库
举个更具体的例子,咱们之前所定义的Bean,当Spring容器一启动的时候,就会一股脑的所有加载这些信息完成对Bean的建立;而使用了Profile以后,它会将Bean的定义进行更细粒度的划分,将这些定义的Bean划分为几个不一样的组,当Spring容器加载配置信息的时候,首先查找激活的Profile,而后只会去加载被激活的组中所定义的Bean信息,而不被激活的Profile中所定义的Bean定义信息是不会加载用于建立Bean的。bootstrap
为了使用不一样的环境,咱们首先对不一样的环境,定义相应的profile名称。缓存
好比,开发环境的profile为:dev;测试环境的profile为:test;RC环境的profile为:rc;生产环境的profile为:prod。tomcat
下面举个dubbo不一样环境下,使用不一样配置的方法:
安全
上面例子中,当激活相应的profile时,相应的配置文件才会导入。bash
好比: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中默认加载的配置文件是: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中。
使用java进行配置时,能够经过@Profile注解,实现不一样环境使用配置策略。好比swagger如今使用很广泛了,可是它存在必定的安全问题,若是生产环境中也暴露swagger的话,风险仍是比较大的,建议只在开发环境和测试环境启用,配置例子以下:
将上面的代码保存到logback-spring.xml文件中,而不是logback.xml中。
在开发环境或测试环境中,为了方便排查问题,咱们会使用DEBUG甚至TRACE级别的日志,而在生产环境中,避免日志增加过快,尽可能只是输出ERROR级别的日志。这就须要日志配置也要能根据不一样的环境,使用不一样的配置策略。
spring boot中的logback就能够知足这样的需求,例子以下:
将上面的代码保存到logback-spring.xml文件中,而不是logback.xml中。
在配置文件中直接指定
spring.profiles.active=test
这种方式很是不灵活,在实际开发部不太会使用到
使用占位符
在打包时替换,以mavne为例:
首先在配置文件中增长:
spring.profiles.active=@package.target@
在pom.xml中增长不一样环境打包的配置:
执行打包命令:
mvn package -Ptest
缺点:每次打包都要指定profile
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"
在微服务的时代,会不会以为有点麻烦呢?
标注方式(junit单元测试很是实用)
@ActiveProfiles({"dev"})
设置系统环境变量: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容器技术,因此很是有意义。