Spring YAML срещу Properties

1. Въведение

YAML е удобна за човека нотация, използвана в конфигурационни файлове . Защо бихме предпочели тази сериализация на данни пред файла със свойства в Spring Boot? Освен четливостта и намаляването на повторението, YAML е идеалният език за писане на конфигурацията като код за разполаганията.

По същия начин, използването на YAML за Spring DevOps улеснява съхранението на променливите на конфигурацията в околната среда, както препоръчва 12 Factor Authenticator.

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

2. YAML нотация

YAML означава рекурсивна абревиатура за „ YAML Ain't Markup Language “. Той предоставя следните характеристики:

  • Повече яснота и удобство за хората
  • Перфектен за йерархични конфигурационни данни
  • Той поддържа подобрени възможности като карти, списъци и скаларни типове

Тези възможности правят YAML идеалният спътник за конфигурационни файлове на Spring . Тук е една предпазлива дума за тези, които започват с YAML: писането му може да бъде малко досадно в началото поради правилата за отстъп.

Да видим как работи!

3. Пролетна YAML конфигурация

Както беше споменато в предишните раздели, 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, което присвоява тестовата среда по подразбиране. Можем да преразпределим артефакта, като използваме различни профили, без да изграждаме отново изходния код.

Друга интересна функция през пролетта е, че можете да активирате профила чрез променливата на околната среда:

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

Виждаме, че името на средата се променя при изпълнение на приложението с dev профил:

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.