YAML是用于配置文件的人性化表示法。为什么相比Spring Boot中的属性文件Properties,我们更喜欢这种数据序列化?除了可读性和减少重复之外,YAML是在部署时Configuration as Code(配置即编程)的理想语言。
如12因子身份验证器建议的那样,将YAML用于Spring DevOps有助于在环境中存储配置变量。
在本教程中,我们将比较Spring YAML和属性文件,以检查使用它们之间的主要优点。但是请记住,选择YAML而非属性文件配置有时是个人喜好的决定。
YAML代表“ YAML Ain't Markup Language” 的递归首字母缩写。它具有以下特征:
- 更清晰,更人性化
- 非常适合分层配置数据
- 它支持增强功能,例如地图,列表和标量类型
这些功能使YAML成为Spring配置文件的完美伴侣。在这里,对于那些以YAML开头的人来说要小心一点:由于其缩进规则,一开始编写它可能有点乏味。
让我们看看它是如何工作的!
YAML是一种用于配置文件的特殊数据格式。它更具可读性,并且在属性文件上提供了增强的功能。因此,在属性文件配置上推荐这种表示法是有意义的。此外,从1.2版开始,YAML是JSON的超集。
Spring配置文件允许分离环境并对其应用不同的属性。YAML增加了在同一文件中包含多个配置文件的可能性。
在我们的案例中,出于部署目的,我们将有三个:测试test,开发dev和生产prod:
spring:
profiles:
active:
- test
---
spring:
profiles: test
name: test-YAML
environment: testing
servers:
- www.abc.test.com
- www.xyz.test.com
---
spring:
profiles: prod
name: prod-YAML
environment: production
servers:
- www.abc.com
- www.xyz.com
---
spring:
profiles: dev
name: ${DEV_NAME:dev-YAML}
environment: development
servers:
- www.abc.dev.com
- www.xyz.dev.com
|
现在让我们检查spring.profiles.active属性,该属性默认情况下分配测试环境。我们可以使用不同的配置文件重新部署工件,而无需再次构建源代码。
Spring的另一个有趣功能是您可以通过环境变量启用配置文件:
export SPRING_PROFILES_ACTIVE=dev
|
可以配置YAML属性,直接从环境中分配值:
name: ${DEV_NAME:dev-YAML}
|
我们可以看到,如果未配置任何环境变量,则使用默认值test-YAML。
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和属性文件配置列表,有两种方法可以分配值并将它们存储在列表中:
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
|