03
Juni
2025
Entwerfen skalierbarer Microservices mit .NET 9 Übersicht

Entwerfen skalierbarer Microservices mit .NET 9: Übersicht

Die verteilte Microservices Architektur hat sich fest in der Unternehmenssoftware Entwicklung etabliert, vor allem, weil sie perfekt zur typischen Struktur großer Organisationen passt, in denen Teams in kleine, eigenständige Einheiten aufgeteilt werden. Durch Microservices kann jedes Team für einen klar abgegrenzten Teil des Produkts Verantwortung tragen, anstatt sich für die gesamte Anwendung kümmern zu müssen.

Dabei ist es wichtig, die Schlüsselfaktoren beim Aufbau einer Microservice Architektur zu verstehen:

  • Skalierbarkeit: Jeder Service muss auch bei zunehmendem Datenverkehr zuverlässig und reibungslos funktionieren
  • Lose Kopplung: Services sollten unabhängig voneinander entwickelbar, verwaltbar und deploybar sein. Idealerweise übernimmt ein dediziertes Team die Verantwortung für einen einzelnen Service
  • Sicherheit: Da die Kommunikation in einer Microservice Architektur über Webschnittstellen erfolgt, sind sichere Datenflüsse unerlässlich, insbesondere in Bezug auf Datenschutz, Identitätsmanagement und Zugriffssteuerung
  • Transparenz: Jeder Service sollte eigene Metriken, Logs und Alarme haben, damit das Unternehmen die Prozesse überwachen und Fehler erkennen kann. 

Viele dieser Anforderungen sind bereits in .NET 9 integriert und erleichtern eine schnelle Entwicklung nach Best Practices der Microservice Architektur. Dazu gehören auch Minimal APIs, native Unterstützung für gRPC und HTTP/3 sowie optimierte leistungsstarke Webserver Funktionen für hohe Lastanforderungen.

Auch das DAPR SDK und das Prinzip der schnittstellenbasierten Dependency Injection tragen zu einer besseren Strukturierung des Codes bei. Sie fördern die Entkopplung von Services und erleichtern die Kommunikation zwischen den Diensten über klar definierte Schnittstellen.

Weitere Features von .NET 9 wie standardmäßiges HTTPS, OAuth2 und OIDC Unterstützung, Autorisierungsfilter und IdentityServer ermöglichen eine einfache Implementierung sicherer Web Flows.

Nicht zuletzt sorgt die integrierte OpenTelemetry Unterstützung für Tracing und Logging dafür, dass Metriken, Dashboards und Alarme mit minimalem Aufwand bereitgestellt werden können. Dies gewährleistet maximale Transparenz im Systemverhalten.

Informieren Sie sich über die Betriebs- und Wartungskosten, bevor Sie in die Cloud migrieren.

Microservices API Bausteine in .NET 9

Beim Aufbau einer Microservices Architektur mit .NET spielt die Entwicklung von Web APIs eine entscheidende Rolle. Web APIs dienen als Kommunikationsbrücke zwischen den einzelnen Microservices. Um eine neue Geschäftslogik in einer solchen Architektur bereitzustellen, lassen sich daher ein oder mehrere APIs erstellen, die jeweils eine spezifische Aufgabe übernehmen. Sie können dann über Webaufrufe mittels Kommunikationsprotokollen wie HTTP oder gRPC miteinander verbunden werden, um dem Endnutzer ein vollständiges Ergebnis bereitzustellen.

In diesem Abschnitt werden einige Funktionen von .NET 9 vorgestellt, die die Entwicklung optimierter Web APIs erleichtern.

Minimal APIs und Endpoint Filter

Die Minimal API Funktion in .NET 9 ermöglicht es Entwicklern, neue Endpunkte mit minimalem Aufwand zu erstellen. Anstelle von Modellen, Attributen, Controllern und anderem Boilerplate Code genügt es, einen Funktionseintrag in einer .cs Datei zu definieren,  einschließlich der URI der API Ressource, der Request und Response Bodies sowie der Header. Dies erhöht die Entwicklungsgeschwindigkeit, reduziert Dependencies und verkürzt die Erstellungszeit.

