Spring YAML versus eigenschappen

1. Inleiding

YAML is een mensvriendelijke notatie die wordt gebruikt in configuratiebestanden. Waarom zouden we deze dataserialisatie verkiezen boven het eigenschappenbestand in Spring Boot? Naast leesbaarheid en vermindering van herhaling, is YAML de perfecte taal om Configuratie als Code voor de implementaties te schrijven.

Op dezelfde manier vergemakkelijkt het gebruik van YAML voor Spring DevOps de opslag van de configuratievariabelen in de omgeving, zoals de 12 Factor Authenticator aanbeveelt.

In deze tutorial vergelijken we Spring YAML met het eigenschappenbestand om de belangrijkste voordelen van het gebruik van de ene boven de andere te bekijken. Maar onthoud dat de selectie van YAML boven de configuratie van eigenschappenbestanden soms een beslissing van persoonlijke smaak is.

2. YAML-notatie

YAML staat voor een recursief acroniem voor "YAML is geen opmaaktaal“. Het biedt de volgende kenmerken:

  • Meer duidelijkheid en mensvriendelijkheid
  • Perfect voor hiërarchische configuratiegegevens
  • Het ondersteunt verbeterde mogelijkheden zoals kaarten, lijsten en scalaire typen

Die mogelijkheden maken YAML de perfecte metgezel voor Spring-configuratiebestanden. Een woord van waarschuwing hier voor degenen die beginnen met YAML: het schrijven kan in het begin een beetje vervelend zijn vanwege de inspringingsregels.

Laten we eens kijken hoe het werkt!

3. Spring YAML-configuratie

Zoals vermeld in de vorige secties, is YAML een buitengewoon gegevensformaat voor configuratiebestanden. Het is veel beter leesbaar en biedt verbeterde mogelijkheden ten opzichte van het eigenschappenbestand. Daarom is het zinvol om deze notatie aan te bevelen boven de configuratie van het eigenschappenbestand. Bovendien is YAML vanaf versie 1.2 een superset van JSON.

Bovendien overschrijven in het voorjaar de configuratiebestanden die buiten het artefact zijn geplaatst, die in de verpakte pot. Een ander interessant kenmerk van de Spring-configuratie is de mogelijkheid om tijdens runtime omgevingsvariabelen toe te wijzen. Dit is uitermate belangrijk voor DevOps-implementaties.

Veerprofielen maken het mogelijk om de omgevingen te scheiden en verschillende eigenschappen toe te passen. YAML voegt de mogelijkheid toe om meerdere profielen in hetzelfde bestand op te nemen.

Opmerking: deze functie wordt ook ondersteund voor eigenschappenbestanden met Spring Boot 2.4.0.

In ons geval hebben we er voor implementatiedoeleinden drie: testen, ontwikkelen en produceren:

spring: profiles: active: - test --- spring: config: activated: on-profile: test naam: test-YAML omgeving: testservers: - www.abc.test.com - www.xyz.test.com - - spring: config: activated: on-profile: prod name: prod-YAML-omgeving: productieservers: - www.abc.com - www.xyz.com --- spring: config: activated: on-profile: dev name: $ {DEV_NAME: dev-YAML} -omgeving: ontwikkelingsservers: - www.abc.dev.com - www.xyz.dev.com

Opmerking: als we een Spring Boot-versie vóór 2.4.0 gebruiken, moeten we de lente.profielen eigenschap in plaats van de spring.config.activate.on-profile we gebruikten hier.

Laten we nu eens kijken naar het spring.profiles.active eigenschap die de testomgeving standaard toewijst. We kunnen het artefact opnieuw implementeren met verschillende profielen zonder de broncode opnieuw te bouwen.

Een andere interessante functie in Spring is dat je het profiel kunt inschakelen via de omgevingsvariabele:

exporteren SPRING_PROFILES_ACTIVE = dev

We zullen de relevantie van deze omgevingsvariabele zien in de sectie Testen. Ten slotte kunnen we YAML-eigenschappen configureren die rechtstreeks de waarde uit de omgeving toewijzen:

naam: $ {DEV_NAME: dev-YAML}

