Pip.Services Toolkit - en tant que «clé principale» pour le développement de microservices





À l'heure actuelle, il existe de nombreux frameworks prêts à l'emploi pour le développement d'applications utilisant une architecture de microservices. En règle générale, les frameworks sont divisés en deux types - pour un langage qui peut fonctionner avec différentes plates-formes, mais le développement est effectué dans un seul langage - un exemple de SpringBoot, Nancy, etc. Et le deuxième type - pour la plate-forme - est capable de travailler avec différents langages de programmation, mais le code ne peut être exécuté que sur la plate-forme sélectionnée - un exemple de ServiceFabric, AWS Lambda. Mais il n'existe pratiquement pas de frameworks multilingues capables de fonctionner sur différentes plates-formes.



Notre équipe développe des systèmes d'entreprise basés sur des microservices, qui contiennent des composants écrits dans différentes langues et doivent souvent travailler sur différentes plates-formes, le problème décrit ci-dessus est donc plus que pertinent pour nous. Comme nous n'avons trouvé aucune solution prête à l'emploi répondant à ces exigences, nous avons développé notre propre solution - Pip.Services Toolkit . Cet outil nous a permis de développer des microservices dans de nombreux langages de programmation et de ne pas trop se soucier de l'endroit où cette application fonctionnera - dans le cloud ou sur site.



Le but de l'article est de familiariser le lecteur avec les capacités du projet sans entrer dans les détails de la mise en œuvre. Si vous souhaitez en savoir plus sur cet outil, alors s'il vous plaît, sous chat ...



Que sont Pip.Services?



Au cours du développement, nous avons essayé de créer un outil assez polyvalent capable de couvrir de nombreuses tâches. Au cours du processus de conception, les principaux principes ont été déterminés, qui ont formé la base du produit:



  • les composants du système doivent être peu connectés pour pouvoir les modifier facilement et ajouter de nouvelles fonctionnalités
  • un cycle de vie très long - l'objectif était de créer un outil qui lui permettrait d'être pris en charge dans différentes langues le plus longtemps possible.
  • la capacité à développer des applications pour l'architecture de microservices et monolithique
  • les applications développées doivent pouvoir être déployées sur n'importe quelle plateforme, que ce soit sur site ou une solution cloud, et le cloud ne doit pas non plus dépendre de l'opérateur
  • prise en charge du nombre maximum de langages de programmation utilisés dans le développement tout en maintenant les principes de l'outil lui-même, ainsi que la compatibilité des services écrits dans différents langages les uns avec les autres pendant les communications


La boîte à outils Pip.Services représente un ensemble complet d'outils qui vous permet de développer des microservices et des applications monolithiques à l'aide de langages de programmation courants. Le Toolkit Pip.Services a développé des outils pour travailler avec toutes les fonctions et structures de données nécessaires, dont le besoin peut provenir d'un développeur, en l'absence des éléments nécessaires, vous pouvez facilement les ajouter vous-même.



Le Toolkit Pip.Services est un véritable polyglotte, tout en adhérant aux concepts suivants:



Implémentation symétrique dans le code



  • , , . ,






  • — ,
  • — ,


Pour une représentation plus visuelle de la structure, tournons-nous vers le schéma structurel de la boîte à outils.







Comme mentionné au début de l'article, la boîte à outils est multilingue. Pour le moment, il existe des implémentations dans 6 langages de programmation, parmi lesquels il y a à la fois populaires (Java, Node.js, Python, .Net Core) et en développement (Go, Dart) - il s'agit d'une couche grise sur le diagramme.

Comme vous pouvez le voir, il est basé sur un ensemble de packages avec des primitives multilingues et des modèles communs destinés au développement rapide de vos propres composants - la couche verte sur le diagramme. Sur leur base, une bibliothèque des principaux composants de la boîte à outils est implémentée.

Déjà sur la base des composants de base, les composants utilisateur et système sont implémentés - c'est la deuxième couche verte.



La couche bleue du diagramme est un ensemble de bibliothèques de base pour travailler dans certaines directions - implémentation de conteneurs (IoC), travail avec des données, échange synchrone (RPC) et échange asynchrone (messagerie). Ils sont capables de fonctionner en tant que composants autonomes, mais ils fournissent également des interfaces et des principes de base pour la construction d'implémentations spécifiques de composants supplémentaires pour fonctionner avec des technologies spécifiques. Comme indiqué dans le diagramme en haut de la pile, à titre d'exemple, implémentez des conteneurs pour AWS et Azure, implémentez la manipulation de données dans MongoDb et la mise en cache et le verrouillage distribués dans Memcached et Redis.



