1.概述
YAML是在配置文件中使用的人性化表示法。 为什么在Spring Boot中,我们更喜欢这种数据序列化而不是属性文件? 除了可读性和减少重复之外,YAML是将Configuration as Code编写为部署的理想语言。
以同样的方式,将YAML用于Spring DevOps有助于12因子身份验证器建议的环境中配置变量的存储。
接下来,将比较Spring YAML和Properties文件,以检查使用它们之间的主要优点。 但是请记住,选择YAML而非属性文件配置有时是个人喜好的决定。
2.YAML表示法
YAML代表“ YAML不是标记语言”的递归首字母缩写。 它具有以下特征:
- 更清晰,更人性化
- 非常适合分层配置数据
- 它支持增强功能,例如Map,List和scalar类型
这些功能使YAML成为Spring配置文件的完美伴侣。 在这里,对于那些以YAML开头的人来说要小心一点:由于其缩进规则,编写它在一开始可能会有些乏味。
3.Spring YAML配置
YAML是一种用于配置文件的特殊数据格式。 它更具可读性,并且在属性文件上提供了增强的功能。 因此,在属性文件配置上推荐这种表示法是有意义的。 此外,从1.2版开始,YAML是JSON的超集。
Spring配置文件允许分离环境并对其应用不同的属性。 YAML增加了在同一文件中包含多个配置文件的可能性。
注意:Spring Boot 2.4.0的属性文件也支持此功能。
在案例中,出于部署目的,我们将有三个:测试,开发和生产:
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
注意:如果我们使用的是2.4.0之前的Spring Boot版本,则应该使用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 \
description
YAML的分层性质极大地增强了可读性。 这不仅是避免重复的问题,而且是很好使用的缩进,它完美地描述了配置的含义和用途。 使用YAML,就像带有反斜杠\的属性文件一样,可以使用>字符将内容分成多行。
5. Lists和Maps
可以使用YAML和Properties文件配置list和map。
有两种方法可以分配值并将它们存储在列表中:
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:
map:
firstkey: key1
secondkey: key2