Was sind Microservices?
Die Cloud ist der Motor der heutigen Anwendungsentwicklung und IT-Systemverwaltung. Moderne Cloudanwendungen müssen schnell, flexibel, hochgradig skalierbar und zuverlässig sein.
Mithilfe von Containern können Sie Anwendungen bereitstellen, die alle diese Anforderungen erfüllen. Wenn eine Anwendung in einem Container platziert wird, ohne dabei ein strategisches Entwurfsmuster zu beachten, ist dies vergleichbar mit einer Person, die sich in ein Auto setzt und in eine andere Stadt gelangen möchte, ohne dafür jedoch eine Karte oder ein GPS zurate zu ziehen. Sie kommen vielleicht an Ihrem Ziel an, aber der Weg dorthin war wahrscheinlich nicht direkt oder der effizienteste.
Eine Microservices-Architektur ist in diesem Szenario hilfreich. Microservices bieten Ihnen einen Ansatz an die Softwareentwicklung und -bereitstellung, der sich ideal für die Anforderungen an Flexibilität, Skalierbarkeit und Zuverlässigkeit moderner Cloudanwendungen eignet.
Was ist eine Microservicearchitektur?
In einer Microservices-Architektur wird eine große Anwendung in eine Reihe kleinerer Dienste aufgeteilt. Jeder Dienst wird in einem eigenen Prozess ausgeführt und kommuniziert mit anderen Prozessen mithilfe von Protokollen, wie HTTP/HTTPS, WebSocket oder Advanced Message Queuing Protocol (AMQP). Jeder Microservice implementiert eine bestimmte End-to-End-Domäne oder -Geschäftsfunktion innerhalb einer bestimmten Kontextgrenze. Jeder Microservice muss eigenständig entwickelt und unabhängig bereitgestellt werden. Schließlich sollte jeder Microservice sein zugehöriges Do Standard-Datenmodell und Do Standard-Logik besitzen. Microservices können auf verschiedenen Datenspeichertechnologien (SQL, NoSQL) und verschiedenen Programmiersprachen basieren.
Hier finden Sie die Hauptmerkmale von Microservices:
- Sie sind klein, unabhängig und lose gekoppelt.
- Jeder Microservice hat eine separate Codebasis, die von einem kleinen Entwicklungsteam verwaltet werden kann.
- Sie werden unabhängig bereitgestellt. Ein Team kann einen vorhandenen Microservice aktualisieren, ohne die gesamte Anwendung neu erstellen und erneut bereitstellen zu müssen.
- Sie speichern ihre Daten oder den externen Zustand in ihren jeweiligen Datenbanken. Im Gegensatz zur monolithischen Architektur nutzen Microservices Datenbanken nicht gemeinsam.
- Sie kommunizieren über klar definierte APIs miteinander. Die internen Implementierungsdetails jedes Diensts werden für andere Dienste verborgen.
- Sie unterstützen die Polyglotprogrammierung. Beispielsweise müssen die Microservices, aus denen eine Webanwendung besteht, nicht den gleichen Technologiestapel, die gleichen Bibliotheken oder die gleichen Frameworks verwenden.
Gründe für die Entwicklung mithilfe einer Microservices-Architektur?
Microservices kapseln in der Regel eine einfachere, den Kundenanforderungen entsprechende Funktionalität, die Sie unabhängig voneinander aus- oder einskalieren können. Sie können sie unabhängig testen, bereitstellen und verwalten. Ein wichtiger Vorteil eines Microserviceansatzes ist, dass Teams stärker durch Geschäftsszenarios als durch spezifische Technologie beeinflusst werden. Jedes kleine Entwicklungsteam entwickelt einen Microservice basierend auf einem Kundenszenario. Das Team wählt die von ihm verwendeten Technologien aus.
Microservices bieten Flexibilität auf lange Sicht. Mit Microservices lassen sich komplexe, große und hochgradig skalierbare Systeme verwalten, da Anwendungen aus vielen unabhängig bereitstellbaren Diensten erstellt werden, die präzise und autonome Lebenszyklen haben.
Ein weiterer Vorteil ist, dass Microservices unabhängig voneinander horizontal hochskaliert werden können. Anstatt eine einzelne, monolithische Anwendung zu haben, die Sie als Einheit skalieren müssen, können Sie stattdessen bestimmte Microservices skalieren. Sie können nur den Funktionsbereich skalieren, der mehr Verarbeitungsleistung oder Netzwerkbandbreite benötigt, um die Nachfrage zu befriedigen, anstatt andere Bereiche der Anwendung zu skalieren, die nicht skaliert werden müssen. Dadurch sparen Sie auch Kosten, da Sie weniger Hardware benötigen.
Der Microservices-Ansatz ermöglicht flexible Änderungen und eine schnelle Iteration der einzelnen Microservices, da Sie spezifische, kleine Bereiche komplexer, großer und skalierbarer Anwendungen ändern können.
Das Entwerfen von Anwendungen, die auf präzisen Microservices basieren, ermöglicht eine fortlaufende Integration und kontinuierliche Bereitstellung und beschleunigt die Bereitstellung neuer Funktionen in der Anwendung. Sie können Mikroservices isoliert ausführen und testen und diese autonom weiterentwickeln, während Standard klare Verträge zwischen Diensten beibehalten. Solange Sie die Schnittstellen oder Verträge nicht ändern, können Sie die interne Implementierung jedes Microservices ändern oder eine neue Funktionalität hinzufügen, ohne dass andere Microservices in ihrer Funktion negativ beeinflusst werden.
Welche Rolle spielen Container?
Das Containerisieren ist ein Ansatz in der Softwareentwicklung, bei dem eine Anwendung oder ein Dienst sowie die zugehörigen Abhängigkeiten und Konfigurationen (abstrahiert als Bereitstellungsmanifestdateien) zusammen als Containerimage verpackt werden. Sie können die containerisierte Anwendung als Einheit testen und sie als Container-Image-Instanz auf dem Host-Betriebssystem bereitstellen.
Softwarecontainer fungieren als Standardeinheit der Softwarebereitstellung, die unterschiedliche Code und Abhängigkeiten enthalten kann. Dies ähnelt dem Transport von Containern aller Art per Schiff, Zug oder Lkw. Entwickler und IT-Fachleute können containerisierte Software verwenden, um Code und Abhängigkeiten in Umgebungen mit wenig oder ohne Änderungen bereitzustellen.
Es klingt, als wäre die Containerisierung einer Anwendung eine großartige Möglichkeit, das Architekturmuster für Microservices zu implementieren, und das ist sie auch. Die Vorteile der Verwendung von Containern entsprechen fast genau den Vorteilen der Verwendung einer Microservices-Architektur.
Hinweis
Das Containerisieren einer Anwendung ist nicht die einzige Möglichkeit, Microservices bereitzustellen. Sie können Microservices als einzelne Dienste in Azure App Service bereitstellen oder auf VMs. Außerdem gibt es viele weitere Möglichkeiten. Im weiteren Verlauf dieses Moduls werden wir Container für die Bereitstellung unserer Microservices verwenden.
Ein weiterer Vorteil der Containerisierung ist die Skalierbarkeit. Sie können schnell skalieren, indem Sie neue Container erstellen, die für kurzfristige Aufgaben verwendet werden sollen. Aus der Sicht einer Anwendung ähnelt das Instanziieren eines Images (Erstellen eines Containers) dem Instanziieren eines Prozesses wie ein Dienst oder eine Web-App.
Kurz gesagt bieten Container die Vorteile der Isolation, Portabilität, Agilität, Skalierbarkeit und Steuerung des gesamten Workflows des Lebenszyklus der Anwendung.
Die Microservices, die Sie in diesem Modul erstellen, werden in einem Docker-Container ausgeführt, der mit .NET CLI veröffentlicht wird.
.NET SDK-Containerveröffentlichung
In .NET 7 hat das .NET SDK die Möglichkeit erhalten, Containerimages über den Befehl dotnet publish
zu erstellen. Die Tools führen eine Reihe von Rückschlüssen basierend auf den Eigenschaften Ihres Projekts und deren Ausgaben aus. .NET erstellt dann dasselbe Image, das eine Dockerfile-Datei erstellen würde. Bereits zwei Befehle können ausreichen, um eine neue Anwendung zu erstellen und als Image zu veröffentlichen:
dotnet new webapi
dotnet publish --os linux --arch x64 /t:PublishContainer -c Release
Die vorherigen .NET CLI-Befehle erstellen eine neue Web-API und veröffentlichen die App als Container:
- Einstellen auf Linux als Betriebssystem (--os linux).
- Angeben einer x64-Architektur (--arch x64).
- Verwenden der Releasekonfiguration (-c Release).
Sie können über MSBuild-Eigenschaften viele Aspekte des generierten Containers steuern. Wenn Sie einen Befehl in einer Dockerfile verwenden können, um eine Konfiguration festzulegen, ist dies in der Regel auch über MSBuild möglich.
Warum sollten Microservices in .NET erstellt werden?
Beginnend mit .NET Core und bis zu den aktuellen Iterationen wurde .NET so entwickelt, dass es zuerst cloudnativ ist. Dies läuft plattformübergreifend, d.h. Ihr Docker-Image könnte auf einer Linux-Variante basieren, und Ihr .NET-Code läuft trotzdem. Microsoft hat bereits .NET-Images für Docker erstellt. Auch .NET ist extrem schnell. Der ASP.NET Kestrel-Webserver übertrifft routinemäßig andere Webserver.
Docker
Docker ist eine Open-Source-Plattform, die Sie zum Automatisieren der Bereitstellung von Anwendungen als portable, eigenständige Container, die in der Cloud oder lokal ausgeführt werden können, verwenden können. Docker ist auch das Unternehmen, das diese Technologie fördert und weiterentwickelt. Docker als Organisation arbeitet in Zusammenarbeit mit Cloud-, Linux- und Windows-Anbietern, einschließlich Microsoft.
Docker-Container können überall ausgeführt werden: lokal im Rechenzentrum des Kunden, bei einem externen Dienstanbieter oder in der Cloud. Docker-Imagecontainer können nativ unter Linux und Windows ausgeführt werden.
Was ist ein Image?
Wenn Entwickelnde Docker verwendet, erstellen sie eine App oder einen Dienst. Anschließend packen sie die App oder den Dienst und die zugehörigen Abhängigkeiten in einem Containerimage. Ein Image entspricht einer statischen Darstellung der Apps oder Dienste und von deren Konfigurationen und Abhängigkeiten.
Das Image, wenn es ausgeführt wird, wird zum Container. Der Container ist die In-Memory-Instanz eines Images.
Ein Containerimage ist unveränderlich. Nachdem Sie ein Image erstellt haben, kann dieses nicht mehr geändert werden. Da Sie ein Image nicht ändern können, erstellen Sie ein neues Image, wenn Sie Änderungen an der App oder dem Dienst und den zugehörigen Abhängigkeiten vornehmen müssen. Diese Funktion garantiert, dass das Image, das Sie in der Produktion verwenden, dasselbe Image ist, das auch in der Entwicklung und beim Testen verwendet wird.
Was ist eine Dockerfile-Datei?
Ein Dockerfile ist eine Textdatei, die Anweisungen zum Erstellen eines Docker-Images enthält. Dockerfile-Dateien werden in einer minimalen Skriptsprache geschrieben, die für das Erstellen und Konfigurieren von Images konzipiert ist. Dockerfiles dokumentieren auch die Vorgänge, die zum Erstellen eines Images ausgehend von einem Basisimage erforderlich sind.
Um ein Docker-Image zu erstellen, das Ihre Anwendung enthält, beginnen Sie in der Regel mit der Identifizierung eines Basisimages. Anschließend fügen Sie dem Basisimage weitere Dateien und Konfigurationen hinzu. Der Prozess zum Ermitteln eines geeigneten Basisimages beginnt in der Regel mit einer Suche auf Docker Hub. Sie suchen ein fertiges Image, das bereits ein Anwendungsframework sowie alle Hilfsprogramme und Tools einer Linux-Distribution umfasst, wie Ubuntu oder Alpine. Wenn Sie beispielsweise eine ASP.NET-Anwendung haben, die Sie in einem Container packen möchten, veröffentlicht Microsoft ein Image namens mcr.microsoft.com/dotnet/aspnet, das bereits die ASP.NET Runtime enthält.
Sie können ein Image anpassen, indem ein Container mit einem Basisimage gestartet und dann Änderungen daran vorgenommen werden. Änderungen umfassen in der Regel Aktivitäten wie das Kopieren von Dateien aus dem lokalen Dateisystem in den Container und die Ausführung verschiedener Tools und Dienstprogramme zum Kompilieren von Code.
Eine Dockerfile-Datei ist eine Reihe von Anweisungen, die ein Docker-Image erstellen, das die genaue Software enthält, die Sie zum Ausführen Ihrer Anwendung benötigen, einschließlich der Anwendung selbst.