Spring YAML vs Proprietà

1. Introduzione

YAML è una notazione a misura d'uomo usata nei file di configurazione . Perché preferiremmo questa serializzazione dei dati rispetto al file delle proprietà in Spring Boot? Oltre alla leggibilità e alla riduzione delle ripetizioni, YAML è il linguaggio perfetto per scrivere la configurazione come codice per le distribuzioni.

Allo stesso modo, l'uso di YAML per Spring DevOps facilita l'archiviazione delle variabili di configurazione nell'ambiente come consigliato da 12 Factor Authenticator.

In questo tutorial, confronteremo Spring YAML con il file delle proprietà per verificare i principali vantaggi dell'utilizzo dell'uno rispetto all'altro. Ma ricorda, la selezione di YAML sulla configurazione del file delle proprietà a volte è una decisione di gusto personale.

2. Notazione YAML

YAML sta per un acronimo ricorsivo per " YAML Ain't Markup Language ". Fornisce le seguenti caratteristiche:

  • Più chiarezza e amicizia umana
  • Perfetto per i dati di configurazione gerarchica
  • Supporta funzionalità avanzate come mappe, elenchi e tipi scalari

Queste capacità rendono YAML il compagno perfetto per i file di configurazione Spring . Un avvertimento qui per coloro che iniziano con YAML: scriverlo può essere un po 'noioso all'inizio a causa delle sue regole di rientro.

Vediamo come funziona!

3. Configurazione Spring YAML

Come è stato accennato nelle sezioni precedenti, YAML è uno straordinario formato di dati per i file di configurazione. È molto più leggibile e fornisce funzionalità avanzate sul file delle proprietà. Pertanto, ha senso consigliare questa annotazione sulla configurazione del file delle proprietà. Inoltre, dalla versione 1.2, YAML è un superset di JSON.

Inoltre, in primavera i file di configurazione posti all'esterno dell'artefatto sovrascrivono quelli all'interno del jar confezionato. Un'altra caratteristica interessante della configurazione Spring è la possibilità di assegnare variabili d'ambiente in fase di runtime. Questo è estremamente importante per le distribuzioni DevOps.

I profili delle molle consentono di separare gli ambienti e di applicare loro proprietà differenti. YAML aggiunge la possibilità di includere più profili nello stesso file.

Nota: questa funzione è supportata anche per i file delle proprietà con Spring Boot 2.4.0.

Nel nostro caso, ai fini della distribuzione, avremo tre: test, sviluppo e produzione:

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

Nota: se usiamo una versione Spring Boot precedente alla 2.4.0, dovremmo usare la proprietà spring.profiles invece di spring.config.activate.on-profile che abbiamo usato qui.

Controlliamo ora la proprietà spring.profiles.active che assegna l'ambiente di test per impostazione predefinita. Possiamo ridistribuire l'artefatto utilizzando diversi profili senza ricostruire il codice sorgente.

Un'altra caratteristica interessante di Spring è che puoi abilitare il profilo tramite la variabile d'ambiente:

export SPRING_PROFILES_ACTIVE=dev

Vedremo la rilevanza di questa variabile d'ambiente nella sezione Test. Infine possiamo configurare le proprietà YAML assegnando direttamente il valore dall'ambiente:

name: ${DEV_NAME:dev-YAML}

Possiamo vedere che se non è configurata alcuna variabile di ambiente, viene utilizzato un valore predefinito dev-YAML .

4. Riduzione della ripetizione e della leggibilità

La struttura gerarchica di YAML fornisce modi per ridurre i livelli superiori del file delle proprietà di configurazione . Vediamo le differenze con un esempio:

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

La stessa configurazione diventerebbe ridondante utilizzando il file delle proprietà:

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

La natura gerarchica di YAML migliora notevolmente la leggibilità . Non si tratta solo di evitare ripetizioni ma anche il rientro, ben utilizzato, descrive perfettamente di cosa si tratta e a cosa serve la configurazione. Con YAML, come nel caso del file delle proprietà con una barra rovesciata \, è possibile suddividere il contenuto in più righe con il carattere > .

5. Elenchi e mappe

Possiamo configurare elenchi e mappe utilizzando YAML e il file delle proprietà .

Esistono due modi per assegnare valori e memorizzarli in un elenco:

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

Entrambi gli esempi forniscono lo stesso risultato. La configurazione equivalente che utilizza il file delle proprietà sarebbe più difficile da leggere:

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

Anche in questo caso la versione YAML è più leggibile e chiara.

Allo stesso modo, possiamo configurare le mappe:

map: firstkey: key1 secondkey: key2

6. Test

Ora, controlliamo se tutto funziona come previsto. Se controlliamo il logging dell'applicazione, possiamo vedere che l'ambiente selezionato di default sta testando:

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

Possiamo sovrascrivere il nome configurando DEV_NAME nell'ambiente:

export DEV_NAME=new-dev-YAML

Possiamo vedere che il nome dell'ambiente cambia eseguendo l'applicazione con il profilo 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]

Eseguiamo per l'ambiente di produzione utilizzando 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. Conclusione

In questo tutorial, abbiamo descritto le complessità dell'uso della configurazione YAML rispetto al file delle proprietà.

Abbiamo dimostrato che YAML fornisce funzionalità di amicizia umana, riduce la ripetizione ed è più conciso della sua variante di file delle proprietà .

Come sempre, il codice è disponibile su GitHub.