Boîte à outils Microservices sur Pip.Services - un aperçu



La pratique de développement montre que parmi de nombreux types de conceptions, la création d'un microservice à partir de composants faiblement couplés est préférée. Le kit d'outils Pip.Services n'impose aucune restriction sur la structure du microservice aux développeurs.



Chaque développeur est libre de choisir son propre chemin. Mais la conception de composants bénéficie d'un support solide dans la boîte à outils Pip.Services. Grâce à cette approche, un certain nombre de tâches sont résolues:



  • Le développement et les tests de composants individuels sont simplifiés.
  • Chaque composant peut être isolé du reste du code et ses dépendances dans les tests peuvent être remplacées par de simples simulacres.
  • Il devient possible de reconfigurer un microservice sur une plateforme spécifique, de remplacer des services d'infrastructure, de communication ou de bases de données en modifiant simplement la composition des composants du microservice dans le fichier de configuration sans aucune modification de code.
  • . . , .
  • , , :



  • . :
  • , ( ).
  • , , ( ).
  • Composants supplémentaires pour la mise en cache, la surveillance, la configuration, la synchronisation, etc. En règle générale, ces composants sont ajoutés à partir de l'ensemble standard, ce qui offre un large choix pour l'intégration avec divers services d'infrastructure et plates-formes (couleur grise).
  • Une bibliothèque cliente peut être implémentée pour simplifier l'utilisation du microservice. Il fournit une interface conviviale pour travailler avec le microservice et masque les détails de la communication de bas niveau (bleu).


Le kit d'outils Pip.Services utilise un fichier de configuration pour créer le microservice et configurer les composants. Voici un exemple d'une telle configuration:



config.yml



---
# Container descriptor
- descriptor: "pip-services:context-info:default:default:1.0"
 name: "hello-world"
 description: "HelloWorld microservice"
# Console logger
- descriptor: "pip-services:logger:console:default:1.0"
 level: "trace"
# Performance counter that post values to log
- descriptor: "pip-services:counters:log:default:1.0"
# Controller
- descriptor: "hello-world:controller:default:default:1.0"
 default_name: "World"
# Shared HTTP Endpoint
- descriptor: "pip-services:endpoint:http:default:1.0"
 connection:
   protocol: http
   host: 0.0.0.0
   port: 8080
# HTTP Service V1
- descriptor: "hello-world:service:http:default:1.0"
# Heartbeat service
- descriptor: "pip-services:heartbeat-service:http:default:1.0"
# Status service
- descriptor: "pip-services:status-service:http:default:1.0"

      
      





Le conteneur dans lequel le microservice est enveloppé lit une telle configuration, basée sur des descripteurs, à l'aide d'usines, crée les composants nécessaires, leur transmet les paramètres de configuration, lie les composants les uns aux autres et démarre les processus actifs.



Cette approche vous permet de concevoir des services unifiés et d'effectuer des réglages "fins" pour une tâche spécifique en utilisant des variables d'environnement directement dans l'environnement exécutable.



Passer du monolithe aux microservices sans changer de code



Par ailleurs, il convient de noter la possibilité de modifier l'architecture utilisée par l'application sans apporter de modifications au code source. Considérons cette opportunité avec un exemple.



Supposons qu'il existe une façade qu'un client utilise pour travailler avec un service. Par exemple, avec un service qui implémente la logique de travailler avec des balises Bluetooth (balises). Lorsqu'il est lancé en mode application monolithique, le fichier de configuration contiendra les sections suivantes avec des descripteurs de composants:



# Beacons components
- descriptor: "pip-services-beacons:persistence:mongodb:default:*"
- descriptor: "pip-services-beacons:controller:default:default:*"
- descriptor: "pip-services-beacons:client:direct:default:*"

      
      





Cette configuration crée en fait le service de balises dans le cadre de la façade sous forme de code monolithique, et l'interaction entre eux est effectuée via le client direct, mais dans un seul conteneur, comme vous pouvez le voir sur le schéma ci-dessous.







Mais si vous modifiez un peu le texte de configuration, le service beacons deviendra un microservice séparé et la façade fonctionnera avec lui via le client http. Pour ce faire, supprimez les sections avec contrôleur et persistance dans la configuration de la façade, et changez le type de client de direct à http: Pour un fonctionnement correct, vous devez spécifier l'adresse et le port des balises de microservice désormais exécutées séparément et redémarrer la façade afin qu'elle lise la nouvelle configuration. Vous devez également exécuter un microservice séparé avec des balises, pour cela, vous pouvez utiliser la configuration suivante:



# Beacons components