We kunnen zien dat als er geen omgevingsvariabele is geconfigureerd, een standaardwaarde dev-YAML is gebruikt.

4. Vermindering van herhaling en leesbaarheid

De hiërarchische structuur van YAML biedt manieren om de bovenste niveaus van het configuratie-eigenschappenbestand te verkleinen. Laten we de verschillen bekijken met een voorbeeld:

component: idm: url: myurl gebruiker: gebruiker wachtwoord: wachtwoord beschrijving:> dit zou een lange beschrijving moeten zijn service: url: myurlservice token: token beschrijving:> dit zou een andere lange beschrijving moeten zijn

Dezelfde configuratie zou overbodig worden door het eigenschappenbestand te gebruiken:

component.idm.url = myurl component.idm.user = gebruikerscomponent.idm.password = wachtwoord component.idm.description = dit zou een lange \ beschrijving component.service.url = myurlservice component.service.token = tokencomponent moeten zijn. service.description = dit zou een andere lange \ omschrijving moeten zijn

De hiërarchische aard van YAML verbetert de leesbaarheid aanzienlijk. Het is niet alleen een kwestie van het vermijden van herhalingen, maar ook de goed gebruikte inspringing beschrijft perfect waar de configuratie over gaat en waarvoor. Met YAML is het, net als in het geval van een eigenschappenbestand met een backslash \, mogelijk om de inhoud op te splitsen in meerdere regels met > karakter.

5. Lijsten en kaarten

We kunnen lijsten en kaarten configureren met behulp van YAML en het eigenschappenbestand.

Er zijn twee manieren om waarden toe te wijzen en in een lijst op te slaan:

servers: - www.abc.test.com - www.xyz.test.com extern: [www.abc.test.com, www.xyz.test.com]

Beide voorbeelden geven hetzelfde resultaat. De equivalente configuratie met eigenschappenbestand zou moeilijker te lezen zijn:

servers [0] = www.abc.test.com servers [1] = www.xyz.test.com extern = www.abc.test.com, www.xyz.test.com

Nogmaals, de YAML-versie is beter leesbaar en duidelijker.

Op dezelfde manier kunnen we kaarten configureren:

map: firstkey: key1 secondkey: key2

6. Testen

Laten we nu eens kijken of alles werkt zoals verwacht. Als we de logging van de applicatie controleren, kunnen we zien dat de standaard geselecteerde omgeving test:

2020-06-11 13: 58: 28.846 INFO 10720 --- [main] com.baeldung.yaml.MyApplication: ... omgeving gebruiken: testnaam: test-YAML-servers: [www.abc.test.com, www .xyz.test.com] extern: [www.abc.test.com, www.xyz.test.com] kaart: {firstkey = key1, secondkey = key2} Idm: Url: myurl Gebruiker: gebruiker Wachtwoord: wachtwoord Beschrijving: dit zou een lange beschrijving moeten zijn Service: Url: myurlservice Token: token Beschrijving: dit zou een andere lange beschrijving moeten zijn

We kunnen de naam overschrijven door te configureren DEV_NAME in het milieu:

export DEV_NAME = new-dev-YAML

We kunnen zien dat de naam van de omgeving verandert door de applicatie uit te voeren met dev-profiel:

2020-06-11 17: 00: 45.459 INFO 19636 --- [main] com.baeldung.yaml.MyApplication: ... met omgeving: ontwikkelingsnaam: nieuwe-dev-YAML-servers: [www.abc.dev.com , www.xyz.dev.com]

Laten we rennen voor de productieomgeving met SPRING_PROFILES_ACTIVE = prod:

export SPRING_PROFILES_ACTIVE = prod 2020-06-11 17: 03: 33.074 INFO 20716 --- [hoofd] ... met omgeving: productienaam: prod-YAML-servers: [www.abc.com, www.xyz.com]

7. Conclusie

In deze tutorial hebben we de fijne kneepjes beschreven van het gebruik van de YAML-configuratie in vergelijking met het eigenschappenbestand.

Dat hebben we laten zien YAML biedt mogelijkheden voor menselijke vriendelijkheid, het vermindert herhaling en is beknopter dan de variant van het eigenschappenbestand.

Zoals altijd is de code beschikbaar op GitHub.