«1. Введение

YAML — это удобная для человека нотация, используемая в файлах конфигурации. Почему мы предпочитаем эту сериализацию данных файлу свойств в Spring Boot? Помимо удобочитаемости и сокращения повторений, YAML — идеальный язык для написания конфигурации как кода для развертывания.

Точно так же использование YAML для Spring DevOps упрощает хранение переменных конфигурации в среде, как рекомендует 12-факторный аутентификатор.

В этом уроке мы сравним Spring YAML с файлом свойств, чтобы проверить основные преимущества использования одного над другим. Но помните, выбор YAML вместо конфигурации файла свойств иногда является решением личного вкуса.

2. Нотация YAML

YAML расшифровывается как рекурсивная аббревиатура от «YAML не является языком разметки». Он обеспечивает следующие характеристики:

    Больше ясности и удобства для человека. Идеально подходит для иерархических данных конфигурации. Он поддерживает расширенные возможности, такие как карты, списки и скалярные типы.

Эти возможности делают YAML идеальным компаньоном для файлов конфигурации Spring. Предупреждение для тех, кто только начинает работать с YAML: вначале его написание может быть немного утомительным из-за правил отступов.

Посмотрим, как это работает!

3. Конфигурация Spring YAML

Как уже упоминалось в предыдущих разделах, YAML — это необычный формат данных для файлов конфигурации. Он намного удобнее для чтения и предоставляет расширенные возможности по сравнению с файлом свойств. Поэтому имеет смысл рекомендовать эту нотацию вместо конфигурации файла свойств. Кроме того, начиная с версии 1.2, YAML является расширенным набором JSON.

Кроме того, в Spring файлы конфигурации, размещенные вне артефакта, переопределяют файлы внутри упакованного jar. Еще одна интересная особенность конфигурации Spring — возможность назначать переменные среды во время выполнения. Это чрезвычайно важно для развертываний DevOps.

Профили 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

Примечание: если мы используем версию 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 \ 
                              description

Иерархическая природа YAML значительно повышает удобочитаемость. Речь идет не только о том, чтобы избежать повторений, но и о правильном использовании отступа, который прекрасно описывает, что такое конфигурация и для чего она предназначена. С YAML, как и в случае файла свойств с обратной косой чертой \\, можно разбить содержимое на несколько строк с помощью символа \u003e.

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: key2

Таким же образом мы можем настроить карты:

6. Тестирование

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

Теперь давайте проверим, все ли работает как положено. Если мы проверим журнал приложения, мы увидим, что среда, выбранная по умолчанию, является тестовой:

export DEV_NAME=new-dev-YAML

Мы можем перезаписать имя, настроив DEV_NAME в среде:

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]

Мы видим, что среда имя среды изменяется, выполняя приложение с профилем разработчика:

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]

Давайте запустим для рабочей среды, используя SPRING_PROFILES_ACTIVE=prod:

7. Заключение

В этом руководстве мы описали тонкости использование конфигурации YAML по сравнению с файлом свойств.

Мы показали, что YAML обеспечивает удобство для человека, уменьшает количество повторений и является более кратким, чем его вариант файла свойств.