Mit Endpoint Filtern können Entwickler Middleware Filter mit Minimal API Definitionen verknüpfen, um Request Body Validierung, Autorisierung und Logging umzusetzen. So lässt sich beispielsweise für jede Funktion in der Minimal API Datei eine eigene Datei zur Validierung des Request Bodys anlegen. Dadurch wird die Trennung zwischen Geschäftslogik und Wartungsaufgaben erleichtert.

Koexistenz von gRPC und REST

Die Kommunikationsprotokolle gRPC und REST können im selben Kestrel Server eines .NET 9 Web API Microservices parallel eingesetzt werden. Dies ist eine Funktion, die in früheren .NET Versionen nicht verfügbar war und auch für andere Frameworks eher untypisch ist. Dies ist besonders vorteilhaft, da beide Protokolle für unterschiedliche Szenarien geeignet sind. gRPC basiert auf einem strengeren Vertrag und verwendet kleinere Request und Response Bodies. REST hingegen ist ein flexibleres Protokoll, bei dem keine formale Vereinbarung zwischen Client und Server erforderlich ist und beliebige Felder in Requests und Responses enthalten sein können.

Beide Ansätze haben ihren Anwendungsbereich: gRPC eignet sich eher für optimierte, interne Kommunikation, während REST meistens für benutzerorientierte APIs verwendet wird. Ein wesentlicher Vorteil von .NET 9 besteht darin, dass beide Protokolle direkt nebeneinander und ohne zusätzlichen Konfigurationsaufwand genutzt werden können.

Eingebaute Designmuster und externe Integrationen in .NET 9

.NET 9 bietet Funktionen, die die Integration bestimmter Architekturmuster wie CQRS, Event Driven Design, API Gateways, Service Discovery, Saga und Circuit Breakers erleichtern. Nachfolgend stellen wir diese Muster kurz vor.

CQRS in Microservices: Klare, skalierbare Trennung von Lese- und Schreiboperationen

Das CQRS Muster (Command Query Responsibility Segregation) trennt Lese- und Schreibvorgänge, Datenbanken und sonstige Infrastrukturen. Diese Trennung hilft bei der Aufgabenverteilung und optimiert den Datenbankzugriff, insbesondere in Szenarien mit starkem Ungleichgewicht zwischen Lese- und Schreiboperationen. Bei CQRS werden Lesevorgänge in „Query“ Komponenten und Schreibvorgänge in „Command“ Komponenten aufgeteilt.

Mit einigen nativen Features der Microservices Architektur in .NET 9 lässt sich CQRS leichter umsetzen. So fördert MediatR die Trennung in separate Klassen für Lese- und Schreibvorgänge und unterstützt damit eine strukturierte CQRS gerechte Entwicklung.

Ein weiteres Prinzip des CQRS ist, dass der Zustand eines Objekts nach dem Speichern unveränderlich ist. In .NET 9 erleichtert das Feature Records die Erstellung solcher unveränderlichen Objekte, was die Umsetzung dieses Musters im Code erleichtert.

Event Driven Microservices Architektur in .NET 9

Ereignisgesteuerte Systeme ermöglichen die asynchrone Kommunikation. Statt REST oder gRPC APIs zu verwenden, setzen diese Systeme die Message Queuing, Streams und Message Brokern. Dies ist vorteilhaft, wenn ein System auf bestimmte Ereignisse reagieren soll. Zum Beispiel: Erhält ein Nutzer eine Gutschrift auf seinem Bankkonto, generiert das System automatisch eine Benachrichtigung, also reagiert auf das Ereignis „Geldeingang“ und veranlasst über eine API den Versand einer Nachricht.

Ereignisgesteuerte Architekturen bieten zudem eine höhere Fehlertoleranz, da Fehler nicht den Ausfall des gesamten Systems auslösen. Tritt ein Fehler bei der Zahlungsbenachrichtigung auf, wird das Event zurückgestellt und später erneut ausgeführt.

