实现多环境配置有以下几个重要原因:
适应不同的部署环境:在实际部署应用程序时,通常会有多个不同的部署环境,如开发环境、测试环境、生产环境等。每个环境可能需要不同的配置,例如数据库连接信息、日志级别、缓存配置等。通过实现多环境配置,可以方便地适应不同的部署环境,而无需手动修改配置文件。
提高灵活性和可维护性:通过将不同环境的配置分离开来,可以提高系统的灵活性和可维护性。开发人员可以专注于当前环境的配置,而不必担心影响其他环境的配置。同时,当需要修改某个环境的配置时,也可以更加方便地进行管理和维护。
降低人为错误的风险:手动修改配置文件很容易引入人为错误,特别是在频繁切换环境或部署时。通过实现多环境配置,可以减少手动操作的风险,提高系统的稳定性和可靠性。
支持持续集成和持续部署:在持续集成和持续部署的过程中,需要自动化地构建和部署应用程序到不同的环境。多环境配置可以帮助自动化流程更加顺利地进行,从而提高开发和部署的效率。
项目目录结构:
在pom.xml文件中,使用maven-profile和maven-resources-plugin插件来实现多环境配置管理。在插件配置中,可以指定不同的配置文件,根据不同的环境打包不同的配置文件。
<profiles>
<!-- 本地开发 -->
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<!-- 测试 -->
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
</profile>
<!-- 生产 -->
<profile>
<id>prod</id>
<properties>
<env>prod</env>
</properties>
</profile>
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources-env/${env}</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
application.yml
spring:
# Spring Boot 2.4为了提升对Kubernetes的支持 将 spring.profiles 作废了
# profiles:
# active: config,config1,config2,config3
# 替换上面作废的spring.profiels.actice配置参数
config:
import: application-config.yml,application-config1.yml,application-config2.yml,application-config3.yml
application-config.yml
biz:
total: application
本地开发
dev/application-config1.yml
biz:
env: dev-environment
profile: dev-profile
生产
prod/application-config1.yml
biz:
env: prod-environment
profile: prod-profile
测试
test/application-config1.yml
biz:
env: test-environment
profile: test-profile
PropertiesApplication
启动类
@SpringBootApplication
public class PropertiesApplication {
public PropertiesApplication(Environment environment) {
String total = environment.getProperty("biz.total");
String env = environment.getProperty("biz.env");
String profile = environment.getProperty("biz.profile");
System.out.println("total = " + total + ", env = " + env + ", profile = " + profile);
}
public static void main(String[] args) {
SpringApplication.run(PropertiesApplication.class, args);
}
}
dev环境
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
打印信息:total = application, env = dev-environment, profile = dev-profile
test环境
<profile>
<id>test</id>
<properties>
<env>test</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
打印信息:total = application, env = test-environment, profile = test-profile