Рубрики
Без рубрики

Весенний ЯМЛ против свойств

Сравните использование Spring YAML с файлом свойств.

Автор оригинала: baeldung.

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 .