Le serveur Spring Cloud Config Server permet de centraliser la configuration des applications des différents environnements.
Il peut être utilisé pour n'importe quelle application écrit dans n'importe quelle langage, ce n'est donc pas spécifique aux applications Spring. Cependant, son utilisation est facilitée pour les applications basées sur Spring Boot.
Il est capable de gérer les configurations des environnements de développement, d'intégration, de test jusqu'à la production.
Par défaut, il recherche les fichiers de configuration dans un répertoire situé sur un référentiel de source Git. Mais ceci peut être modifié pour rechercher les fichiers de configuration sur plusieurs référentiels Git. Il peut également rechercher les fichiers de configuration dans le classpath du serveur ou dans un répertoire sur le système de fichiers local au serveur de configuration.
En cas de modification d'un fichier sur le repository Git, cette modification sera prise en compte à la prochaine requête sur le serveur de configuration sans avoir besoin de redémarrer le serveur de configuration.
Les mots de passe et autres données sensibles peuvent être encryptées afin d'éviter de stocker les mots de passe en clair dans les fichiers de configuration sur le serveur de configuration.
Nous aurons à ajouter un fichier
bootstrap.yml
dans l'application cliente afin qu'elle recherche la configuration sur le serveur de configuration.Documentation : http://cloud.spring.io/spring-cloud-config/spring-cloud-config.html
Création du serveur Spring Cloud Config Server
Nous créons une nouvelle application basée sur Spring Boot :
- Aller sur le site Spring Initializr:
- http://start.spring.io/
- Renseigner les informations du projet avec comme nom "spring-config-server" par exemple
- Ne pas sélectionner de dépendances
- Cliquer sur "Generate project" pour télécharger le projet basé sur Spring Boot
- Dézipper le projet
- Dans le fichier pom.xml, remplacer le parent et ajouter la dépendance suivants :
- Créer la classe
Application.java
avec l'annotation@EnableConfigServer
: - Créer le fichier
src/main/resources/application.yml
: - en indiquant l'URL vers le repo Git contenant les fichiers de configuration ".properties" ou ".yml"
- Démarrer le serveur de configuration:
mvn spring-boot:run
Fichiers de configuration sur Git
Sur le repository Github, nous avons les trois fichiers de configuration suivants:back.properties
: fichier de configuration commun à tous les environnementsback-dev.properties
: fichier de configuration spécifique à l'environnement de développementback-integ.properties
: fichier de configuration spécifique à l'environnement d'intégration
Tester la récupération de la configuration
Nous testons que nous récupérons bien la configuration en fonction de l'environnement :Environnement de développement
- Aller sur la page suivante pour récupérer la configuration en développement:
- http://localhost:8888/back/dev
- Le serveur retourne le contenu des deux fichiers de configuration
back.properties
etback-dev.properties
{ "name":"dev", "label":"", "propertySources":[ { "name":"https://github.com/lchaboud/springcloudconfig/back-dev.properties", "source":{ "name":"myapp-dev" } }, { "name":"https://github.com/lchaboud/springcloudconfig/back.properties", "source":{ "name":"myapp" } } ] }
Environnement d'intégration
- Aller sur la page suivante pour récupérer la configuration en intégration:
- http://localhost:8888/back/integ
- Le serveur retourne le contenu des deux fichiers de configuration
back.properties
etback-integ.properties
{ "name":"integ", "label":"", "propertySources":[ { "name":"https://github.com/lchaboud/springcloudconfig/back-integ.properties", "source":{ "name":"myapp-integ" } }, { "name":"https://github.com/lchaboud/springcloudconfig/back.properties", "source":{ "name":"myapp" } } ] }
Environnement de production
- Aller sur la page suivante pour récupérer la configuration en production:
- http://localhost:8888/back/prod
- Le serveur retourne uniquement le contenu du fichier de configuration
back.properties
{ "name":"prod", "label":"", "propertySources":[ { "name":"https://github.com/lchaboud/springcloudconfig/back.properties", "source":{ "name":"myapp" } } ] }
Application cliente
Récupérer la configuration depuis le serveur de configuration
Nous allons configurer une application basée sur Spring Boot afin qu'elle récupère son paramétrage depuis le serveur de configuration Spring Cloud Config Server.
Ajouter le fichier bootstrap.yml
dans le répertoiresrc/main/resources
du projet:
spring: application: name: back profiles: active: integration platform: config: uri: ${vcap.services.${PREFIX:}configserver.credentials.uri:http://user:password@localhost:8888} encrypt: failOnError: false, avec:
back
: le nom de l'application, correspond au nom du fichier de configuration dans le serveur de configurationintegration
: le nom du profil du fichier de configuration dans le serveur de configuration qui correspond au nom de l'environnementhttp://user:paswword@localhost:8888
: URL vers le serveur de configuration
Nous voyons que :
- le profil
integration
est actif sur l'application - les deux fichiers de configuration
back.properties
etback-integration.properties
sont récupérés par l'application.
Nous pouvons tester que les paramètres du fichiers de configuration
Ceci indique bien que les propriétés du fichier de configuration back-integration.properties
écrasent ceux du fichier back.properties
en ajoutant un service REST de test qui retourne la propriété name
issue des fichiers de configuration:
- Ajouter le contrôleur REST
TestControler.java
: - Redémarrer l'application
- Aller sur la page suivante:
- Cette page retourne la valeur de la propriété de configuration "name":
myapp-integ
back-integration.properties
sur ceux du fichier de configuration back.properties
.En effet,
back.properties
contient les propriétés communes à tous les profils pour l'application back
, alors que back-integration.properties
s'applique uniquement au profil integration
.
Spécifier le profil au démarrage de l'application cliente
Nous avons spécifié le nom du profil dans le fichierbootstrap.yml
.Cependant, il est possible de spécifier le profil au démarrage de l'application basée sur Spring Boot via l'argument
--spring.profiles.active=
:- Effectuer la packaging de l'application:
mvn package
java target/back-0.1.jar --spring.profiles.active=development, avec :
back-0.1.jar
: le nom du jar construit par Mavendevelopment
: le nom du profil à appliquer dans l'environnment
- => Nous voyons que le profil actif est maintenant
developement
- Le service REST de test (http://localhost:8080/test retourne maintenant la valeur
myapp-dev
pour la propriéténame
:
Conclusion
Nous voyons que la mise en place d'un serveur de configuration Spring Cloud Config Server et la configuration d'une application basée sur Spring Boot est simple.
Ceci permet de centraliser la configuration des applications afin de simplifier le déploiement sur les différents environnement. Nous n'avons plus qu'à spécifier le nom du profil dans la ligne de commande de démarrage de l'application.
Nous pouvons gérer l'ensemble des fichiers de configurations des différents environnements à partir d'un repo Git unique.
Il reste à :
Ceci permet de centraliser la configuration des applications afin de simplifier le déploiement sur les différents environnement. Nous n'avons plus qu'à spécifier le nom du profil dans la ligne de commande de démarrage de l'application.
Nous pouvons gérer l'ensemble des fichiers de configurations des différents environnements à partir d'un repo Git unique.
Il reste à :
- mettre en place le chiffrement des données sensibles dans les fichiers de configuration comme les mots de passe.
- ajouter l'authentification au niveau du serveur de configuration.
Références
- Spring Cloud : documentation
- Spring Cloud Config Server : documentation