Imaginez un scénario de deux microservices différents. L’un pour gérer l’authentification au sein du service, l’autre pour la gestion des utilisateurs. Ils ont tous deux un concept d'utilisateur et parleront d'utilisateurs par le biais d'appels mutuels.
À quel domaine appartiendrait le modèle de domaine d'un "utilisateur"? Auraient-ils tous deux une représentation différente de ce qu'un utilisateur est au niveau de la base de données? Qu'en est-il lorsque nous avons un UserDTO à utiliser dans les appels d'API, les deux en ont-ils un pour leurs API respectives?
Quelle est la solution généralement acceptée pour ce type de problème architectural?
la source
Si deux services sont suffisamment imbriqués au point qu'il serait difficile de les implémenter sans partager les objets DTO et les autres objets modèles, c'est un signe fort que vous ne devriez pas avoir deux services.
Certes, l'exemple n'a pas de sens en tant que deux services; Il est difficile d'imaginer une spécification pour la «gestion des utilisateurs» si compliquée que toute une équipe soit si occupée qu'elle n'a pas le temps de s'authentifier.
Si pour une raison quelconque ils l'étaient, ils communiqueraient en utilisant des chaînes fondamentalement arbitraires, comme dans OAuth 2.0 .
la source
Vous pouvez les considérer comme deux contextes délimités distincts (dans le jargon de la conception par domaine). Ils ne doivent partager aucune donnée entre eux, mis à part un identifiant utilisé pour corréler "l'utilisateur" du contexte d'authentification avec "l'utilisateur" de l'autre contexte. Ils peuvent chacun avoir leur propre représentation de ce qu'est un "utilisateur" et leur propre modèle de domaine, qui ne contient que les informations nécessaires pour s'acquitter de leur responsabilité professionnelle.
N'oubliez pas qu'un modèle de domaine n'essaie pas de modéliser une "chose" du monde réel, mais sa nature dans un contexte particulier (tel que Gestion de l'identité / des autorisations ou des ressources humaines, etc.).
la source
Je suis également d'accord avec ce que @soru a dit. Si un service a besoin des données d'un autre service, ses limites sont fausses.
Une solution intéressante est ce que @pnschofield a proposé: traiter vos services comme un contexte limité.
En quelques mots, les modèles de domaine partagé nuisent à l’autonomie du service et transforment votre système de microservice en monolith distribué. Ce qui est apparemment encore pire qu'un monolithe.
Il reste donc une question générale non résolue: comment définir les limites de service ou de contexte afin qu’elles se développent avec une cohésion élevée et une qualité de couplage lâche.
J'ai mis au point une solution pour traiter mes contextes comme une capacité métier. Il s'agit d'une fonctionnalité métier de niveau supérieur de responsabilité professionnelle contribuant à la réalisation de l'objectif global de l'entreprise. Vous pouvez les considérer comme des étapes que votre organisation doit suivre pour obtenir une valeur commerciale.
La séquence typique d'étapes que je fais lors de l'identification des limites de service est la suivante:
Probablement un exemple de cette technique pourrait vous intéresser. N'hésitez pas à me dire ce que vous pensez, car j'ai trouvé cette approche vraiment rentable. Bien sûr, cela peut marcher pour vous aussi.
la source
Microservice ne consiste pas à "ne rien partager", mais à "partager le moins possible". Dans la plupart des cas, "utilisateur" est une entité vraiment commune (simplement parce que l'utilisateur est identifié par un identificateur partagé - ID utilisateur / courrier électronique / téléphone). Ce genre d'entités partagées par définition. Le modèle utilisateur est hors de portée du microservice. Vous devez donc avoir un schéma global dans lequel l'utilisateur (uniquement leurs champs les plus courants) doit être placé. Dans le cas strict est id seulement.
la source