Stellen Sie sich ein Szenario mit zwei verschiedenen Mikrodiensten vor. Der eine kümmert sich um die Authentifizierung innerhalb des Dienstes, der andere um die Benutzerverwaltung. Sie haben beide das Konzept eines Benutzers und werden durch gegenseitige Anrufe über Benutzer sprechen.
Wohin würde das Domain-Modell eines "Users" gehören? Würden beide eine unterschiedliche Darstellung dessen haben, was ein Benutzer auf der Ebene der Datenbank ist? Was ist, wenn wir ein UserDTO zur Verwendung in API-Aufrufen haben, würden beide eines für ihre jeweiligen APIs haben?
Was ist die allgemein akzeptierte Lösung für diese Art von Architekturproblemen?
quelle
Wenn zwei Dienste so eng miteinander verbunden sind, dass es mühsam wäre, sie zu implementieren, ohne DTOs und andere Modellobjekte gemeinsam zu nutzen, ist dies ein starkes Zeichen, dass Sie nicht über zwei Dienste verfügen sollten.
Zweifellos macht das Beispiel als zwei Dienste wenig Sinn; Es ist schwer vorstellbar, dass die Spezifikation für die Benutzerverwaltung so kompliziert ist, dass ein ganzes Team so beschäftigt ist, dass es keine Zeit für die Authentifizierung hat.
Wenn dies aus irgendeinem Grund der Fall wäre, würden sie wie in OAuth 2.0 über im Grunde beliebige Zeichenfolgen kommunizieren .
quelle
Sie können sich diese als zwei getrennte begrenzte Kontexte vorstellen (in der domänengetriebenen Designsprache). Sie sollten außer einer ID, die zum Korrelieren des "Benutzers" des Authentifizierungskontexts mit dem "Benutzer" des anderen Kontexts verwendet wird, keine Daten zwischen ihnen austauschen. Sie können jeweils eine eigene Darstellung des "Benutzers" und ein eigenes Domänenmodell haben, das nur die Informationen enthält, die für die Wahrnehmung ihrer Geschäftsverantwortung erforderlich sind.
Denken Sie daran, dass ein Domain-Modell nicht versucht, ein reales "Ding" zu modellieren, sondern das, was dieses Ding in einem bestimmten Kontext ist (wie z. B. Identitäts- / Berechtigungsverwaltung oder Personalwesen usw.).
quelle
Ich stimme auch dem zu, was @soru gesagt hat. Wenn ein Dienst die Daten eines anderen Dienstes benötigt, sind deren Grenzen falsch.
@Pnschofield hat sich eine gute Lösung ausgedacht: Behandeln Sie Ihre Services als begrenzten Kontext.
In Kürze: Shared Domain-Modelle verhindern die Autonomie von Diensten und verwandeln Ihr Microservice-System in einen verteilten Monolithen. Was anscheinend noch schlimmer ist als ein Monolith.
Es ist also immer noch eine allgemeine Frage ungelöst - wie werden Service- oder Kontextgrenzen definiert, damit sie in hoher Kohäsivität und loser Kopplungsgüte gedeihen.
Ich fand eine Lösung, um meine Kontexte als Geschäftsfähigkeit zu behandeln. Es ist eine übergeordnete Geschäftsverantwortung, eine Geschäftsfunktionalität, die zum allgemeinen Geschäftsziel beiträgt. Sie können sich diese Schritte als Schritte vorstellen, die Ihr Unternehmen ausführen muss, um geschäftlichen Nutzen zu erzielen.
Meine typische Abfolge von Schritten zum Ermitteln von Dienstgrenzen lautet wie folgt:
Wahrscheinlich würde Sie ein Beispiel für diese Technik interessieren. Zögern Sie nicht, mir Ihre Meinung mitzuteilen, da ich diesen Ansatz für sehr profitabel befunden habe. Sicher, es kann auch für Sie funktionieren.
quelle
Bei Microservice geht es nicht um "nichts teilen", sondern um "so wenig wie möglich teilen". In den meisten Fällen ist "Benutzer" eine wirklich gebräuchliche Entität (nur weil der Benutzer durch einen gemeinsamen Identifikator identifiziert wird - Benutzer-ID / E-Mail / Telefon). Solche Entitäten werden per Definition geteilt. Das Benutzermodell ist außerhalb des Geltungsbereichs eines Mikrodienstes. Sie müssen also ein globales Schema haben, in das der Benutzer (nur die am häufigsten verwendeten Felder) eingefügt werden soll. Im strengen Fall ist nur id.
quelle