SpringBoot Profiles 多環境配置及切換


前言

大部分情況下,我們開發的產品應用都會根據不同的目的,支持運行在不同的環境(Profile)下,比如:

  • 開發環境(dev)
  • 測試環境(test)
  • 預覽環境(pre)
  • 生產環境(prod)

這里的 環境 實際上是一個統稱,不同的環境可能代表着

  • 使用的域名、端口、實例數目是不同的;
  • 連接的數據庫地址、端口、名稱是不同的;
  • 使用的日志輸出格式、級別、保存時間是不同的;

以數據庫為例,應用在開發環境下運行時,連接的是開發環境對應的數據庫;應用在生產環境下運行時,連接的是生產環境對應的數據庫。

我們不是要為不同的運行環境開發多個不同的應用,而是要使應用可以運行在多個不同的環境中,怎么做到?

通過配置,更准備地說,是通過配置屬性。配置屬性本質就是鍵值對。

以數據庫為例,應用連接數據庫時,需要提供如下連接信息:

  • 地址
  • 端口
  • 名稱
  • 用戶名
  • 密碼

這些信息不會 硬編碼 到應用代碼中,而是以配置屬性(鍵值對)的形式存儲到配置文件中;應用運行時通過讀取該配置文件中的配置屬性,進而完成數據庫的連接。

應用 = 程序代碼 + 配置文件

這個配置文件中連接信息指向測試使用的數據庫,我們就說應用運行在測試環境;連接信息指向生產使用的數據庫,我們就說應用運行在生產環境;應用需要使用的其它服務(如:Redis、Kafka等)也是同樣的原理。

也說是說,我們可以通過為應用運行時指定不同的配置文件(不同的配置文件配置着不同的配置屬性),就可以使得應用可以運行在不同的環境中。SpringBoot 實際上也是通過類似的原理實現多環境的配置及切換的。

:配置屬性可能有多種存儲方式,這里僅以配置文件為例。

默認環境配置

多環境配置及切換並不是每個應用所必須的,SpringBoot 也為我們考慮到了這一點,它提供了默認的配置文件和運行環境,即:如果沒有特別指定,SpringBoot 使用默認的配置文件,運行於默認環境中。

默認配置文件

SpringBoot 默認配置文件:application.yml,默認位於類路徑下。其中,application 代表 SpringBoot 配置文件名稱,yml 代表配置文件格式(后綴)。

默認配置文件實際也可以不提供,或者內容為空。這是為什么呢?

SpringBoot 是一個功能十分豐富的技術框架,自身內置了很多的配置屬性,用以控制 Spring 容器的初始化行為;同時,SpringBoot 也支持通過外置配置文件的方式引入其它的配置屬性,application.yml 就是會被 SpringBoot 默認加載的外置配置文件之一。

SpringBoot 配置屬性 = 內置配置屬性 + 外置配置文件屬性(application.yml)

如果 application.yml 不存在或者內容為空,SpringBoot 僅使用內置配置屬性初始化容器環境;如果 application.yml 存在且內容不為空,SpringBoot 使用內置配置屬性和 application.yml 配置屬性的合集初始化容器環境。

如果 application.yml 中的配置屬性名稱和內置屬性相同,那么這個配置屬性值最終以 application.yml 中的配置值為准(覆蓋)。相當於,application.yml 的配置文件屬性優先級高於默認的內置屬性。

:SpringBoot 也支持 properties 后綴的配置文件格式,本文以 yml 為例。

默認運行環境

SpringBoot 默認運行環境:default,default 為運行環境名稱。

默認運行環境的名稱是哪里來的呢?

如前文所述,SpringBoot 是有內置屬性的,默認的運行環境名稱即來自於內置屬性:

spring.profiles.active=default

也就是說,內置配置屬性 spring.profiles.active 指定 SpringBoot 的運行環境名稱為 default,我們可以將其指定為其它值,進行改變運行環境名稱。

多環境配置

因為 application.yml 配置屬性的優先級高於默認的內置屬性,我們可以通過在 application.yml 中指定配置屬性 spring.profiles.active 的值為 dev,將 SpringBoot 運行環境的名稱修改為 dev:

application.yml

spring:
  profiles:
    active: dev

僅僅是修改運行環境名稱么?SpringBoot 幫我們做的還有更多,它會自動搜索名稱為 application-dev.yml 的配置文件並加載其中的配置屬性。

配置文件名稱是有固定模式的:

application-{profile}.yml

其中,{profile} 為我們通過配置屬性 spring.profiles.active 指定的運行環境名稱。

也就是說,如果我們指定運行環境名稱為 dev,SpringBoot 會為我們自動搜索加載配置文件名稱為 application-dev.yml 中的配置屬性;如果我們指定運行環境名稱為 test,SpringBoot 會為我們自動搜索加載配置文件名稱為 application-test.yml 中的配置屬性;其它運行環境名稱同理。

SpringBoot 配置屬性 = 內置屬性 + application.yml 配置屬性 + application-{profile}.yml 配置屬性

SpringBoot 配置屬性優先級:application-{profile}.yml 配置屬性 > application.yml 配置屬性 > 內置屬性

也就是說,我們可以通過指定不同的運行環境名稱,以及相應名稱的配置文件,從而實現多環境之間的切換。

:如果找不到相應環境(profile)的配置文件,則會忽略。

多環境切換

以開發環境(dev)、測試環境(test)、預覽環境(pre)、生產環境(prod)為例,我們可以預先在項目中創建相應環境的配置文件:

application-dev.yml
application-test.yml
application-pre.yml
application-prod.yml

每一個環境的配置文件中配置相應環境對應的屬性,如:數據庫連接信息等;然后在 application.yml 中通過指定配置屬性 spring.profiles.active 為不同的值實現多環境切換,如:

spring:
  profiles:
    active: prod

代表 SpringBoot 的運行環境名稱為 prod,它將會加載 application-prod.yml 中的配置屬性。

還可以在 SpringBoot 啟動時,通過命令行參數的方式指定配置屬性:

java -jar myproject.jar --spring.profiles.active=prod

SpringBoot 配置屬性優先級:命令行參數配置屬性 > application-{profile}.yml 配置屬性 > application.yml 配置屬性 > 內置屬性

推薦的方式是通過 application.yml/spring.profiles.active 指定 SpringBoot 應用默認的運行環境,應用啟動時通過命令行參數指定具體的運行環境;如果啟用啟動時沒有指定,則應用使用默認的運行環境運行。

小結

SpringBoot 多環境配置及切換,本質就是通過預先設定好多個運行環境名稱及相應的配置文件;應用啟動時通過指定運行環境名稱,進而加載對應名稱的配置文件實現的。

實際使用時,我們還可以充分利用配置屬性加載的優先級合理地規划應用的配置屬性,比如:

  1. 通用配置(與運行環境無關的)屬性可以放到 application.yml 中;
  2. 運行環境(profile)相關的配置屬性可以放到相應的 application-{profile}.yml 中;
  3. 啟動時需要臨時指定的配置屬性可以通過命令行參數設置;
  4. 2 和 3 中配置屬性也可以放到 application.yml 中一份,作為默認配置。

me


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM