• SpringBoot 多环境配置文件切换


    背景

    很多时候,我们项目在开发环境和生成环境的环境配置是不一样的,例如,数据库配置,在开发的时候,我们一般用测试数据库,而在生产环境的时候,我们是用正式的数据,这时候,我们可以利用profile在不同的环境下配置用不同的配置文件或者不同的配置。

    解决方案

    spring boot允许你通过命名约定按照一定的格式(application-{profile}.properties)来定义多个配置文件,然后通过在application.properyies通过spring.profiles.active来具体激活一个或者多个配置文件,如果没有没有指定任何profile的配置文件的话,spring boot默认会启动application-default.properties。

    一、新建配置文件

    注:配置文件优先级(由高到低):
    bootstrap.properties -> bootstrap.yml -> application.properties -> application.yml

    此处使用.yml文件格式,在src/main/resources下新建如下文件

    application.yml (主配置)

    server:
      port: 9990
    
    spring:
      profiles:
        active: dev #选定配置
    
    
    #自定义默认值
    curvar:
      context: default.curvar

    application-pro.yml (开发配置)

    #模拟开发配置
    curvar:
      context: "开发配置变量"

    application-pro.yml(生产配置)

    #模拟生产配置
    curvar:
      context: "生产配置变量"

    二、 服务调用测试

     2.1 新建调用类

    @Slf4j
    @RestController
    public class IndexController {
    
        @Value("${curvar.context}")
        private String cusvar;
    
        /**
         * .
         * 使用哪一个配置
         *
         * @return
         */
        @RequestMapping("/test")
        public String test() {
            log.debug("使用:[{}]", cusvar);
            return "使用配置: " + cusvar;
        }
    
    }

    2.2 使用样例项目

    打开浏览器输入:http://localhost:9990/test     

    三、扩展练习

    3.1 使用注解标记配置,首先定义一个接口

    public interface Connector {
    
        String configure();
    }

    3.2 分别定义俩个实现类来实现它

    import org.springframework.context.annotation.Profile;
    import org.springframework.stereotype.Component;
    
    
    @Component
    @Profile("pro-db")//标记文件,环境切换
    public class ProConnector implements Connector {
    
        @Override
        public String configure() {
            return "pro生产标记文件...";
        }
    }
    import org.springframework.context.annotation.Profile;
    import org.springframework.stereotype.Component;
    
    @Component
    @Profile("dev-db")//标记文件,环境切换
    public class DevConnector implements Connector {
    
        @Override
        public String configure() {
            return "dev开发标记文件...";
        }
    }

    3.3 修改application.yml文件激活配置

    spring:
      profiles:
        #active: dev #选定配置
         active: pro-db #选定配置激活标记文件

    3.4 新增查询方法

       @Autowired
        private Connector connector; //注入
    
       /**
         * .
         * 使用哪一个被标记文件
         *
         * @return
         */
        @GetMapping("/proFile")
        public String proFile() {
            log.debug("使用配置文件:[{}]", connector.configure());
            return connector.configure();
        }

    打开浏览器输入:http://localhost:9990/proFile     

    3.5 使用一个或多个配置文件及激活标记文件

    3.5.1 修改application.yml文件,进行属性叠加

    spring:
      profiles:
        include: pro,dev-db #指定配置文件及激活标记文件
        #active: pro-db #选定标记文件

    3.5.2 新增查询方法

       /**
         * .
         * 使用哪一个配置文件及标记文件
         *
         * @return
         */
        @GetMapping("/include")
        public String include() {
            return String.format("使用配置文件:%s,使用标记文件:%s", cusvar, connector.configure());
        }

    打开浏览器输入:http://localhost:9990/include     

    3.6 切换日志文件

    3.6.1 新建logback文件

     

     logback-pro.yml (生产日志)

    <?xml version="1.0" encoding="UTF-8"?>
    <configuration debug="true">
        <contextName>logback</contextName>
    
        <!--定义文件名及存储路径-->
        <property name="log.path" value="./pro.log"/>
        <!-- ConsoleAppender:控制台设置 -->
        <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
            <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
                <level>debug</level>
            </filter>
            <encoder>
                <pattern>%d{HH:mm:ss.SSS} %contextName  [%thread] %-5level %logger{36} [%file : %line] - %msg%n
                </pattern>
            </encoder>
        </appender>
        <!--RollingFileAppender:滚动记录文件,先将日志记录到指定文件-->
        <appender name="file" class="ch.qos.logback.core.rolling.RollingFileAppender">
            <file>${log.path}</file>
            <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
                <fileNamePattern>${log.path}.%d{yyyy-MM-dd}.%i.gz</fileNamePattern>
                <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                    <maxFileSize>100MB</maxFileSize>
                </timeBasedFileNamingAndTriggeringPolicy>
                <!-- 每产生一个日志文件,该日志文件的保存期限为7天 -->
                <maxHistory>7</maxHistory>
            </rollingPolicy>
    
            <encoder>
                <pattern>%date %level  [%thread] %logger{36} [%file : %line] %msg%n
                </pattern>
            </encoder>
        </appender>
    
        <!--将上述name名称:console:标签名称为debug-->
        <root level="debug">
            <appender-ref ref="console"/>
        </root>
        <!--将上述name名称:file:标签名称为info-->
        <root level="info">
            <appender-ref ref="file"/>
        </root>
        <logger name="org.springframework.scheduling" level="error"/>
        <Logger name="org.apache.catalina.util.LifecycleBase" level="error"/>
        <Logger name="org.apache.coyote.http11.Http11NioProtocol" level="warn"/>
        <Logger name="org.apache.tomcat.util.net.NioSelectorPool" level="warn"/>
        <Logger name="org.springframework" level="info"/>
        <Logger name="org.freeswitch.esl" level="warn"/>
        <logger name="java.sql" level="error"/>
        <logger name="org.mybatis" level="info"/><!--mybatis的日志级别为info-->
        <logger name="com.example" level="debug"/><!--com.hy包下的日志级别为debug-->
    </configuration>

    3.6.2 修改application.yml文件,配置日志属性

    spring:
      profiles:
        #include: pro,dev-db #指定配置文件及激活标记文件
        #active: pro-db #选定标记文件
        active: pro #指定配置文件
    
    #日志
    logging:
       config: classpath:logback-${spring.profiles.active}.xml #本地IDEA启动配置
       #config: config/logback-${spring.profiles.active}.xml # java -jar 包启动配置

    项目启动访问接口,控制台打印日志

    友情提示:jar运行指定配置

    java -jar xxx.jar --spring.profiles.active=dev  #指定dev配置
    
    java -jar xxx.jar --server.port=9090 #指定启动端口

    参考链接

  • 相关阅读:
    CSS3--box-shadow
    C#快捷键
    c#基础3
    C#基础2
    C#基础
    javascript 字符串总结
    javasrcipt中的for in 循环
    javascript复习总结
    结构体数组排序
    ArrayList集合排序
  • 原文地址:https://www.cnblogs.com/bgyb/p/16072713.html
Copyright © 2020-2023  润新知