Microservices : se préparer à la nouvelle génération d’applications Cloud
Les microservices représentent une approche radicalement différente de la conception, du développement, du déploiement et de la gestion des applications monolithiques classiques. Voici comment s'y préparer.
Les microservices représentent une approche radicalement différente de la conception, du développement, du déploiement et de la gestion des applications monolithiques classiques.
L’informatique distribuée ne cesse d’évoluer depuis vingt ans. Le milieu des années 1990 a vu l’essor de la technologie des composants avec Corba, DCOM et J2EE. Un composant était défini comme une unité de code réutilisable, aux interfaces immuables et partageables entre des applications disparates.
L’architecture de composants était en rupture totale avec le mode traditionnel de développement d’applications, notamment au moyen de bibliothèques de liens dynamiques (DLL).
Toutefois, chaque technologie de composants utilisait un protocole de communication qui lui était propre (RMI pour Java, IIOB pour Corba et RPC pour DCOM) : l’interopérabilité et l’intégration des applications construites sur des plateformes aux langages différents n’en étaient que plus complexes.
Evolution des microservices
Avec l’adoption des protocoles standard XML et HTTP pour la communication entre plateformes, l’architecture orientée services (SOA) a tenté de définir un ensemble de normes d’interopérabilité.
Ainsi, les normes applicables aux services Web qui trouvaient leur origine dans le protocole SOAP (Simple Object Access Protocol) ont été confiées à un comité baptisé Oasis.
Des éditeurs comme IBM, Tibco, Microsoft et Oracle ont commencé à proposer des produits d’intégration applicative pour l’entreprise fondés sur les principes de l’architecture orientée services.
Malgré le succès remporté par ces produits auprès des entreprises, les jeunes sociétés Web 2.0 ont commencé à se tourner vers le protocole REST (Representational State Transfer) pour l’informatique distribuée.
Alors que JavaScript gagnait du terrain, JSON (JavaScript Object Notation) et REST sont rapidement devenus des normes de fait pour le Web.
Principales caractéristiques des microservices
Les microservices sont des unités fonctionnelles de grande précision. Ils sont conçus pour réaliser parfaitement une seule chose. Chaque microservice comprend exactement un point d’entrée connu. Cela rappelle l’attribut d’un composant mais avec une différence majeure : l’assemblage.
Les microservices ne sont pas de simples bibliothèques ou modules de code : chacun constitue une unité fonctionnelle qui prend la forme d’un assemblage complet avec système d’exploitation, plateforme, framework, environnement d’exécution et dépendances.
Chaque microservice est un processus autonome et indépendant qui ne dépend pas d’autres microservices. Il ne connaît pas ni ne reconnaît l’existence d’autres microservices.
Les microservices communiquent entre eux par le biais d’interfaces de programmation (API) indépendantes des plateformes et des langages. Ces API sont habituellement exposées sous la forme de terminaisons REST ou peuvent être appelées via des protocoles légers de messagerie comme RabbitMQ. Leur modularité permet d’éviter autant que possible les appels synchrones et bloquants.
Transition vers les microservices : facteurs favorables
Les applications actuelles s’appuient sur l’intégration et le déploiement continus pour obtenir une itération rapide. Pour tirer parti de cette approche, l’application est subdivisée en petites unités fonctionnelles indépendantes.
Chaque unité est attribuée à une équipe qui est chargée de l’améliorer. Grâce à ce fonctionnement, les équipes peuvent livrer rapidement de nouvelles versions des microservices sans perturber d’autres parties de l’application.
L’évolution de l’Internet des objets (IoT) et de la communication machine-à-machine (M2M) exige de structurer différemment les modules d’application. Chaque module doit s’occuper d’une seule tâche qui intervient dans le workflow global.
Pour chacune des parties d’une application, les développeurs choisissent les langages, les frameworks et les outils les plus appropriés.
La technologie des conteneurs, que ce soit celle de Docker, de Rocket ou de LXD, permet de porter le code d’un environnement à l’autre. Les développeurs peuvent transférer en toute transparence le code écrit sur leurs machines de développement vers des machines virtuelles, ou vers le Cloud public ou privé. Chaque conteneur qui s’exécute est un ensemble complet, du système d’exploitation au code d’exécution de la tâche.
L’infrastructure sous forme de code est un concept puissant : il permet aux développeurs de gérer l’infrastructure sous-jacente via un programme. On peut ainsi provisionner, configurer et orchestrer de façon dynamique quelques centaines de serveurs virtuels. Combinée aux conteneurs, cette fonctionnalité offre de puissants outils comme Kubernetes pour le déploiement dynamique de clusters exécutant des microservices.
Pour chacune des parties d’une application, les développeurs choisissent les langages, les frameworks et les outils les plus appropriés. Ainsi, une grande application peut se composer de microservices écrits en Node.js, Ruby on Rails, Python, R et Java. Chaque microservice est écrit dans le langage le plus adapté à la tâche.
C’est également le cas de la couche de stockage permanent. Les applications Web ont toujours plus besoin de stockage objet, de stockage de données semi-structurées et structurées, et de cache en mémoire pour garantir la persistance. Les microservices facilitent l’adoption d’une stratégie polyglotte en termes de langages de codage et de bases de données.
Avantages des microservices
Avec les microservices, développeurs et opérateurs peuvent développer et déployer des applications auto-adaptatives. Chaque microservice étant autonome et indépendant, il est facile de détecter et de remplacer un service défectueux sans perturber d’autres services.
La technologie des microservices permet aux entreprises d’investir dans des composants modulables et réutilisables.
A l’inverse des applications monolithiques, celles à base de microservices peuvent évoluer de manière sélective.
Au lieu de lancer plusieurs instances du serveur d’applications, on peut faire monter en charge un microservice donné à la demande. Quand la charge se déplace vers d’autres parties de l’application, un microservice utilisé antérieurement subit une baisse de charge parallèlement à la montée en charge d’un autre. On valorise mieux l’infrastructure sous-jacente : inutile désormais de provisionner de nouvelles machines virtuelles, il suffit de provisionner de nouvelles instances de microservices sur les machines existantes.
Les développeurs et les administrateurs pourront choisir les technologies de pointe qui fonctionnent le mieux avec tel ou tel microservice. Ils pourront combiner divers systèmes d’exploitation, langages, frameworks, environnements d’exécution, bases de données et outils de contrôle.
Enfin, la technologie des microservices permet aux entreprises d’investir dans des composants modulables et réutilisables. Chaque microservice fonctionne comme une brique de Lego qui peut être enfichée dans une pile d’applications. Si les entreprises investissent dans un jeu de microservices élémentaires, elles pourront ensuite construire par assemblage des applications répondant à diverses utilisations.
Microservices : premiers pas
Le plus simple pour se lancer avec les microservices est d’utiliser Docker. Ses outils et son écosystème en font une excellente plateforme pour les jeunes pousses du Web comme pour les entreprises classiques.
Les entreprises peuvent s’abonner à des services de conteneurs hébergés, par exemple Google Container Engine ou Amazon EC2 Container Service, pour s’initier au déploiement et à la gestion des applications en conteneurs.
Une fois ces connaissances acquises, elles seront en mesure de déployer l’infrastructure en conteneurs sur site.