1. 引言
YAML 是一種易於人類理解的標記,用於配置文件的編寫。為什麼我們更傾向於使用這種數據序列化格式,而不是在 Spring Boot 中使用的 properties 文件?除了可讀性和減少重複之外,YAML 是編寫配置為代碼的理想語言,適用於部署。
同樣,使用 YAML 進行 Spring DevOps 能夠簡化配置變量在環境中的存儲,正如 12 因子應用程序 推薦的。
在本教程中,我們將比較 Spring YAML 與 properties 文件,以瞭解使用一種方法相對於另一種方法的優勢。但請記住,YAML 相對於 properties 文件配置的選擇有時只是個人喜好的問題。
2. YAML 記事本
YAML 是 “YAML Ain’t Markup Language” 的遞歸首字母縮寫。它具有以下特點:
- 更清晰、更易於人類理解
- 非常適合用於層次化配置數據
- 它支持增強功能,例如映射、列表和標量類型
這些功能使 YAML 成為 Spring 配置文件的完美伴侶。 對於剛開始接觸 YAML 的初學者,請注意:由於其 縮進規則,編寫 YAML 可能會有些繁瑣。
3. Spring YAML 配置
正如前幾節所述,YAML 是一種非凡的數據格式,非常適合用於配置文件。它比 properties 文件更易讀,並且提供了更強大的功能。因此,建議使用 YAML 格式進行配置,而不是 properties 文件配置。 此外,從 1.2 版本開始,YAML 是 JSON 的超集。
此外,在 Spring 中,放置在外部的配置文件會覆蓋打包好的 jar 文件中的配置。 Spring 配置中另一個有趣的特性是能夠在運行時分配環境變量。 這對於 DevOps 部署至關重要。
Spring 配置文件允許您將環境隔離併為它們應用不同的屬性。 YAML 增加了在同一文件中包含多個配置文件的可能性。
注意:此功能也適用於 Spring Boot 2.4.0 中使用的 properties 文件。
在我們的案例中,為了部署目的,我們將有三個:測試、開發和生產。
spring:
profiles:
active:
- test
---
spring:
config:
activate:
on-profile: test
name: test-YAML
environment: testing
servers:
- www.abc.test.com
- www.xyz.test.com
---
spring:
config:
activate:
on-profile: prod
name: prod-YAML
environment: production
servers:
- www.abc.com
- www.xyz.com
---
spring:
config:
activate:
on-profile: dev
name: ${DEV_NAME:dev-YAML}
environment: development
servers:
- www.abc.dev.com
- www.xyz.dev.com注意:如果使用 Spring Boot 版本低於 2.4.0,應使用 spring.profiles 屬性,而不是此處使用的 spring.config.activate.on-profile 。
現在,讓我們檢查 spring.profiles.active 屬性,它默認分配測試環境。我們可以重新部署製品而不再次構建源代碼。
Spring 另一個有趣的功能是,您可以通過環境變量啓用該配置文件:
export SPRING_PROFILES_ACTIVE=dev我們將在測試部分看到該環境變量的相關性。 此外,我們可以配置 YAML 屬性,直接從環境變量中指定值:
name: ${DEV_NAME:dev-YAML}我們可以看到,如果沒有配置環境變量,則會使用默認值 dev-YAML。
4. 減少重複和可讀性
YAML 的分層結構提供了減少配置屬性文件上層級屬性的方法。 讓我們通過一個例子來查看差異:
component:
idm:
url: myurl
user: user
password: password
description: >
this should be a long
description
service:
url: myurlservice
token: token
description: >
this should be another long
description使用屬性文件,相同的配置將變得冗餘:
component.idm.url=myurl
component.idm.user=user
component.idm.password=password
component.idm.description=this should be a long \
description
component.service.url=myurlservice
component.service.token=token
component.service.description=this should be another long \
descriptionYAML 的層級結構極大地增強了可讀性. 它不僅在於避免重複,還包括正確使用縮進,這完美地描述了配置的內容以及它的用途。與使用反斜槓 \, 在 YAML 中,可以使用 <em> 字符將內容分成多行。
5. 列表和映射
我們可以使用 YAML 和屬性文件配置列表和映射。
有以下兩種方法可以分配值並將其存儲在列表中:
servers:
- www.abc.test.com
- www.xyz.test.com
external: [www.abc.test.com, www.xyz.test.com]這兩個示例提供相同的結果。使用屬性文件進行等效配置會更難閲讀:
servers[0]=www.abc.test.com
servers[1]=www.xyz.test.com
external=www.abc.test.com, www.xyz.test.com再次強調,YAML 格式更易於人類閲讀和理解。
同樣,我們可以配置映射:
map:
firstkey: key1
secondkey: key26. 測試
現在,讓我們檢查一切是否按預期工作。如果檢查應用程序的日誌,我們可以看到默認選擇的環境是測試環境:
2020-06-11 13:58:28.846 INFO 10720 --- [main] com.baeldung.yaml.MyApplication: ...
using environment:testing
name:test-YAML
servers:[www.abc.test.com, www.xyz.test.com]
external:[www.abc.test.com, www.xyz.test.com]
map:{firstkey=key1, secondkey=key2}
Idm:
Url: myurl
User: user
Password: password
Description: this should be a long description
Service:
Url: myurlservice
Token: token
Description: this should be another long description我們可以通過配置環境中的 DEV_NAME 來覆蓋名稱:
export DEV_NAME=new-dev-YAML我們可以看到,通過使用 dev 配置文件運行應用程序時,環境名稱會發生變化。
2020-06-11 17:00:45.459 INFO 19636 --- [main] com.baeldung.yaml.MyApplication: ...
using environment:development
name:new-dev-YAML
servers:[www.abc.dev.com, www.xyz.dev.com]讓我們使用 SPRING_PROFILES_ACTIVE=prod 運行到生產環境。
export SPRING_PROFILES_ACTIVE=prod
2020-06-11 17:03:33.074 INFO 20716 --- [main] ...
using environment:production
name:prod-YAML
servers:[www.abc.com, www.xyz.com]7. 結論
在本教程中,我們詳細介紹了 YAML 配置文件與 properties 文件的使用方法。
我們展示了 YAML 提供了人類友好的功能,它比 properties 文件變體更減少重複並更簡潔。