Darüber hinaus sorgt dieses Architekturmodell für eine Reduzierung von Lastspitzen auf den Webservern, da nur ein Event verarbeitet wird. Dies verbessert die Skalierbarkeit und schützt vor Überlastungsszenarien.

Im .NET 9 steht eine Reihe von Tools zur Verfügung, um eine ereignisgesteuerte Microservices Architektur zu implementieren, darunter Integrationen mit Kafka Broker, RabbitMQ und Azure Event Grid.

Weitere eingebaute Designmuster in .NET 9

Das .NET 9 Framework unterstützt weitere Microservice Muster zur Entwicklung sicherer, skalierbarer und fehlertoleranter Anwendungen, darunter:

  • Steeltoe ist eine .NET Dependency, die die Integration mit dynamischen Registrierungs- und Service-Discovery-Tools wie Netflix Eureka, HashiCorp Consul, Kubernetes und Spring Cloud ermöglicht. Service Discovery ist unerlässlich in Microservices Architekturen, da Dienste die Standorte (IP Adressen) anderer Microservices erkennen müssen.
  • YARP („Yet Another Reverse Proxy“) ist ein offizielles Microsoft Tool zur Umsetzung des Reverse Proxy Patterns. Es unterstützt API Routing, Authentifizierung, Lastverteilung und Ratenbegrenzung, was für Sicherheit und Skalierbarkeit entscheidend ist.
  • Für Ausfallsicherheit und Resilienz ist in .NET 9 Polly integriert. Dieses Tool implementiert Mechanismen wie Circuit Breaker, Wiederholungsversuche (Retry) und Timeout Mechanismen.

Für Konsistenzsicherung stehen in .NET 9 Komponenten zur Verfügung, die den Aufbau von Zustandsmaschinen, Kompensationslogiken, Orchestrierungsmustern und Transaktionskompensation unterstützen. Mit MassTransit können individuelle Workflows wie Sagas implementiert werden. Um Datenbestände systemübergreifend synchron zu halten, ist Konsistenz in Microservices von entscheidender Bedeutung.

Sicherung von .NET 9 Microservices mit .NET Sicherheit und Identität

Einer der wichtigsten, aber oft vernachlässigten Aspekte beim Aufbau von .NET Microservices ist die Sicherheit von Daten, der API Zugriffe sowie der Identität von Benutzer:innen. Zur Bewältigung dieser Herausforderungen bietet das .NET 9 Ökosystem Funktionen wie rollen- und claim-basierte Autorisierungsmodelle, Identity Server sowie Integrationen mit OAuth2 und OpenID.

Rollenbasierte vs. Claim basierte Autorisierung

Bei der rollenbasierten Autorisierung wird der Zugriff auf Ressourcen, APIs oder Datenbanken anhand der dem Nutzer zugewiesenen Rolle gesteuert. Nutzer:innen in der Gruppe „admin“ könnten zum Beispiel mehr Rechte haben (z. B. zum Löschen oder Bearbeiten), als Nutzer:innen in der Gruppe „external user“. Jedem Nutzer im System wird dabei durch eine:n Administrator:in eine Rolle zugewiesen. Im Rahmen des Authentifizierungsprozesses wird die Identität (Principal) geprüft, um anschließend den Zugriff zu gewähren oder zu verweigern.

Die claim-basierte Autorisierung hingegen verwendet sogenannte „Claims“ – die vom Benutzer übermittelten Informationen, die seine Berechtigungen, Rollen oder andere Identitätsmerkmale beschreiben. Statt Rollen und Berechtigungen zentral zu speichern, verlässt man sich hier auf die Angaben im Claim, etwa verschlüsselte Informationen zur E-Mail Adresse oder zum Namen. Der Zugriff wird dann gemäß interner Regeln gewährt oder verweigert.

