2多profile · SpringCloud微服务实战 · 看云

导航

在实际企业开发中,应用一般至少有3个环境,开发、测试、uat、生产等环境,对于不同的环境应该有自己的配置,否则每个环境的发布会很麻烦,并且对运维很不友好。使用Spring BootProfile可以实现多场景下的配置切换,方便开发中进行测试和部署生产环境

本节代码地址


1.1 创建应用配置

application.yml文件分为3部分,使用 --- 来作为分隔符,第一部分通用配置部分,表示2个环境都通用的属性, 后面2段分别为:默认,开发,用spring.profiles指定了一个值(开发为dev,测试为test,生产为prod),这个值表示该段配置应该用在哪个profile里面,其中test 单独创建一个配置文件,默认的application-{profile}.yml的方式来指定不同环境的配置。使用spring.profiles.active指定设置的spring.profiles名称

如果spring.profiles.active没有指定值,那么只会使用没有指定spring.profiles文件的值,也就是只会加载通用的配置

server:
  port: 8773
spring:
  application:
    name: fw-profile
  profiles:
    active: dev

---
spring:
  profiles: dev
version: dev

---
spring:
  profiles: prod
version: prod


application-test.yml内容

spring:
  profiles: test
version: test


1.2 创建控制层

在控制层创建一个获取配置信息的方法,里面的内容使用@Value("${version}")从配置文件中获取具体的值,同过修改不同的profile来验证获取值的不同。

@RestController
public class HelloController {

    @Value("${version}")
    String version;

    
    @GetMapping("/version")
    public String getVersion(){
        return version;
    }

}


1.3 应用启动

设置spring.profiles.active指定的profile为dev
浏览器或Postman输入localhost:8773/version
61bdd1a919a733457c2bf104865aac1f_MD5.png

修改spring.profiles.active指定的profile为test
fe99f4ec6a7fcd96cb25e9a5857542ff_MD5.png

1.4 应用部署

可以在启动的时候指定spring.profiles.active来启动

java -jar xxx.jar --spring.profiles.active=test 表示使用测试环境的配置
java -jar xxx.jar --spring.profiles.active=prod 表示使用生产环境的配置

1.5 Maven Profile

我们使用的是构建工具是Maven,也可以通过Maven的profile特性来实现多环境配置启动和打包

将之前的配置删除
并在pom中设置maven信息,我们设置dev、test、uat、prod4个环境的配置信息,并且执行dev 是默认的配置信息,设置配置目录为src/main/resources/config/${profiles.active},新建配置信息如下图所示。

78e2e47e719c0ed7a1a3ca8bc9bdd5b1_MD5.png

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <classifier>exec</classifier>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <configuration>
                <finalName>${project.artifactId}</finalName>
                <mainClass>com.lmis.SpringBootAuthApplication</mainClass>
            </configuration>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <skip>true</skip>
            </configuration>
        </plugin>
    </plugins>

    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
        <resource>
            <directory>src/main/resources/config/${profiles.active}</directory>
        </resource>
    </resources>

    <!-- 打包去版本号 -->
    <finalName>${artifactId}</finalName>
</build>

<profiles>
    <!--本地开发环境 -->
    <profile>
        <id>dev</id>
        <properties>
            <profiles.active>dev</profiles.active>
        </properties>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>

    <!--测试环境 -->
    <profile>
        <id>test</id>
        <properties>
            <profiles.active>test</profiles.active>
        </properties>

    </profile>

    <!--UAT环境 -->
    <profile>
        <id>uat</id>
        <properties>
            <profiles.active>uat</profiles.active>
        </properties>
    </profile>

    <profile>
        <id>prod</id>
        <properties>
            <profiles.active>prod</profiles.active>
        </properties>
    </profile>
</profiles>

1.6 maven 方式启动

浏览器或Postman输入localhost:8773/version
61bdd1a919a733457c2bf104865aac1f_MD5.png

修改spring.profiles.active指定的profile为test
fe99f4ec6a7fcd96cb25e9a5857542ff_MD5.png

可以看到和之前通过spring.profiles.active结果是一样的。

1.7 maven 方式打包

通过执行mvn clean package -P ${profile}来指定使用哪个profile,然后启动的时候直接java -jar xxx.jar,不需要实行profile

两种方式都可以,推荐使用maven方式来启动和打包,maven方式打的包只会将自己需要的配置文件打包,不会讲其它profile也打包进来,如果仅仅通过解压jar包只会获取当前profile的配置信息。相对较安全,而且方便CICD构建和部署。