Spring YAML vs Propriétés

1. Introduction

YAML est une notation conviviale utilisée dans les fichiers de configuration . Pourquoi préférerions-nous cette sérialisation des données au fichier de propriétés dans Spring Boot? Outre la lisibilité et la réduction de la répétition, YAML est le langage idéal pour écrire la configuration en tant que code pour les déploiements.

De la même manière, l'utilisation de YAML pour Spring DevOps facilite le stockage des variables de configuration dans l'environnement comme le recommande le 12 Factor Authenticator.

Dans ce tutoriel, nous comparerons Spring YAML au fichier de propriétés afin de vérifier les principaux avantages de l'utilisation de l'un par rapport à l'autre. Mais rappelez-vous, la sélection de YAML sur la configuration du fichier de propriétés est parfois une décision de goût personnel.

2. Notation YAML

YAML signifie un acronyme récursif pour « YAML Ain't Markup Language ». Il présente les caractéristiques suivantes:

  • Plus de clarté et de convivialité
  • Parfait pour les données de configuration hiérarchiques
  • Il prend en charge des fonctionnalités améliorées telles que les cartes, les listes et les types scalaires

Ces capacités font de YAML le compagnon idéal des fichiers de configuration Spring . Un mot d'avertissement ici pour ceux qui débutent avec YAML: l'écrire peut être un peu fastidieux au début en raison de ses règles d'indentation.

Voyons voir comment ça fonctionne!

3. Configuration Spring YAML

Comme il a été mentionné dans les sections précédentes, YAML est un format de données extraordinaire pour les fichiers de configuration. Il est beaucoup plus lisible et offre des fonctionnalités améliorées sur le fichier de propriétés. Par conséquent, il est logique de recommander cette notation sur la configuration du fichier de propriétés. De plus, à partir de la version 1.2, YAML est un sur-ensemble de JSON.

De plus, dans Spring, les fichiers de configuration placés à l'extérieur de l'artefact remplacent ceux à l'intérieur du fichier jar emballé. Une autre fonctionnalité intéressante de la configuration Spring est la possibilité d'attribuer des variables d'environnement au moment de l'exécution. Ceci est extrêmement important pour les déploiements DevOps.

Les profils à ressort permettent de séparer les environnements et de leur appliquer différentes propriétés. YAML ajoute la possibilité d'inclure plusieurs profils dans le même fichier.

Remarque: cette fonctionnalité est également prise en charge pour les fichiers de propriétés avec Spring Boot 2.4.0.

Dans notre cas, à des fins de déploiement, nous en aurons trois: test, développement et production:

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

Remarque: si nous utilisons une version Spring Boot antérieure à 2.4.0, nous devrions utiliser la propriété spring.profiles au lieu du spring.config.activate.on-profile que nous avons utilisé ici.

Vérifions maintenant la propriété spring.profiles.active qui affecte l'environnement de test par défaut. Nous pouvons redéployer l'artefact en utilisant différents profils sans reconstruire le code source.

Une autre fonctionnalité intéressante de Spring est que vous pouvez activer le profil via la variable d'environnement:

export SPRING_PROFILES_ACTIVE=dev

Nous verrons la pertinence de cette variable d'environnement dans la section Test. Enfin, nous pouvons configurer les propriétés YAML en attribuant directement la valeur de l'environnement:

name: ${DEV_NAME:dev-YAML}

Nous pouvons voir que si aucune variable d'environnement n'est configurée, une valeur par défaut dev-YAML est utilisée.

4. Réduction de la répétition et de la lisibilité

La structure hiérarchique de YAML permet de réduire les niveaux supérieurs du fichier de propriétés de configuration . Voyons les différences avec un exemple:

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 même configuration deviendrait redondante en utilisant le fichier de propriétés:

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 nature hiérarchique de YAML améliore considérablement la lisibilité . Il ne s'agit pas seulement d'éviter les répétitions mais aussi l'indentation, bien utilisée, décrit parfaitement en quoi consiste la configuration et à quoi elle sert. Avec YAML, comme dans le cas d'un fichier de propriétés avec une barre oblique inverse \, il est possible de diviser le contenu en plusieurs lignes avec le caractère > .

5. Listes et cartes

Nous pouvons configurer des listes et des cartes en utilisant YAML et le fichier de propriétés .

Il existe deux façons d'attribuer des valeurs et de les stocker dans une liste:

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

Les deux exemples donnent le même résultat. La configuration équivalente utilisant le fichier de propriétés serait plus difficile à lire:

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

Encore une fois, la version YAML est plus lisible et plus claire.

De la même manière, nous pouvons configurer des cartes:

map: firstkey: key1 secondkey: key2

6. Test

Maintenant, vérifions si tout fonctionne comme prévu. Si nous vérifions la journalisation de l'application, nous pouvons voir que l'environnement sélectionné par défaut est en test:

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

Nous pouvons écraser le nom en configurant DEV_NAME dans l'environnement:

export DEV_NAME=new-dev-YAML

Nous pouvons voir que le nom de l'environnement change en exécutant l'application avec le profil de développement:

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]

Exécutons pour l'environnement de production en utilisant 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. Conclusion

Dans ce tutoriel, nous avons décrit les subtilités de l'utilisation de la configuration YAML par rapport au fichier de propriétés.

Nous avons montré que YAML offre des capacités de convivialité humaine, réduit les répétitions et est plus concis que sa variante de fichier de propriétés .

Comme toujours, le code est disponible sur sur GitHub.