Gemeinsam genutzte Domänenmodelle der Microservice-Architektur

12

Nehmen wir an, wir haben eine Spring Boot-Anwendung, die Microservices-Architektur verwendet. Jeder der Dienste verfügt über eigene Domänenmodelle. Jeder Dienst muss jedoch auf ein Benutzerdomänenobjekt verweisen. Was wäre der beste Ansatz, um dieses Problem zu lösen? Wäre es für jeden Dienst besser, nur eine Benutzer-ID zu haben und dann bei Bedarf den Benutzerservice nach Benutzerdetails zu fragen, oder wäre es besser, eine gemeinsam genutzte Domänenbibliothek für alle Mikrodienste zu haben?

user1176999
quelle
1
Es ist immer besser, eine einzige Quelle der Wahrheit zu haben , wann immer dies möglich ist.
Robert Harvey
@RobertHarvey Wie würde sich das auf die Persistenz von Polyglotten auswirken? Würde die Verwendung einer gemeinsam genutzten Bibliothek für alle Domänenobjekte weiterhin bedeuten, dass jeder Mikrodienst eine eigene Datenbank haben könnte?
user1176999
Ich habe diesen Begriff noch nie gehört, aber wenn ich mir seine Definition anschaue, würde ich sagen, dass er die Persistenz von Polyglotten überhaupt nicht beeinflusst, außer in Bezug auf die Technologie, die Sie für den Datenspeicher auswählen, in den Sie die Benutzer
einfügen

Antworten:

12

Wenn Sie sich für Microservices entschieden haben, um von Skalierbarkeit, loser Kopplung und einfacher, unabhängiger Änderung der einzelnen Services zu profitieren, sollten Sie sich so weit wie möglich daran halten.

Gesamtarchitektur

Ich denke, dass der beste Ansatz wäre:

  • über einen Microservice für die allgemeine Verwaltung von Benutzerinformationen verfügen;
  • Behalten Sie in jedem Mikrodienst die für den Mikrodienst spezifischen Benutzerinformationen (z. B. Profile, Berechtigungen, Einstellungen) bei (unter Verwendung der Referenznummer der allgemeinen ID).

Zusätzliche Lektüre:

  • Dieser Artikel beschreibt sehr gut diese Art von Architektur und Begründung, mit dem speziellen Fall von Berechtigungen.
  • Dieser Artikel beschreibt Herausforderungen und Lösungen für die Verwaltung der Benutzeridentität, um zu vermeiden, dass alle Dienste auf dasselbe Repository zugreifen.
  • In diesem Artikel wird beschrieben, wie Sie mithilfe von JWT die Identität des Benutzers zwischen den Diensten austauschen können (wobei zu beachten ist, dass einige grundlegende Informationen im ID-Token bereitgestellt werden können, sodass der Benutzerdienst nach der Anmeldung nicht erneut abgefragt werden muss, zumindest nicht für sehr grundlegende Zwecke Information).

Code-Sharing

Wenn Sie der obigen Lösung zustimmen, verfügen wir über einen Benutzer-Microservice (kapselndes Domain-Modell für Benutzer), und alle anderen Services sind Konsumenten desselben Microservice. Die Frage ist dann, ob Sie wissen wollen:

  • entweder jeder Mikrodienst zur Neuerfindung des Verbrauchercodes nach dem Dogma der starken Trennung, um flexible und unterschiedliche Veröffentlichungszyklen zu ermöglichen,
  • oder den Consumer-Code als Teil der Bibliothek freizugeben, wenn man bedenkt, dass diese grundlegenden Informationen eine Erweiterung des "Chassis" -Infrastrukturmusters darstellen .

Ich werde diesbezüglich keine klare Position beziehen, da es Meinungsverschiedenheiten zu diesem Thema des Codetauschs gibt, und ich glaube nicht, dass ich in der Lage bin, eine objektive Position einzunehmen. Hier ist bereits eine zusätzliche Lektüre:

  • In diesem Artikel wird davon ausgegangen, dass es keine optimale Lösung gibt, und alles hängt von Ihren Zielen ab
  • Diese Artikelposition besagt, dass Code-Sharing nur dann schlecht ist, wenn es eine starke Kopplung erzeugt, und Code-Sharing einige Synergien bringen kann
  • Dieser Artikel (von Leuten, die Microservices in großem Maßstab implementiert haben) besteht auf der Notwendigkeit, separate Builds zu haben, und auf den möglichen Problemen bei der Außerbetriebnahme von älterem Code. Eine gemeinsam genutzte Bibliothek für das Konsumieren mit Solid-Version-Management verhindert diese bewährten Methoden nicht.

Meine eigene Meinung dazu ist, dass Sie KEINEN Code zwischen dem Benutzer-Anbieter und den Benutzer-Verbrauchern teilen sollten, um eine enge Kopplung zu vermeiden. Sie KÖNNTEN jedoch den Benutzerverbrauchscode unter den Verbrauchern aufteilen, wenn Sie über ein starkes Versionsmanagement verfügen. Dieser Ansatz hätte einige Vorteile:

  • Verschiedene benutzerintensive Mikrodienste können mit verschiedenen Versionen des gemeinsam genutzten Benutzerkonsumcodes erstellt werden (sofern die Versionen mit dem unabhängigen Benutzeranbieter kompatibel sind). Gleiche Flexibilität wie die Neuerfindung des Rades, aber höhere Produktivität.
  • Sie können Ihren Benutzer-Anbieter-Dienst unabhängig voneinander ändern, ohne dass dies Auswirkungen auf die Verbraucher hat.
  • Wenn ein Fehler auf der Verbraucherseite gefunden wird, können Sie ihn einmal korrigieren und alle Konsumenten (dank Versionsverwaltung) als optimale Lösung bereitstellen. Dies könnte sogar zu einer höheren Servicequalität führen.
  • Wenn Sie aus einem bestimmten Grund verpflichtet sind, die Benutzer-Anbieter-API zu aktualisieren, können Sie den aktualisierten Benutzerverbrauch schneller bereitstellen. Wenn Sie den alten und den neuen Anbieterdienst während des Übergangs aktiv halten, kann diese Freigabemöglichkeit eine schnellere Außerbetriebsetzung der älteren Version des Consumer-Anbieters ermöglichen.
Christophe
quelle
1

Ich würde eine gemeinsame Bibliothek vermeiden, wenn es überhaupt möglich ist. Fragen Sie sich, welche Eigenschaften eines Benutzers jeder Dienst benötigt? Häufig gibt es eine Kerndomäne, in der der Großteil des Verhaltens um einen Benutzer herum vorhanden ist, wobei für unterstützende Domänen häufig nur eine Benutzer-ID erforderlich ist.

Wenn Ihr Dienst weitere Details zu einem Benutzer benötigt, sehen Sie sich hier einige Vorschläge an , wie Sie mit solchen Situationen umgehen können

a25bedc5-3d09-41b8-82fb-ea6c353d75ae
quelle