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?
quelle
Antworten:
Halten Sie Ihre APIs und Ihre Geschäftsfunktionen abwärtskompatibel.
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.
quelle
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 verweisenhttp://
. 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.
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.
quelle
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.
quelle