Actuellement, j'ai 20 microservices pour un projet. Et chaque microservice stocké dans un référentiel GIT séparé. Par la suite, le nombre de services augmentera à 200 (ou plus).
Chaque service a des tests unitaires et des tests d'intégration. Chaque service est intégré à TeamCity (serveur d'intégration continue).
Question: Comment stocker le code source de 200 microservices pour un projet? Dans un référentiel ou dans des référentiels séparés?
À moins que ces micro-services soient étroitement couplés (ce qui signifie qu'il ne serait pas judicieux de n'en télécharger que certains, et que vous ne travailleriez qu'avec tous d'entre eux), en les gardant chacun dans un Git séparé le dépôt est recommandé.
Mais vous pouvez toujours les référencer comme sous-module dans un référentiel parent afin de garder une trace de leur état à tout moment.
les sous-modules et sous-arbres git ont aussi leurs propres problèmes. Facebook et google? avoir un référentiel unique pour tous leurs microservices. Il n'y a pas de réponse claire à ce problème, mais des éléments tels que la refactorisation, la gestion des dépendances et la configuration du projet tirent parti d'un référentiel mono. Encore une fois, le couplage des services et la façon dont les différentes équipes interagissent avec le repo sont essentiels pour choisir l'un ou l'autre.
Nous n'avons pas utilisé de sous-modules; Ce que nous avons fait, c'est une stratégie de branchement
Chaque micro-service a son propre dossier sous le dossier base_folder.
Il y a une branche de publication -> actuellement un maître (cela a tout) Il y a une branche d'interface -> interfaces (cela n'a que des interfaces comme par exemple les fichiers protobuffer/grpc pour tous les services). Cette branche est toujours fusionnée pour maîtriser
Chaque service a une branche -> sprint_service_name où le code est poussé (pour la révision du code) et une demande de fusion créée pour master branch
Flux de code
Pour un nouveau composant
git checkout interfaces
git checkout -b sprint_service_name
(create branch from interface branch)
Pour composant existant
git checkout sprint_service_name
git fetch Origin interfaces
git merge Origin/interfaces (don't use git merge Origin interfaces !!)
(ou pour les deux étapes ci-dessus git pull interfaces Origin)
Voici un flux développeur
Push to sprint_service_name branch and create merge request to master branch
git Push Origin sprint_service_name
Flux de branche
sprint_service_namexxx --> Merge Request --> master
sprint_interfaces --> Merge Request --> Interfaces -->master
interfaces --> sprint_service_namexxx (by all, every day)
Toutes les parties communes seront dans la branche des interfaces
(vous pouvez avoir n'importe quel nombre de branches privées; mais attention à ne pas fusionner master en sprint_service_name ou master en interfaces; sinon les fichiers indésirables seront dans votre branche)
Avantages Chaque micro service n'aura que son dossier de code et d'interfaces
Contre
J'ai vu que le flux ci-dessous ne se produit pas toujours idéalement, comme
sprint_interfaces --> Merge Request --> Interfaces -->master
C'est plus comme
sprint_interfaces --> Merge Request --> master
Ce qui signifie que quelqu'un doit prendre manuellement le dossier Interfaces du maître et fusionner vers la branche Interfaces . Mais c'est juste une affaire de discipline qui n'a rien cassé
J'avais travaillé dans une entreprise où nous travaillions avec plus de 130 services. Certains services se connectaient à une API externe, c'est-à-dire hors de notre écosystème. Mais nous avons juste utilisé garder chaque service dans leur propre référentiel GIT. Nous avions une bibliothèque commune pour le chiffrement, la journalisation, etc. sous une seule nomenclature. La création d'un référentiel individuel vous empêchera accidentellement de créer des microservices interconnectés, et c'est le but de toute l'idée. À l'avenir, si nécessaire, vous pouvez réduire davantage le service individuel. Avec plus de 130 microservices, nous n'avons jamais eu de problème de code interdépendant et les déploiements ont également été fluides sans se soucier de l'autre service.
Vous ne devriez avoir qu'un seul dépôt pour l'ensemble du projet, qu'il soit grand ou petit.
Vous pouvez référencer 12 Factor Application pour construire un tel projet qui gère la plupart des choses de ici .
Le concept de l'application 12 Factor est destiné aux grands projets qui ont de nombreux microservices.