Cloudbasierte Kommunikationsmuster
Tipp
Diese Inhalte sind ein Auszug aus dem E-Book „Architecting Cloud Native .NET Applications for Azure“, verfügbar in der .NET-Dokumentation oder als kostenlos herunterladbare PDF-Datei, die offline gelesen werden kann.
Beim Entwickeln eines cloudnativen Systems wird die Kommunikation zu einer wichtigen Entwurfsentscheidung. Wie kommuniziert eine Front-End-Clientanwendung mit einem Back-End-Microservice? Wie kommunizieren Back-End-Microservices miteinander? Welche Prinzipien, Muster und bewährten Methoden sollten Sie bei der Implementierung der Kommunikation in cloudnativen Anwendungen berücksichtigen?
Überlegungen zur Kommunikation
In einer monolithischen Anwendung ist die Kommunikation unkompliziert. Die Codemodule werden gemeinsam in demselben ausführbaren Bereich (Prozess) auf einem Server ausgeführt. Dieser Ansatz kann Leistungsvorteile bieten, da alles gemeinsam im freigegebenen Speicher ausgeführt wird, führt aber zu eng gekoppeltem Code, der schwer zu verwalten, weiterzuentwickeln und zu skalieren ist.
Cloudnative Systeme implementieren eine auf Microservices basierende Architektur mit vielen kleinen, unabhängigen Microservices. Jeder Microservice wird in einem separaten Prozess und in der Regel innerhalb eines Containers ausgeführt, der in einem Cluster bereitgestellt wird.
Ein Cluster fasst einen Pool von virtuellen Computern zu einer hochverfügbaren Umgebung zusammen. Sie werden mit einem Orchestrierungstool verwaltet, das für die Bereitstellung und Verwaltung der containerisierten Microservices zuständig ist. In Abbildung 4-1 ist ein Kubernetes-Cluster dargestellt, der in der Azure-Cloud mit den vollständig verwalteten Azure Kubernetes Service-Instanzen bereitgestellt wird.
Abbildung 4-1. Ein Kubernetes-Cluster in Azure
Im gesamten Cluster kommunizieren Microservices über APIs und Messagingtechnologien miteinander.
Obwohl sie viele Vorteile bieten, sind Microservices nicht kostenlos. Lokale In-Process-Methodenaufrufe zwischen Komponenten werden jetzt durch Netzwerkaufrufe ersetzt. Jeder Microservice muss über ein Netzwerkprotokoll kommunizieren, was die Komplexität Ihres Systems erhöht:
- Netzwerküberlastungen, Latenz und vorübergehende Fehler sind ein ständiges Problem.
- Resilienz (d. h. Wiederholung fehlerhafter Anforderungen) ist unerlässlich.
- Einige Aufrufe müssen idempotent sein, um den einheitlichen Zustand beizubehalten.
- Jeder Microservice muss Aufrufe authentifizieren und autorisieren.
- Jede Nachricht muss serialisiert und dann deserialisiert werden, was kostenintensiv sein kann.
- Die Verschlüsselung/Entschlüsselung von Nachrichten gewinnt an Bedeutung.
Das Buch .NET Microservices: Architektur für .NET-Containeranwendungen, das kostenlos bei Microsoft erhältlich ist, behandelt eingehend die Kommunikationsmuster für Microservice-Anwendungen. In diesem Kapitel bieten wir eine allgemeine Übersicht über diese Muster sowie Implementierungsoptionen, die in der Azure-Cloud verfügbar sind.
In diesem Kapitel befassen wir uns zunächst mit der Kommunikation zwischen Front-End-Anwendungen und Back-End-Microservices. Anschließend betrachten wir Back-End-Microservices, die miteinander kommunizieren. Wir werden die Up- und gRPC-Kommunikationstechnologie erkunden. Schließlich werden wir uns neue innovative Kommunikationsmuster ansehen, die die Service-Mesh-Technologie verwenden. Wir werden auch sehen, wie die Azure-Cloud verschiedene Arten von unterstützenden Diensten für die cloudnative Kommunikation anbietet.