后端多环境配置
设定环境
一般情况下,设有以下环境:
- dev(开发环境)
- test(测试环境)
- uat(预发布环境)
- prod(生产环境)
修改 spring 配置文件
将具体服务的 application.yml
文件增加后缀名为对于环境名如 开发环境 application-dev.yml
如需其他环境可复制多份,改为对应环境名称
新建 application.yml
文件
spring:
profiles:
active: @profileActive@
profileActive
为 maven 配置文件中的变量
修改 maven 配置文件
修改项目根目录的 pom.xml
文件, 在
<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<profileActive>dev</profileActive>
</properties>
</profile>
<profile>
<id>test</id>
<properties>
<profileActive>test</profileActive>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<profileActive>prod</profileActive>
</properties>
</profile>
</profiles>
其中 id
和 profileActive
的值为环境名。
activeByDefault
为默认环境
<activation>
额外配置(可选)
maven中的profile的激活条件还可以根据jdk、操作系统、文件存在或者缺失来激活。这些内容都是在 <activation>
标签中配置,如下:
<!--activation用来指定激活方式,可以根据jdk环境,环境变量,文件的存在或缺失-->
<activation>
<!--配置默认激活-->
<activeByDefault>true</activeByDefault>
<!--通过jdk版本-->
<!--当jdk环境版本为1.8时,此profile被激活-->
<jdk>1.8</jdk>
<!--当jdk环境版本1.8或以上时,此profile被激活-->
<jdk>[1.8,)</jdk>
<!--根据当前操作系统-->
<os>
<name>Windows XP</name>
<family>Windows</family>
<arch>x86</arch>
<version>5.1.2600</version>
</os>
</activation>
修改 logback-spring.xml
为所有 appender
标签和 appender-ref
标签 增加 <springProfile name="dev,test,prod">
, name
里面的内容为所有环境的值
以下为修改后的文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
<include resource="org/springframework/boot/logging/logback/defaults.xml"/>
<include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
<!--应用名称-->
<springProperty scope="context" name="APP_NAME" source="spring.application.name"/>
<!--日志文件保存路径-->
<springProperty scope="context" name="LOG_FILE_PATH" source="logging.file.path"/>
<springProperty scope="context" name="LOGSTASH_SERVER" source="lili.data.logstash.server"/>
<contextName>${APP_NAME}</contextName>
<springProfile name="dev,test,prod">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
</rollingPolicy>
<encoder>
<pattern>${FILE_LOG_PATTERN}</pattern>
</encoder>
</appender>
</springProfile>
<springProfile name="dev,test,prod">
<appender name="RocketmqClientAppender" class="ch.qos.logback.core.rolling.RollingFileAppender">
<file>${LOG_FILE_PATH}/rocketmq.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<fileNamePattern>${LOG_FILE_PATH}/rocketmq/rocketmq-%d{yyyy-MM-dd}.log</fileNamePattern>
<maxHistory>30</maxHistory>
<totalSizeCap>30MB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>%d{yy-MM-dd.HH:mm:ss.SSS} [%-16t] %-5p %-22c{0} %X{ServiceId} - %m%n</pattern>
</encoder>
</appender>
<logger name="RocketmqClient" additivity="false">
<level value="info" />
<appender-ref ref="RocketmqClientAppender"/>
</logger>
</springProfile>
<springProfile name="dev,test,prod">
<!--输出到elk的LOGSTASH-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<!-- 配置elk日志收集 配饰的是 LOGSTASH 的地址-->
<destination>${LOGSTASH_SERVER}</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
</providers>
<!--自定义字段 区分项目-->
<customFields>{"appName":"${APP_NAME}"}</customFields>
</encoder>
</appender>
</springProfile>
<root level="INFO">
<springProfile name="dev,test,prod">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</springProfile>
</root>
</configuration>
多环境启动
maven 打包
可使用 -P
参数,参数后跟环境名,如 -P dev
以下为示例
mvn clean install package -P dev -Dmaven.test.skip=true
| 注:使用 -P
参数打包之后 application.yml
里面的 @profileActive@
会修改为对应参数。打包完成,不带参数的 jar 启动会默认为 -P
后面填写的环境
jar 启动参数
jar 启动时,可根据启动参数,指定启动环境 --spring.profiles.active=xxx
, xxx
为环境名
以下为示例
java -jar xxx.jar --spring.profiles.active=test
资源过滤(可选)
如果不配置这一步,将会在任何环境下打包都会带上全部的配置文件,可以配置只保留对应环境下的配置文件,这样安全性更高。
| 配置完成这一步,便无法根据 jar 启动参数切换环境
在 pom.xml
文件中指定 <resource>
过滤的条件即可,如下:
<build>
<resources>
<!--排除配置文件-->
<resource>
<directory>src/main/resources</directory>
<!--先排除所有的配置文件-->
<excludes>
<!--使用通配符,当然可以定义多个exclude标签进行排除-->
<exclude>application*.properties</exclude>
</excludes>
</resource>
<!--根据激活条件引入打包所需的配置和文件-->
<resource>
<directory>src/main/resources</directory>
<!--引入所需环境的配置文件-->
<filtering>true</filtering>
<includes>
<include>application.yml</include>
<!--根据maven选择环境导入配置文件-->
<include>application-${profileActive}.yml</include>
</includes>
</resource>
</resources>
</build>