Cet article s’insère dans la série « microservices » écrite par François Berthault dans le cadre de la participation de Talan Labs à Devoxx 2017, du 5 au 7 avril prochains au Palais des Congrès de Paris.
Maintenant que l'architecture en microservices n’a plus de mystère pour vous, nous pouvons nous intéresser à son implémentation. Et comme nous l’avons vu dans un article précédent, il existe de** nombreux frameworks** parmi lesquels vous pouvez faire votre choix. Si par exemple vous ne jurez que par Guice, Dropwizard est fait pour vous. Spring Boot reste tout de même la meilleure solution. C’est le projet qui a rendu à Spring sa simplicité d’origine (et sans XML).
Si votre ordinateur est équipé d’un JDK8 et d’un Maven3 (ou d’un Gradle), alors vous êtes prêt !
Spring fournit un site de configuration automatique start.spring.io pour les développeurs Java, Groovy ou Kotlin pressés. Mais prenons le temps d’analyser les éléments qui composent un microservice Spring Boot.
Pour rappel, le framework Spring est un conteneur dit léger qui permet d’obtenir une infrastructure similaire à celle d’un serveur d’application Java EE plus lourd. Spring Boot est un framework qui permet d’obtenir une application Spring (microservice) avec un minimum d’effort.
Le point de départ est le “modèle objet projet” (appelé POM pour Project Object Model). Il contient une description détaillée de votre projet. La solution la plus simple est un héritage de la dépendance “spring-boot-starter-parent”. Seulement, vous n’aviez pas l’intention de réserver cette place unique et privilégiée à Spring Boot, votre équipe possède certainement déjà son “parent pom”. Pas de panique, Spring a pensé à tout !
Spring, Jersey et d’autres projets commencent à utiliser ce procédé d'import de dépendance. Cette utilisation d’un BOM (pour Bill Of Materials) permet d’ajouter une dépendance de type POM dans le scope import de Maven. Cette fonctionnalité mal connue est pourtant présente depuis 2008.
La magie de Spring Boot réside dans le packaging de votre application. C’est par défaut un jar “self-contained” (jar exécutable contenant l’ensemble des dépendances de l’application - aussi appelé “fat jar”). Le package est effectué par le plugin Maven “spring-boot-maven-plugin”.
Le projet Spring Boot fournit un ensemble de starters (plus de 150 sont disponibles sur start.spring.io). Un starter est un kit de dépendances auto-configurables. Ajouter la dépendance à “spring-boot-starter-web” et votre projet devient un mini-serveur Tomcat auto-porté dans votre jar, pouvant également exposer des ressources REST, sans la moindre configuration.
Et si vous ne voulez pas de Tomcat et que votre serveur d’application préféré est Jetty, une simple exclusion de la dépendance “spring-boot-starter-tomcat”, l’ajout de** “spring-boot-starter-jetty”** et le tour est joué.
Subtilement placée dans le plus petit sous-package du code, la classe principale annotée uniquement @SpringBootApplication va automatiquement scruter vos dépendances et activer toutes les fonctionnalités présentes. Dans l’exemple, la présence de “spring-boot-starter-web”, activera et configurera les briques de base de Spring-Core (dont le “scan-package”), Tomcat et JAX-RS (pour la partie REST). Cela fonctionne également pour tous les autres starters de spring-boot (du moins si votre classe principale est bien placée).
**“Convention over Configuration” **__@SpringBoot’s Team
“Spring-mvc” est l’implémentation par défaut de JAX-RS. Ajoutez la dépendance “spring-boot-starter-jersey”, si vous préférez celle de Jersey.
L’ensemble des propriétés sont disponibles sur l'Appendix Spring BOOT. La liste est longue, n’ajoutez dans votre projet que les propriétés dont vous voulez surcharger les valeurs par défaut.
Et voilà, votre microservice a démarré.
Actuator vous permet de monitorer et d’interagir avec votre application. Il ajoute :
des endpoints comme :
* **/health** : les informations sur l'état de santé,
* **/info** : la description de votre application (nom, version, commit, ...),
* **/env** : les valeurs des propriétés spring,
* **/logfile** : pour voir les dernières logs dans votre navigateur web par exemple (qu'il est pratique de ne plus se connecter sur le serveur et d'ouvrir le bon fichier log),
* des métriques sur les requêtes HTTP et sur l'état de la JVM ...
des outils de monitoring comme ApplicationPidFileWriter qui créé un fichier contenant le PID de l’application (très utile pour vos OPS) et son équivalent pour le port d’exécution EmbeddedServerPortFileWriter.
Et si vous ne voulez pas l’exposer en REST, Spring Boot vous le permet aussi en Telnet, en JMX et en SSH.
Spring Boot vous fournira un kit complet de gestion des logs (dépendances et configuration de logback) pour aller directement en production. Si votre équipe est « DevOps », que vous indexez vos fichiers de logs afin de les exploiter, Spring ne vous a pas oubliez. L’intégration avec des outils comme Splunk ou ELK (ElasticSearch, Logstash et Kibana) a été mis en place.
Cet outil vous permettra de redémarrer automatiquement votre application à chacune des modifications de votre code pendant la phase de développement. Que de temps autrefois perdu à redémarrer son serveur.
L’idéal serait maintenant d’avoir un script de démarrage (start/stop/status) afin d’éviter les commandes disgracieuses de type “java –jar” et “kill -1” pour stopper notre service. Spring a encore pensé à tout puisqu’il package le jar avec un lanceur !
La variable **“server.port” **du fichier de configuration “application.yml” a ainsi été surchargée par une variable d’environnement.
À l’aide d’un simple plugin Maven…
…et d’un Dockerfile ! Votre application se transformera en une image Docker prête à l’emploi.
``Il ne reste plus qu’à lancer votre image….
Quand une développeur et un sysadmin discute
L’outillage de Spring Boot est vraiment impressionnant et comporte de nombreuses autres fonctionnalités comme l’intégration de Flyway, d'Elastic Search, de MongoDB, de Kafka, de la sécurité, du projet** Spring Data JPA**, de l'Hateoas, de Logstash et de très nombreux autres.
L’expérience et la maturité de l’éco-système Spring fait ses preuves. Au niveau de la dynamique, des projets et des versions, rien à redire, l’outil est très vivant. D’ailleurs, on attend spring-boot 2.0 en version RELEASE pour bientôt !
Prochaine étape : Spring Cloud !
© Ryan Baxter : ryanjbaxter.com
Vous avez aimé cet article ? Découvrez ou redécouvrez les autres épisodes de la série « Les microservices pour une architecture orientée web » :
_Partie 1 _Les microservices pour une architecture orientée web n°1 : Définitions et caractéristiques
_Partie 2 _Les microservices pour une architecture orientée web n°2 : Un changement de point de vue