Spring Boot 多环境的配置方式

公众号「古时的风筝」,专注于后端技术,尤其是 Java 及周边生态。

个人博客:www.moonkite.cn

大家好,我是风筝

这是一篇写给新手的文章,老手可以绕行了。

起因是一个同学让我帮他看个问题,他说有两个环境,一个环境有问题,另一个环境没问题,但是一直找不到原因,假设一个环境是 dev,另一个环境是 test。

于是,我远程了他的机器,想分别看下两个环境的现象,结果发现没有地方可以配置环境。我问他是怎么切换环境的,他说要连另外一个环境就把 application.yml 中的配置改了,之后切换回来的时候再改回来。

我当时直接就无语住了。后来想想他还没毕业,不知道也正常,我刚学 Spring Boot 的时候连多个环境都不知道,也是后来正式加入工作团队后才学来的。

我们平时做项目的时候,一般都会分几套环境,开发环境、测试环境、预发布环境以及生产环境。每一套环境的配置都是不一样的,比如数据库连接串不一样、redis不一样,还有其他一些配置很可能都不一样。

那这时候,我们切换环境的时候就不能像前面说的那样手动改配置文件的内容了,那样既傻又费事。

有两种区分多个环境的方式可以使用。

多个配置文件

当配置Spring Boot应用程序的多个环境时,使用多配置文件的方式,通常会使用以下约定:application-{profile}.yml,其中{profile}是配置文件的名称。在这些配置文件中,你可以根据不同的环境指定不同的属性值。

例如 application-dev.yml 表示开发环境, application-test.yml 表示测试环境,application-prod.yml 表示生产环境,还有一个 application.yml表示通用的公共配置。

通用配置文件 application.yml

和环境无关的配置都可以放在这里,例如启动端口号、服务名称以及其他共用属性等。

还可以在通用配置中设置 spring.profiles.active来控制启动配置,比如配置成 dev,那就是用 application-dev.yml的配置。

yaml 复制代码
server:
  port: 9000

spring:
  application:
    name: fengzheng
  profiles:
    # 环境配置
    active: dev
    
common:
	key: 公共 key

各环境配置

除了通用配置外, 其他几个配置文件就是配置与各自环境有关的配置了,比如开发环境和测试环境使用不用的数据库服务器,不同的redis集群,这就要在各自的配置中区分开来。

dev 环境配置文件 application-dev.yml

yaml 复制代码
dev-property: dev-value
dev-another-property: dev-another-value

# Dev 环境的数据库配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/devdb
    username: devuser
    password: devpassword
  1. test 环境配置文件 application-test.yml
yaml 复制代码
test-property: test-value
test-another-property: test-another-value

# Test 环境的数据库配置
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb
    username: testuser
    password: testpassword
  1. prod 环境配置文件 application-prod.yml
yaml 复制代码
prod-property: prod-value
prod-another-property: prod-another-value

# Prod 环境的数据库配置
spring:
  datasource:
    url: jdbc:mysql://production-db-url:3306/proddb
    username: produser
    password: prodpassword

指定环境启动

之后在启动项目的时候,就可以通过-Dspring.profiles.active来指定使用的配置文件,也就是指定的环境了。

bash 复制代码
java -jar myapp.jar -Dspring.profiles.active=dev

例如上面的命令,将激活 application-dev.yml 中的配置。

在 IDEA 中,通过 "Run/Debug Configurations",在 VM options 中加入相应的配置启动,可以直接连接到对应的环境。

或者找到 Active profiles ,直接在后面填写对应的配置名称也可以。

在一个配置文件中配置多个环境

除了使用多个配置文件,用后缀区分外,还可以直接在一个配置文件中配置多个环境。

例如下面的配置,把公共配置写在最前面,然后之后每一个环境的配置用 ---区分,spring.profiles来指定当前段落代表的配置。

yml 复制代码
spring:
  application:
    name: fengzheng
    
---    
spring:
  profiles: dev
  datasource:
    url: jdbc:mysql://production-db-url:3306/dev-db
    username: produser
    password: prodpassword
server:
  port: 1990


---
spring:
  profiles: test
  datasource:
    url: jdbc:mysql://production-db-url:3306/test-db
    username: produser
    password: prodpassword
server:
  port: 1991

---
spring:
  profiles: prod
  datasource:
    url: jdbc:mysql://production-db-url:3306/prod-db
    username: produser
    password: prodpassword
server:
  port: 1992

之后启动项目的时候,和前面多个配置文件的方式一样。

通过-Dspring.profiles.active来指定使用的配置文件,也就是指定的环境了。

bash 复制代码
java -jar myapp.jar -Dspring.profiles.active=dev

例如上面的命令,将激活 application-dev.yml 中的配置。

在 IDEA 中,通过 "Run/Debug Configurations",在 VM options 中加入相应的配置启动,可以直接连接到对应的环境。

或者找到 Active profiles ,直接在后面填写对应的配置名称也可以。

推荐阅读

什么时候都用微服务,只会害了你

JDK21你可以不用,但是新特性还是要了解的

前端同事最讨厌的后端行为,看看你中了没有

相关推荐
ღ᭄ꦿ࿐Never say never꧂2 分钟前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
所待.3834 分钟前
小小扑克牌算法
java·算法
.生产的驴11 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
.生产的驴12 分钟前
SpringBoot 消息队列RabbitMQ在代码中声明 交换机 与 队列使用注解创建
java·spring boot·分布式·servlet·kafka·rabbitmq·java-rabbitmq
海里真的有鱼19 分钟前
Spring Boot 中整合 Kafka
后端
idealzouhu25 分钟前
Java 并发编程 —— AQS 抽象队列同步器
java·开发语言
布瑞泽的童话25 分钟前
无需切换平台?TuneFree如何搜罗所有你爱的音乐
前端·vue.js·后端·开源
听封29 分钟前
Thymeleaf 的创建
java·spring boot·spring·maven
写bug写bug35 分钟前
6 种服务限流的实现方式
java·后端·微服务