Article écrit par Linda Ben Hadj Naceur
Du Monolithe vers les Microservices
L‘architecture monolithe ou les applications dites formées d’un seul bloc, bien qu’ils restent simples à construire, efficaces et performants, on constate leur limite au fur et à mesure que leur taille augmente. On fait part de manque de fiabilité, de mises à jour complexes et de limitation technologique à une seule stack.
Les applications en Microservices, contrairement aux applications monolithiques, sont beaucoup plus souples et plus agiles. Le développeur peut ajouter et modifier des fonctionnalités rapidement et sans risque afin d’assurer des livraisons rapides et continues.
Les Microservices, c’est quoi ?
D’une manière générale, l’architecture Microservices est un assemblage de petites unités au sein d’un système complexe.
Les avantages de cette architecture sont :
- Mise en production plus rapide.
- Des Microservices extensibles et évolutifs facilement.
- La factorisation et la réutilisation des Microservices.
- La résilience.
Caractéristiques de l’architecture Microservices
Des unités fonctionnelles : un Microservice doit représenter une unité fonctionnelle indépendante et autonome.
Modificabilité : la modification d’un Microservice pour une évolution ou une correction n’impacte en rien les autres Microservices. On dit que chaque Microservice s’exécute dans un processus isolé.
Communication à base de messages : les Microservices d’une même application communiquent à base de messages. Il y a la communication synchrone par le biais de l’API REST et la communication asynchrone à base d’évènements, déclenchés et écoutés par les services.
Des services tolérants : l’architecture en Microservices est hautement tolérante aux pannes. Chaque microservice doit prévoir un traitement de secours pour chaque panne possible.
Des objectifs clairs : les équipes s’organisent et se focalisent sur les fonctionnalités métier.
Des services diversifiés : avec une architecture en Microservices, c’est possible d’utiliser des dépendances technologiques différentes tel que le langage de programmation et la base de données.
Les composants de l’architecture en Microservices
API passerelle “API Gateway”:
L’API Gateway présente un point d’entrée unique à l’application. Elle assure la communication entre les clients (Front et services externes) et les Microservices d’une même application.
L’API Gateway permet de renforcer la sécurité, de diminuer le nombre des requêtes entre les applications clientes et les Microservices et d’assurer une haute disponibilité.
Équilibreur de charge “Load Balancer”:
C’est le responsable de router et de répartir la charge entre plusieurs instances disponibles. L’équilibreur de charge utilise aussi le service de découverte pour retrouver l’adresse des services.
Service de découverte “Service Discovery”:
Le service de découverte fonctionne comme un annuaire téléphonique. Chaque Microservice doit renseigner son adresse dynamiquement au moment de son démarrage. Les différents Microservices d’une application peuvent communiquer entre eux en passant par le biais du service de découverte, dans ce cas ils n’ont besoin que de connaître le nom du service demandé. Le Gateway utilise aussi le service de découverte pour découvrir les bonnes adresses et assurer le routage des requêtes externes.
Serveur de configuration “Config Server”:
Le serveur de configuration permet d’externaliser et de centraliser les fichiers de configuration de chaque Microservice. Au moment de son démarrage, un Microservice doit chercher ses propriétés dans le serveur de configuration. L’adresse du serveur de configuration ne peut pas être découverte dynamiquement, elle doit nécessairement être connue à l’avance.
Disjoncteur de circuit “circuit breaker”:
Un circuit Breaker garantit la tolérance aux différentes pannes possibles. Il prépare des scénarios de gestion de pannes par exemple, le renvoyer vers un service alternatif.
La Stack Spring Cloud pour les Microservices
Développement rapide
La configuration d’un projet Spring Cloud se base sur une configuration simple et un démarrage rapide avec Spring Boot.
Intégration
Spring Cloud Config :
Spring Cloud Config permet de gérer la centralisation des fichiers de configuration. Pour cela, il suffit de créer un projet Spring Boot pour le serveur avec la dépendance suivante : spring-cloud-config-server.
Ajouter dans le fichier “application.properties” comment on va récupérer les différents fichiers de configuration: dans mon exemple j’utilise Vault pour les mots de passe et Git pour les autres informations.
Activer le serveur de configuration avec l’annotation @EnableConfigServer dans la classe principale du projet :
Au niveau des applications clientes, on ajoute les deux dépendances suivantes : spring-cloud-starter-config et spring-cloud-starter-bootstrap.
Le starter bootstrap pour dire qu’il faut commencer par lire le fichier bootsrap.yml dans lequel on va préciser l’adresse du serveur de configuration.
Et voilà, maintenant on peut utiliser le serveur de configuration.
Spring Cloud Netflix-Eureka :
Spring Cloud Netflix-Eureka facilite l’intégration du service de découverte Eureka de Netflix. Pour cela, il suffit de créer un projet Spring Boot pour le serveur du service de découverte avec la dépendance suivante : spring-cloud-starter-netflix-eureka-server :
Activer le service de découverte avec l’annotation @EnableEurekaServer dans la classe principale du projet :
Et ajouter les propriétés suivantes dans le fichier de configuration application.properties :
Au niveau du client, on ajoute la dépendance suivante :
Ajouter dans le fichier properties de l’application cliente l’adresse du serveur de découverte :
Et voilà, le serveur de découverte est prêt à fonctionner :
Spring Cloud Gateway:
Spring Cloud Gateway fournit tout le nécessaire pour créer une passerelle de communication avec les microservices d’une application.
Pour cela, il suffit de créer un projet Spring Boot avec la dépendance suivante : spring-cloud-starter-gateway.
Ensuite, Il faut ajouter les configurations de redirections.
Cela peut être fait dans la classe principale de l’application avec la classe RouteLocator et RouteLocatorBuilder.
Ou d’une manière dynamique dans le fichier properties ou yaml de configuration. Spring Cloud Gateway nous permet aussi de gérer les problèmes de CORS POLICY en ajoutant les allowedOrigins comme montré dans l’exemple ci-dessous.
Dans les deux exemples, le microservice “clientProjet” est appelé directement par son nom et non pas par son URL. Cela est assuré par le biais du service de découverte eureka de netflix ajouté aussi dans le projet.
Conclusion
Malgré ses avantages, l’architecture en Microservices fait l’objet de critiques et présente des inconvénients, tels qu’une mise en place complexe, un cout initial élevé et un monitoring essentiel.
Pour adopter ce type d’architecture, il faut bien étudier le périmètre de l’application et analyser les besoins du projet pour pouvoir bien découper afin de profiter au Maximum des avantages des Microservices.
Sources
https://fabienfernandez.dev/monolithe-vs-micro-services
Sources de l’Informaticien avec Pr.Mohamed YOUSSFI: Micro Services avec Spring Cloud par l’exemple
www.redhat.com/fr/topics/microservices/what-are-microservices
blog.engineering.publicissapient.fr/2015/03/02/microservices-les-concepts/
https://fr.wikipedia.org/wiki/Programmation_orientée composant