2多profile · SpringCloud微服务实战 · 看云
导航
在实际企业开发中,应用一般至少有3个环境,开发、测试、uat、生产等环境,对于不同的环境应该有自己的配置,否则每个环境的发布会很麻烦,并且对运维很不友好。使用
Spring Boot的Profile可以实现多场景下的配置切换,方便开发中进行测试和部署生产环境
本节代码地址
GitHub: https://github.com/xuyisu/fw-sping-cloud/tree/master/fw-cloud-springboot/fw-springboot-profile
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
修改spring.profiles.active指定的profile为test
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},新建配置信息如下图所示。
<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
修改spring.profiles.active指定的profile为test
可以看到和之前通过spring.profiles.active结果是一样的。
1.7 maven 方式打包
通过执行mvn clean package -P ${profile}来指定使用哪个profile,然后启动的时候直接java -jar xxx.jar,不需要实行profile
两种方式都可以,推荐使用
maven方式来启动和打包,maven方式打的包只会将自己需要的配置文件打包,不会讲其它profile也打包进来,如果仅仅通过解压jar包只会获取当前profile的配置信息。相对较安全,而且方便CICD构建和部署。