Beide Modelle haben ihre Vorteile, je nach Anwendungsszenario. Mit .NET 9 lassen sich sowohl rollen- als auch claim-basierte Autorisierungen mit nur wenigen Codezeilen umsetzen. Entsprechende Dokumentationen sind für beide Autorisierungsmodelle verfügbar.

IdentityServer, OAuth2 & OpenID Connect

Nach der Implementierung eines Authentifizierungsmodells (z. B. rollen- oder claim-basiert) wird ein sicheres zentrales System zur Prüfung von Anfragen und Bereitstellung von Authentifizierungsdaten benötigt. Das ist ein sogenannter Identity Server, der die Anfragen von einem Principal bekommt und autorisiert oder Authentifizierungs-Tokens wie JWT auf Basis von Claims verleiht.

.NET 9 liefert die essentiellen Komponenten, kryptografischen Algorithmen und Best Practices für die sichere Umsetzung eines Identity Servers. Die offizielle Microsoft Lösung ist der .NET Core Identity Server mit Unterstützung für OAuth2, OpenID Connect, rollen- und claim-basierte Modelle sowie stabilen Verschlüsselungsverfahren. Alternativ steht Duende Dependency als eine moderne Identity Server Implementierung mit gleichen Funktionalitäten zur Verfügung.

Durch die Kombination eines Identity Servers mit dem Authentifizierungsmodell auf der Client Seite lassen sich sichere Kommunikationsprozesse zwischen Microservices realisieren. Für verbesserte Sicherheit und Skalierbarkeit ist die Integration der Authentifizierung in ein API Gateway empfohlen. So werden interne APIs vor unautorisierten Zugriffen geschützt und unnötige Rechenressourcen gespart.

Observability und Monitoring in .NET 9

Ein weiterer entscheidender Aspekt beim produktiven Einsatz skalierbarer .NET Microservices ist die sogenannte Observability. Observability ist die Fähigkeit, technische Metriken, Nutzerverhalten oder Fehlerquellen im System klar und verständlich abzubilden.

Durch Logs und Nutzungsmetriken lässt sich nachvollziehen, wie Dienste auf Anfragen reagieren. Über Dashboards kann man Metriken wie Verweildauer auf einer Seite oder Ladezeit eines Buttons auswerten .NET 9 bietet native Unterstützung für OpenTelemetry – den Branchenstandard für Observability. Außerdem können strukturierte Logs mit Tools wie Serilog einfach erstellt werden.

.NET 9 ermöglicht außerdem Distributed Tracing, z. B. mit OpenTelemetry „Baggage“. Dadurch  lässt sich der Kontext einer Anfrage während des gesamten Anfragezyklus hinweg mitführen. Dies ist besonders hilfreich bei der Fehlersuche und Analyse der Schwachstellen in der Architektur. 

OpenTelemetry Metriken lassen sich zudem mit Alerting Tools verbinden, um das Entwicklungsteam bei Problemen direkt zu benachrichtigen. Wird z. B. eine zu hohe Latenz festgestellt, kann eine Warnung wie „Latenz >2000 ms bei Dienst A“ automatisch ausgelöst und an zuständige Personen gesendet werden. Für diese Echtzeit Warnungen kommen Tools wie Grafana oder Elasticsearch in Frage.

Microservices mit .NET 9: Von der Entwicklung bis zum Go live

Die Umsetzung einer leistungsfähigen Microservices Architektur mit .NET 9 erfordert Kenntnisse in vielen Bereichen – von der Infrastruktur über API-Design bis hin zu Sicherheit und Skalierung. Für Unternehmen ohne spezielle Cloud Expertise ist diese Aufgabe oft herausfordernd.

Deshalb ist es sinnvoll, mit erfahrenen Berater:innen und Entwickler:innen zusammenzuarbeiten, die bereits erfolgreiche .NET Microservices Projekte umgesetzt haben. Chudovo hat zahlreiche maßgeschneiderte Cloud Lösungen und .NET Projekte in verschiedenen Branchen realisiert und ist daher ein empfehlenswerter Partner auf dem Weg zu einer modernen Microservices Architektur.