1. введение
YAML-это удобная для человека нотация, используемая в файлах конфигурации . Почему мы предпочли бы эту сериализацию данных файлу свойств в Spring Boot ? Помимо удобочитаемости и уменьшения повторяемости, YAML является идеальным языком для написания конфигурации в качестве кода для развертывания.
Точно так же использование YAML для Spring DevOps облегчает хранение переменных конфигурации в среде, как рекомендует 12-факторный аутентификатор|/.
В этом уроке мы сравним Spring YAML с файлом свойств, чтобы проверить основные преимущества использования одного над другим. Но помните, что выбор YAML вместо конфигурации файла свойств иногда является решением личного вкуса.
2. Нотация YAML
YAML расшифровывается как рекурсивная аббревиатура для ” YAML Это не Язык разметки “. Он обеспечивает следующие характеристики:
- Больше ясности и дружелюбия к людям
- Идеально подходит для иерархических конфигурационных данных
- Он поддерживает расширенные возможности, такие как карты, списки и скалярные типы
Эти возможности делают YAML идеальным компаньоном для файлов конфигурации Spring . Слово предостережения здесь для тех, кто начинает с YAML: написание его может быть немного утомительным в начале из-за его отступов правил.
Давайте посмотрим, как это работает!
3. Конфигурация пружинного ЯМЛА
Как уже упоминалось в предыдущих разделах, YAML-это необычный формат данных для файлов конфигурации. Он гораздо более удобочитаем и предоставляет расширенные возможности по сравнению с файлом свойств. Поэтому имеет смысл рекомендовать эту нотацию поверх конфигурации файла свойств. Кроме того, начиная с версии 1.2, YAML является надмножеством JSON.
Кроме того, весной файлы конфигурации, размещенные вне артефакта, переопределяют файлы внутри упакованной банки . Еще одной интересной особенностью конфигурации Spring является возможность назначать переменные среды во время выполнения. Это чрезвычайно важно для развертывания DevOps.
Пружинные профили позволяют разделять среды и применять к ним различные свойства. 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.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
Мы можем перезаписать имя, настроив DEV_NAME в среде:
export DEV_NAME=new-dev-YAML
Мы видим, что имя среды изменяется при выполнении приложения с профилем разработчика:
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]
Давайте запустим для производственной среды, используя 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 .