Перейти к основному содержимому

Spring YAML против свойств

· 5 мин. чтения

1. Введение

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

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

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

2. YAML-нотация

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

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

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

Давайте посмотрим, как это работает!

3. Весенняя конфигурация 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, как и в случае файла свойств с обратной косой чертой \, можно разбить содержимое на несколько строк с помощью символа > .

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.foreach.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.foreach.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 по сравнению с файлом свойств.

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

Как всегда, код доступен на GitHub .