- descriptor: "pip-services-beacons:client:http:default:*"

connection:

protocol: "http"

host: "any.where.com"

port: 8086













# Http Endpoint 
- descriptor: "pip-services:endpoint:http:default:*"
  root_path: ""
  connection:
    protocol: "http"
    host: "0.0.0.0"
    port: 8086

# Beacons API V1
- descriptor: "pip-services-beacons:service:http:default:1.0"

# Hearbeat service
- descriptor: "pip-services:heartbeat-service:http:default:1.0"

# Status service
- descriptor: "pip-services:status-service:http:default:1.0"

      
      





D'un point de vue architectural, cela ressemblera maintenant à ceci:







comme vous pouvez le voir, de cette façon, il est possible de créer d'abord des applications sous la forme de monolithes, sans dépenser beaucoup de ressources pour le déploiement, mais dès que vous avez besoin d'évoluer, il vous suffit de changer la configuration et facilement le passage aux microservices est l'un des principaux avantages de la boîte à outils Pip.Services.



Outils supplémentaires du projet Pip.Services



Pip.Services n'inclut pas seulement la boîte à outils Pip.Services. Au cours de nos travaux, nous avons développé un certain nombre d'outils supplémentaires pour faciliter le développement de microservices:

- Bibliothèque de microservices prêts à l'emploi - contient un catalogue de microservices prêts à l'emploi divisé en six catégories :



  • – . , , , ..
  • – , , ,
  • – ,
  • – , , .
  • – , ,
  • — , , ;
  • Les benchmarks sont un ensemble d'utilitaires permettant de tester les performances des applications et des microservices développés.


- Bibliothèque de modèles - comprend plusieurs catégories avec des modèles, y compris des modèles pour le développement de microservices, la personnalisation de l'espace de travail, des modèles CI / CD et des modèles de façade.

- PowerShell Selenium WebDriver - pilote développé pour travailler avec Selenium de PowerShell.

Tous ces outils sont disponibles sur le site Web Pip.Services.



Conclusion



À la fin de l'article, j'aimerais ajouter que la boîte à outils Pip.Services est un ensemble de modèles et de composants qui simplifie le développement de systèmes de microservices à l'aide de divers langages de programmation et permet un déploiement sur diverses plates-formes locales et cloud. L'ensemble comprend des modèles qui facilitent la création de microservices hautement personnalisables à l'aide de composants faiblement couplés qui implémentent des fonctions typiques de transmission et de traitement de données, de travail avec des bases de données, de transfert d'informations à l'aide de divers protocoles synchrones et asynchrones, de fonctions de surveillance, de gestion des erreurs et bien plus encore. Dans le même temps, le Toolkit Pip.Services est facilement extensible et peut coexister avec d'autres bibliothèques et frameworks grâce à une conception basée sur la composition plutôt que sur l'héritage.



Les principes généraux et la structure, ainsi que la symétrie de l'implémentation, permettent aux développeurs de passer facilement d'une langue à une autre dans les plus brefs délais. Et l'interopérabilité offre une compatibilité totale des microservices écrits dans différentes langues dès la sortie de la boîte.



Tous les microservices de notre bibliothèque sont testés et utilisés sur des systèmes réels. Grâce à l'utilisation de la bibliothèque Pip.Services dans nos projets, nous avons pu réduire le temps de développement backend jusqu'à 30%.



Pip.Services se développe activement, presque chaque mois de nouveaux outils et microservices sont ajoutés ou étendus.



La plupart des informations nécessaires sont déjà sur le site, mais nous les complétons toujours activement avec de nouveaux matériaux et continuons à travailler dessus.



En novembre 2020, sur la base de cette boîte à outils, plus d'un millier de microservices ont été mis en œuvre avec un haut degré de fiabilité, une vitesse de développement élevée et une facilité d'intégration. En conséquence, les dirigeants de l'entreprise ont pris la décision de transférer complètement le produit au statut Open Source afin de partager avec la société des solutions d'architecture réussies, ainsi que d'assurer le développement ultérieur du projet grâce aux efforts d'un plus grand nombre de développeurs expérimentés.



L'article était uniquement destiné à donner un aperçu, sans exemples détaillés de mise en œuvre, alors veuillez ne pas trop donner de coups de pied. Dans les publications suivantes, nous allons essayer de comprendre comment implémenter un microservice fonctionnel à l'aide de cette boîte à outils.



Si vous avez des questions sur cette boîte à outils, posez-les dans les commentaires ou via les canaux de communication indiqués sur notre site Web et nous y répondrons certainement.



Liens: www.pipservices.org



All Articles