通过yaml实现多个环境自动切换配置

660 阅读3分钟

1.环境准备

正常来讲,一个软件的开发上线的流程大部分都是分为三个环境,依次是开发、测试、上线。我们外包公司是开发(local)、内部测试(dev)、测试中心测试(sit)、业务版本测试(uat)、生产部署(prod)。

  • 开发环境(dev):开发环境是指的是咱们本地跑的环境。
  • 测试环境(qa):一般是克隆一份生产环境的配置,qa即test。
  • 生产环境(prod):正式提供对外服务的,即是真实环境。

今天主要讲讲关于springboot如何通过多个yaml文件实现环境部署时自动切换配置的两种方式,部署时切换方式和打包时Maven控制方式。

如上图:在application.yml文件的同级目录依次创建application-dev.yml,application-qa.yml,这2个配置文件,dev、qa分别对应上文"环境介绍"中的2个环境。而application-commons.yml是测试激活多个配置公用文件(不变的配置信息)。

配置文件中包含的信息很简单:

  • application-dev.yml
user_name: wukong-dev
  • application-qa.yml
user_name: bajie-qa
  • application-commons.yml
login_id: SpringBoot

2.Maven控制打包切换

2.1 设置项目对象模型pom.xml

2.1.1 添加profiles到pom.xml中,profiles节点是和build同级的

<profiles>
    <profile>
        <id>dev</id>
        <properties>
            <env>dev</env>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <profile>
        <id>qa</id>
        <properties>
            <env>qa</env>
        </properties>
    </profile>
    <profile>
        <id>prod</id>
        <properties>
            <env>prod</env>
        </properties>
    </profile>
</profiles>

activation 表示的是可以用这样的命令来触发profile,true 表示dev是默认的profile, 这样本地直接ide启动项目的时候就是连接的dev环境

2.1.2 添加filters节点

<build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <!-- 增加节点,注意env是上面配置的env标签 -->
        <filters>
            <filter>src/main/resources/application-${env}.yml</filter>
        </filters>
    </build>

2.2 设置激活配置文件

application.yml代码如下:

spring:
  profiles:
    active: @env@,commons

注意:@env@中的env可以理解为一个变量,需要与2.1.2中设置的${env}对应上。

2.3 添加Maven打包命令

clean package -P qa -D maven.test.skip=true

关于指令不熟悉的请看附录信息

2.4 执行Maven指令

注意:如果我运行的APP.java的程序,使用的DEV环境,但是打包的时候我使用的qa的打包,打包成功之后,激活的配置文件应该是qa的,Maven打包时已经设置了qa环境,部署命令中不需要再指明qa环境,如图激活成功

2.5 WEB环境测试

clean一下target之后,运行APP.java的主程序(显示的是DEV的默认环境数据)

package com.hanpang.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: 胖先森
 * === 面朝大海,春暖花开 ===
 * 2023-06-12 9:47
 **/
@RestController
public class IndexController {
    @Value("${user_name}")
    private String user_name;
    @Value("${login_id}")
    private String login_id;
    @Autowired
    private Environment environment;
    @GetMapping("/index")
    public void index(){
        System.out.println(user_name);
        System.out.println(login_id);
        System.out.println(environment.getProperty("user_name"));
        System.out.println(environment.getProperty("login_id"));

    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getLogin_id() {
        return login_id;
    }

    public void setLogin_id(String login_id) {
        this.login_id = login_id;
    }
}

http://127.0.0.1:8080/index 访问,后端获取信息如下

附录

maven 命令的格式为 mvn [plugin-name]:[goal-name],可以接受的参数如下。

-D 指定参数,如 -D maven.test.skip=true 跳过单元测试;
-P 指定 Profile 配置,可以用于区分环境;
-e 显示maven运行出错的信息;
-o 离线执行命令,即不去远程仓库更新包;
-X 显示maven允许的debug信息;
-U 强制去远程更新snapshot的插件或依赖,默认每天只更新一次。
创建maven项目:mvn archetype:create 
指定 group: -D groupId=packageName 
指定 artifact:-D artifactId=projectName
创建web项目:-D archetypeArtifactId=maven-archetype-webapp  
验证项目是否正确:mvn validatemaven 
打包:mvn package
只打jar包:mvn jar:jar
生成源码jar包:mvn source:jar
产生应用需要的任何额外的源代码:mvn generate-sources
编译源代码: mvn compile
编译测试代码:mvn test-compile
运行测试:mvn test
运行检查:mvn verify
清理maven项目:mvn clean
生成eclipse项目:mvn eclipse:eclipse
清理eclipse配置:mvn eclipse:clean
生成idea项目:mvn idea:idea
安装项目到本地仓库:mvn install
发布项目到远程仓库:mvn:deploy
在集成测试可以运行的环境中处理和发布包:mvn integration-test
显示maven依赖树:mvn dependency:tree
显示maven依赖列表:mvn dependency:list
下载依赖包的源码:mvn dependency:sources
安装本地jar到本地仓库:mvn install:install-file -DgroupId=packageName -DartifactId=projectName -Dversion=version -Dpackaging=jar -Dfile=path
启动tomcat:mvn tomcat:run
启动jetty:mvn jetty:run
运行打包部署:mvn tomcat:deploy
撤销部署:mvn tomcat:undeploy
启动web应用:mvn tomcat:start
停止web应用:mvn tomcat:stop
重新部署:mvn tomcat:redeploy
部署展开的war文件:mvn war:exploded tomcat:exploded