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 .