Microservices: de CRUD à Native Image. Partie un

Le mot «microservices» existe depuis quelques années. La technologie se développe activement, les gens en parlent lors de conférences en ligne et nous les écrivons nous-mêmes tous les jours. Il était une fois, une nouvelle approche est déjà devenue une routine. Mais en tant qu'architecte Java, je m'intéresse à ce qu'était le code avant, comment il a changé, quelles méthodes d'exécution sont populaires maintenant et seront utilisées en 2021: asynchronie, conteneurs, FaaS. 





C'est ainsi que cet article est né en deux parties, que j'ai préparé pour Habr à partir de mes articles sur le blog BellSoft et la table ronde Joker 2020, où nous avons discuté de l'avenir de Java. L'amélioration réelle de l'écosystème des backends aujourd'hui ne peut exister sans comprendre comment créer des microservices: écrire à partir de zéro ou découper des monolithes avec un scalpel? Je propose dans la première partie de parler de leur essence, et dans la seconde - de décomposer le conteneur de microservices en couches et d'examiner la contribution de chaque couche.





Le principal avantage réside dans la structure

La grande majorité des matériaux sur l'architecture de microservices la comparent aux monolithes en termes de structure. Comment les composants fonctionnent dans leur ensemble ou de manière isolée. Les microservices sont indépendants les uns des autres et peuvent échanger des données sur le réseau via des protocoles arbitraires, tels que l'API REST. Qu'est-ce que ça nous donne? Au minimum, la liberté de choisir n'importe quel outil, sans regarder l'ESB, les restrictions de schéma et les subtilités de la compatibilité. La virtualisation et la conteneurisation évoluent également, et désormais de petits conteneurs avec Alpine Linux vous permettent d'exécuter de nombreux composants à la fois sur du matériel auparavant dédié.





Prenons un service simple comme la réservation d'un billet ou la recharge d'un compte. Même avant l'avènement des microservices, l'approche CRUD était utilisée pour gérer le cycle de vie d'un objet de données dans de tels systèmes. Mais toutes les fonctionnalités qui fournissent des opérations CRUD pour certaines entités peuvent être facilement isolées. Ensuite, vous pouvez gérer séparément la mise à l'échelle, le contrôle d'accès et l'interaction en général, par exemple via REST.





Tout semble aller bien, quel est le problème?





Problèmes et solutions

Différentes parties d'une application monolithique s'exécutent en mémoire partagée et toutes les demandes sont envoyées au même serveur physique. Les microservices communiquent entre eux via des protocoles, ce qui donne par exemple: 





  • difficulté à gérer le trafic réseau et la latence;





  • échecs de demandes et autres erreurs;





  • la nécessité de sérialiser les données et de crypter les connexions.





, API Kafka/Redis/RabbitMQ , . Kafka DevOps.





, , . . , , — . - . 





:





  1. (Kafka, Kinesis);





  2. , service mesh (Istio, OSM);









— :





, , :





, . streaming platform (, Kafka) , .





, . , . , , .





Service mesh («c ») . , , Sidecar.





, JVM, , .





. , , Docker- .





-, , . , .





- . . , — SOA. 





. . , — . , , REST.





Java? , . Java EE 20 . : , XML javadoc ; ; Java 5. . Java EE.





, Java EE (, JNDI), , , . Web 1.0 Web 2.0, . .





Container dependency injection

« ». , . « » — . . , : trailing lambdas Kotlin Ktor; data- , Java 14 record- ( Lombok).





. , /. , , , , . IDE, , . — .





Contexts and Dependency Injection (CDI). CDI Java EE JSR 299/365 Weld, WildFly. — (Inversion of Control, IoC).





: , , ( Spring Data) HTML. . — , . , Convention over Configuration ( « »), IoC- , BeanFactory Spring. .





Comme je l'ai promis dans l'introduction, cet article est devenu une petite excursion dans l'histoire de l'architecture des microservices - après tout, sans elle, nulle part. Nous travaillons avec une technologie de pointe vieille de plus de 20 ans, mais toujours moderne. En effet, les méthodes sont demandées et vivantes et ne se transforment pas en héritage.





Dans la deuxième partie, j'analyserai en détail les couches du conteneur de microservices, expliquerai ce que le bon choix de runtime affecte et vous expliquerai comment réduire la consommation de ressources au minimum.








All Articles