Wie verfolgen Sie in einer lose gekoppelten Microservices-Architektur Ihre Abhängigkeiten?

9

Eine beliebte High-Level-Architektur in modernen Programmen ist ein REST-basiertes Microservices-System. Dies hat mehrere Vorteile wie lose Kopplung, einfache Wiederverwendung, begrenzte Einschränkung der verwendbaren Technologien, hohe Skalierbarkeit usw.

Eines der Probleme, die ich in einer solchen Architektur sehe, ist die schlechte Sichtbarkeit der Abhängigkeiten einer Anwendung. Angenommen, ich habe eine Anwendung, die täglich einen Satz REST-Aufrufe verwendet. Diese Anwendung verwendet auch einen zweiten Satz von REST-Aufrufen, jedoch nur einmal im Quartal. Wenn ich die Protokolle der letzten Woche scannen würde, würde ich alle täglichen Kalorien sehen, aber ich würde wahrscheinlich nicht die vierteljährlichen Anrufe sehen. Wenn es um die Umgestaltung geht, besteht für die vierteljährlichen Anrufe ein hohes Bruchrisiko.

Welche Muster oder Werkzeuge können verwendet werden, um dieses Risiko zu verringern und einen besseren Einblick in die Abhängigkeiten einer lose gekoppelten Architektur zu erhalten?

David sagt Reinstate Monica
quelle
1
Genau deshalb kann eine lose Kupplung schlecht sein. Wenn keine Abhängigkeiten zur Kompilierungszeit bestehen, können Sie Fehler nur mithilfe automatisierter Tests erkennen, und Sie können nie alle abfangen. Die Lösung ist eine Art automatisierter Tests, die wahrscheinlich sowohl Unit-Tests als auch Integrationstests umfassen.
Frank Hileman
@FrankHileman Tests helfen natürlich, aber ich finde es schwer zu glauben, dass dies die einzige Lösung da draußen ist. Außerdem gibt es viele Sprachen, die keine Überprüfungen zur Kompilierungszeit haben (z. B. JS oder Python), sodass selbst bei enger Kopplung immer noch Probleme auftreten.
David sagt Reinstate Monica
1
Statische Systeme können während der Kompilierungsphase eine große Anzahl von Fehlern abfangen. Die einzige Entschädigung für das Fehlen eines solchen Systems sind meines Wissens automatisierte Tests. Statische Fehlererkennung durch automatisierte Proofs oder einfaches Kompilieren ist immer zuverlässiger als Tests.
Frank Hileman
Eine Möglichkeit besteht darin, den API-Client jedes Dienstes separat zu implementieren und diese Clients als Abhängigkeiten des Projekts einzuschließen. Mit den API-Clients wäre es auch einfacher zu verfolgen, welche Version des Dienstes wir verwenden.
Laiv
@Laiv Ich bin besonders neugierig auf RESTful-Services, daher ist dies keine Option, da jeder mehr oder weniger HTTP-Anfragen senden kann.
David sagt Reinstate Monica

Antworten:

4

Welche Muster oder Werkzeuge können verwendet werden, um dieses Risiko zu verringern?

Halten Sie Ihre APIs und Ihre Geschäftsfunktionen abwärtskompatibel.

Bieten Sie einen besseren Einblick in die Abhängigkeiten einer lose gekoppelten Architektur

Gesundheitschecks.

Mein Service ist ein Kunde für Ihre monatliche API-Fähigkeit. Aber mein Dienst ist der Client Ihrer API, wenn mein Dienst ausgeführt wird. Mein Dienst wird also alle 10 Minuten oder was auch immer aktiviert, stellt eine Verbindung zu Ihrer monatlichen API her und führt das Protokoll aus, um sicherzustellen, dass die für meinen Dienst erforderlichen Funktionen weiterhin verfügbar sind.

In Ihren Protokollen wird also angezeigt, wie oft ein anderer Dienst überprüft, ob der von Ihnen angebotene Dienst noch verfügbar ist, und wie häufig der von Ihnen angebotene Dienst tatsächlich verwendet wird.

VoiceOfUnreason
quelle
1

Es gibt mindestens zwei Stellen, an denen Sie die Abhängigkeiten finden können:

  • Aufbau. Für den Zugriff auf externe APIs müssen eine Reihe von Informationen zu jeder dieser APIs bekannt sein. Zugriffs-IDs, geheime Schlüssel, Endpunkte. All dies kann nicht im Code, da diese Informationen werden ändern. Als Beispiel habe ich kürzlich begonnen, alle meine Microservices auf SSL zu migrieren. Dies bedeutet, dass jeder Dienst, der auf dem zu migrierenden Dienst basiert, neu konfiguriert werden sollte, um auf die https://Version anstatt auf zu verweisen http://. Ich bin froh, dass die Endpunkte in der Konfiguration waren, anstatt fest codiert zu sein.

  • Schnittstellen. Sie greifen nicht direkt über Ihren Code auf einen Dienst zu, da sich die API-Version ändert und Sie möglicherweise sogar entscheiden, zu einer anderen API zu wechseln. Stattdessen erstellen Sie eine Abstraktionsschicht und verwenden die Abhängigkeit über eine Schnittstelle. Wenn Sie beim Erstellen dieser Schnittstellen einer gemeinsamen Logik folgen, können Sie später bei der Suche nach Abhängigkeiten das Leben erleichtern.

Wenn es um die Umgestaltung geht, besteht für die vierteljährlichen Anrufe ein hohes Bruchrisiko.

Dafür sind Regressionstests gedacht.

Sie können sich den Code nicht einfach ansehen, ändern und sich darauf verlassen, dass nichts kaputt ist. Dies funktioniert in einer Microservices-Architektur nicht. Dies funktioniert auch in einer monolithischen Anwendung nicht. Ein Compiler kann einige der Fehler abfangen, die beim Ändern von Code auftreten. In einigen Sprachen, wie z. B. Haskell, kann der Compiler sehr leistungsfähig sein und die meisten Fehler abfangen. Compiler für Mainstream-Sprachen werden jedoch nicht viel für Sie tun. Wenn Sie keine Tests haben, sind Sie geschraubt. Das Vorhandensein von Mikrodiensten ist irrelevant.

Arseni Mourzenko
quelle
-2

REST-APIs sind lose spezifiziert, daher kann es irgendwann nützlich sein, zu gRPC, Google Protobufs oder Thrift zu wechseln, um eine RPC-Schnittstelle zu definieren und diese dann zu versionieren.

Patrick
quelle
2
Dies mag als Kommentar besser sein ... aber ehrlich gesagt erklärt dies nicht viel.
David sagt Reinstate Monica
Fair genug. Eine Rest-API hat keine spezifische Abhängigkeit von der Kompilierungszeit von einem anderen Dienst, da die Verbindung zwischen beiden nur ein HTTP-Restaufruf ist, etwa ein Host und ein Pfad. Mit gRPC oder Protobuf oder Thrift wird eine Schnittstelle definiert, die zum Generieren von Code verwendet wird. Der generierte Code wird kompiliert und versioniert, und dann werden Ihre Dienste für diese Schnittstellen erstellt. Das Ergebnis ist, dass jeder Dienst eindeutig von einer oder mehreren Ihrer anderen Dienstschnittstellen abhängig ist. Hoffe das klärt meine Antwort!
Patrick