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

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

相关推荐
齐 飞15 分钟前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
狂放不羁霸23 分钟前
idea | 搭建 SpringBoot 项目之配置 Maven
spring boot·maven·intellij-idea
九圣残炎24 分钟前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode
wclass-zhengge26 分钟前
Netty篇(入门编程)
java·linux·服务器
LunarCod32 分钟前
WorkFlow源码剖析——Communicator之TCPServer(中)
后端·workflow·c/c++·网络框架·源码剖析·高性能高并发
计算机学长felix1 小时前
基于SpringBoot的“校园交友网站”的设计与实现(源码+数据库+文档+PPT)
数据库·spring boot·毕业设计·交友
Re.不晚1 小时前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐1 小时前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。1 小时前
Spring Boot 配置文件
java·spring boot·后端
顾北川_野1 小时前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java