Simple comme Spring Boot

Cet article s’insère dans la série « microservices » écrite par François Berthault dans le cadre de la participation de TalanLabs à 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).

Spring Boot : le super couteau suisse

spring-boot-project-logoSi 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.

« POM », « BOM » et dépendances

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 ».
code1Seulement, 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 !

code2

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.

Make JAR not WAR

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 ».

code3

Les starters

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.

code4

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é.

Création d’une application microservice avec Spring Boot

Une classe main

code5

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

Un controller REST

code6

« 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.

Adieu les fichiers XML, bonjour « application.yml »

code7

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.

3, 2, 1 … compilez, packagez et lancez vous !

code8

Et voilà, votre microservice a démarré.

code14

Quelques Features indispensables

Actuator

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.

La gestion des logs

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.

Spring Boot DevTools

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.

Et le jar se transforma en un bash…

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 !

code10

La variable « server.port » du fichier de configuration « application.yml » a ainsi été surchargée par une variable d’environnement.

Même Docker est prévu

À l’aide d’un simple plugin Maven

code11

…et d’un Dockerfile ! Votre application se transformera en une image Docker prête à l’emploi.

code12

Il ne reste plus qu’à lancer votre image….

code13

Quand une développeur et un sysadmin discute ...

Quand une développeur et un sysadmin discute

Spring Boot : un outil simple, parfait pour créer des microservices

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 !

Spring Boot : un outil simple, parfait pour créer des microservices

© 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

Partie 3   Les microservices pour une architecture orientée web n°3 : Organisation des équipes pour une projet d’architecture en microservices

Développeur Full-Stack depuis 2002, Je suis un "Java Web Devops Coding Architect". et Je prêche "Architecture as Code" !