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