后端多环境配置

设定环境

一般情况下,设有以下环境:

  • 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>

其中 idprofileActive 的值为环境名。 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>

results matching ""

    No results matching ""