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你可以不用,但是新特性还是要了解的

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

相关推荐
SomeB1oody5 分钟前
【RustyML入门】7.4. 按需裁剪与模块化集成
开发语言·后端·机器学习·rust·教程
吴声子夜歌8 分钟前
Java面试——数据结构(一)
java·数据结构·面试
罗超驿8 分钟前
SpringBoot 快速入门
java·spring boot·后端
疯狂打码的少年34 分钟前
【数据结构】选择类排序:简单选择与堆排序
java·数据结构·笔记·算法
卷无止境1 小时前
除了开发api,FastAPI其实也可以配合jinja2模板写页面
后端·python·fastapi
吴声子夜歌1 小时前
Java面试——基础
java·开发语言·面试
newerp1 小时前
Redis 操作与缓存策略
后端·程序员·go
newerp1 小时前
GORM ORM 基础
后端·程序员·go
小岛前端1 小时前
AI Skills 已经封神,但新的问题却越来越严重!
前端·后端·github
拖孩1 小时前
一个人 + AI 做的小程序,上线 15 天赚了 10 块 5
前端·后端·微信小程序