Einführung
In den letzten zehn Jahren hat sich die Anwendungsentwicklung schnell weiterentwickelt, um mit dem technologischen Fortschritt und den Anforderungen der Verbraucher Schritt zu halten.
Während sich die traditionelle Entwicklung auf einen großen Codeblock stützte, werden die meisten Apps heute aus mehreren Minianwendungen erstellt oder Microservices , die jeweils für eine einzelne Funktionalität der App verantwortlich sind.
Zusammen bilden sie ein System, das als Microservice-Architektur bezeichnet wird.
Was sind Microservices?
Mikrodienste , oder besser gesagt die Microservice-Architektur , ist ein System zur Entwicklung einer Anwendung, das auf einer Auswahl einzelner Dienste aufbaut, die zusammenarbeiten, um eine nahtlose und reaktionsschnelle Leistung zu gewährleisten.
Wenn Sie eine Webanwendung mithilfe der Microservice-Architektur erstellen, teilen Sie sie in einzelne Funktionalitäten auf und entwickeln und implementieren jede als separate App.
Im Gegensatz zur monolithischen Entwicklung, bei der alles zusammengeführt und damit voneinander abhängig ist, besteht die Microservice-Architektur aus mehreren Modulen autonomer Komponenten. Es ist eine Art Architektur, die auf dem System der losen Kopplung beruht .
Hinweis :Lose Kopplung strukturiert ein System, in dem die Elemente nichts voneinander wissen, aber kommunizieren können.
Beispielsweise erfordert eine E-Commerce-Website viele verschiedene Dienste, einschließlich Online-Zahlungen, Rücksendungen, Benutzerprofile und so weiter. Um die Website zu erstellen, würden die Entwickler in Teams aufgeteilt, die jeweils für die Erstellung eines der verwendeten Microservices verantwortlich sind.
Wie kommunizieren Microservices miteinander?
Sobald Sie die Struktur verstanden haben, fragen Sie sich vielleicht, wie diese separaten Einheiten zusammenkommen, um einen harmonischen Dienst oder eine harmonische Anwendung zu erstellen. Die Antwort liegt in der Herstellung einer direkten, schnellen und fehlerfreien Kommunikation zwischen allen Diensten. Daher kommunizieren Microservices über APIs miteinander .
Anwendungsprogrammierschnittstelle (API ) ist ein Zugangspunkt für jede modulare Funktionalität, der es Modulen ermöglicht, miteinander zu interagieren. Ein Microservice verwendet diese Schnittstelle, um Anfragen von anderen Modulen zu senden und darauf zu antworten.
Jeder Microservice muss einen klar definierten API-Endpunkt haben (ein Ende eines Kommunikationskanals), um sicherzustellen, dass es für Anfragen immer zugänglich ist. In den meisten Fällen handelt es sich dabei um zustandslose REST-APIs . Ohne eindeutig definierte Endpunkte weiß das System nicht, wo es die benötigten Informationen suchen soll.
Daher würden DEV-Teams offizielle Standards und Muster verwenden, um Endpunkte untereinander zu teilen. Es liegt in ihrer Verantwortung, die REST-API durch Zusammenarbeit und klare Kommunikation einzurichten.
Der Unterschied zwischen herkömmlicher Architektur und Microservices-Architektur
Um ein besseres Verständnis von Microservices zu erhalten, vergleichen wir sie mit dem System, das vor ihrer Entwicklung verwendet wurde – monolithische Architektur .
Monolithische Architektur funktionierte gut für herkömmliche serverseitige Systeme. Dies sind Systeme, die auf einer einzigen Anwendung basieren. Alle Funktionalitäten befinden sich in einer Struktur, verwenden dasselbe Dateisystem, kommunizieren mit demselben Server und werden schließlich auf derselben Maschine bereitgestellt.
Diese Art von Architektur ermöglicht es Entwicklern, Anwendungen schneller zu erstellen, da sie nur die wesentlichen Funktionen erstellen müssen, denen sie später andere Funktionalitäten hinzufügen würden. Außerdem war die Leistung schneller, da der Prozess keine APIs umfasst.
Mit der Ausweitung von Webanwendungen entstand der Bedarf an Agilität und konsistenter Betriebszeit. Monolithische Architektur hatte zu viele Hindernisse, um mit diesen Anforderungen Schritt zu halten.
Nachteile der monolithischen Architektur
Da diese Systeme über einen eng gekoppelten Prozess verfügten, könnten alle am Code vorgenommenen Änderungen möglicherweise die Leistung der gesamten Anwendung gefährden. Die Funktionalitäten waren für ein neues technologisches Zeitalter, das ständige Innovationen und Anpassungen erforderte, zu voneinander abhängig.
Ein weiteres Problem bei monolithischer Architektur war die Unfähigkeit, einzelne Funktionalitäten zu skalieren. Ein entscheidender Aspekt erfolgreicher Unternehmen ist ihre Fähigkeit, mit den Anforderungen der Verbraucher Schritt zu halten. Natürlich hängen diese Anforderungen von verschiedenen Faktoren ab und schwanken im Laufe der Zeit.
Irgendwann muss Ihr Unternehmen nur eine bestimmte Funktion seines Dienstes skalieren, um auf eine wachsende Anzahl von Anfragen zu reagieren. Bei monolithischen Apps konnten Sie keine einzelnen Elemente skalieren, sondern mussten die Anwendung als Ganzes skalieren.
Vorteile von Microservices
Die Einführung von Microservices löste viele Probleme, die eine monolithische Entwicklung nicht lösen konnte.
1. Hochflexibel
Erstens ist die Microservice-Architektur sehr flexibel . Da jeder Microservice unabhängig ist, können Programmierer Module mit unterschiedlichen Sprachen oder Plattformen erstellen. Diese Module können dank APIs miteinander kommunizieren.
Darüber hinaus muss sich bei Microservices keine Organisation langfristig auf einen Technologie-Stack festlegen. So können Entwickler immer mit der neusten Technologie arbeiten.
2. Wiederverwendbare Funktionsmodule
Darüber hinaus ermöglicht diese Funktion Entwicklern, Funktionsmodule wiederzuverwenden und auf andere Anwendungen anwenden. Die Nutzung bereits verfeinerter Microservices spart Unternehmensressourcen und ermöglicht Entwicklern, sich auf andere Projekte zu konzentrieren.
3. Widerstandsfähig gegenüber Änderungen
Ein weiteres wichtiges Merkmal ist, dass das System Änderungen gegenüber sehr widerstandsfähig ist. Lose gekoppelt sind die Funktionalitäten innerhalb einer App nicht so voneinander abhängig. Entwickler können effizient neue Funktionen hinzufügen oder vorhandene ändern. Sie ändern den Code eines Moduls statt der gesamten Anwendung.
4. Skalierbar
Im Gegensatz zu monolithischen Apps eignen sich Microservices hervorragend für die Skalierung . Sie stellen sicher, dass Ihre Anwendung jederzeit betriebsbereit ist, ohne Geld für ungenutzte Module zu verschwenden. Da Sie Funktionalitäten auf verschiedenen Servern bereitstellen, erlaubt Ihnen das System, nur die benötigten Ressourcen zu skalieren.
5. Schnellere Entwicklungszyklen
In einem verteilten Modell wird die App in kleinere Dienste zerlegt. Wenn Ihre Organisation die agile Entwicklung eingeführt hat, können Ihre Teams sie einfacher aktualisieren und Entwicklungszyklen beschleunigen.
Aus geschäftlicher Sicht sind schnellere Entwicklungszyklen eine der größten Verbesserungen, die durch Microservices eingeführt werden.
6. Transparentes Modell
Neue Mitarbeiter werden beispielsweise den Code leichter verstehen und ändern können. Dies baut darauf auf, dass die App auf zahlreiche Dienste verteilt ist. Es ist einfacher, jeweils nur einen Microservice zu verwalten, als ein ganzes integriertes System in Angriff zu nehmen.
Nachteile von Microservices
1. Komplexität
Der größte Nachteil der Microservice-Architektur ist ihre Komplexität . Im Vergleich zu monolithischen Anwendungen verfügt das neu entwickelte System über viel mehr Komponenten. Diese Komponenten (Microservices) müssen für sich und innerhalb des Systems einwandfrei funktionieren.
2. Ausgaben
Dieses System ist auch teurer . Da Dienste auf mehreren Servern bereitgestellt werden, erfordert die Anwendung letztendlich eine größere Anzahl von CPUs und mehr Laufzeitumgebungen. Darüber hinaus tätigen Microservices aufgrund ihres Bedarfs an ständiger Kommunikation viele Remote-Aufrufe. Diese und andere Faktoren summieren sich und erfordern somit ein erweitertes Budget für die Entwicklung.
3. Sicherheit
Microservices erfordern auch eine höhere Sicherheit Maße. Wie oben erwähnt, kommunizieren Dienste über APIs miteinander. Das bedeutet, dass sie Informationen über das Netzwerk austauschen, was immer eine potenzielle Bedrohung darstellt. Aus diesem Grund müssen Wartung und Upgrades einwandfrei sein.
4. Leistung
Die Komplexität der Architektur beeinflusst auch ihre Leistung . Da Microservices mehrere JVM-Instanzen (Java Virtual Machine) und Kommunikation zwischen Prozessen umfassen, kann ihre Effizienz langsamer sein als bei monolithischen Apps.
PROS | NACHTEILE |
Unabhängigkeit der Dienste. Jeder Dienstcontainer hat seine eigene Geschäftslogik und konzentriert sich auf einzelne Geschäftsfähigkeiten. Die Architektur unterstützt einzelne einsetzbare Einheiten unabhängig voneinander. | Komplizierte Einrichtung. Aufgrund ihrer Individualität erfordert die Einrichtung des Systems mehr Konfiguration und Ressourcen, was zu einem Betriebsaufwand führt. |
Flexible/agile Bereitstellung. Jeder Microservice kann unabhängig skaliert werden, mit der Möglichkeit, verschiedene Technologien zu verwenden und auf verschiedenen Stacks und Produkten zu laufen. | Betriebliche Komplexität. Es ist schwieriger, Transaktionen über das Microservice-Ökosystem zu beheben, zu debuggen und zu verfolgen. Das Beheben von Problemen im System erfordert ein hohes Maß an Automatisierung. |
Fehlertolerant. Microservices sind lose gekoppelte Einheiten, die automatisch wiederhergestellt werden können. Diese Einheiten sind nicht voneinander abhängig, sodass Entwickler bei Bedarf die Verfügbarkeit jeder Einheit erhöhen können. | Sicherheitsrisiko. Obwohl isolierte Dienste fehlertoleranter sind, kann dieselbe Funktion Sicherheitsprobleme bei Transaktionen zwischen Einheiten aufwerfen. |
Unterstützt CI/CD. Da Microservices unabhängig bereitgestellt werden, können mehrere Instanzen gleichzeitig entwickelt und bereitgestellt werden. Daher führt dies zu schnelleren und häufigeren Software-Releases. | Koabhängige Schnittstellen. Dienste kommunizieren über Schnittstellen, die voneinander abhängig sind. Es ist unmöglich, eine Schnittstelle zu ändern, ohne die andere anzupassen. |
Optimiert das Hinzufügen neuer Funktionen. Es ist einfacher, neue Funktionen hinzuzufügen, indem Sie vorhandene Dienste ändern oder neue hinzufügen, ohne die Leistung anderer Dienste zu beeinträchtigen. | Langsamere Leistung. Im Vergleich zu monolithischen Anwendungen benötigen Microservices aufgrund ihrer komplexen Architektur und Kommunikation zwischen Prozessen mehr Zeit, um Aufgaben auszuführen. |
Herausforderungen bei der Einführung von Microservices
1. Entwerfen eines verteilten Modells
Die anfängliche Herausforderung bei der Einführung von Microservices besteht darin, ein zuverlässiges und nachhaltiges Modell zu entwerfen . Microservices verwenden ein lose verteiltes System, sodass die Wahrscheinlichkeit groß ist, dass Sie am Ende ein komplexes Design erhalten werden. Alle Systemabhängigkeiten müssen sorgfältig geprüft und berücksichtigt werden.
2. Integrationstest
Eine weitere Herausforderung sind die Integration und End-to-End-Tests. Testen wird schwieriger und doch wichtiger denn je. Microservices müssen miteinander kommunizieren und sich gegenseitig unterstützen, daher müssen alle Dienste fehlerfrei sein. Ein Fehler in einem Dienst kann einen schwerwiegenden Fehler in einem anderen verursachen. Aus diesem Grund ist kontinuierliches Testen mit Microservices von größter Bedeutung.
3. Bereitstellung
Wenn Sie immer noch manuell bereitstellen, muss Ihr Team zunächst Zeit in die Automatisierung des Prozesses investieren. Aufgrund der Komplexität verteilter Modelle wird die manuelle Bereitstellung viel zu komplex.
4. Überwachung und Protokollierung
Organisationen, die Microservices einführen, müssen ein zentralisiertes Überwachungs- und Protokollierungssystem einrichten . Wenn es nicht konfiguriert ist, wird das Identifizieren und Debuggen von Problemen unmöglich.
5. Fehlerbehebung
Aufgrund all der oben genannten Faktoren und anderer Komplexitäten wie Lastenausgleich und Latenz Debugging-Probleme , in einem verteilten System, ist komplex. Es gibt keine einfache Antwort darauf, welcher Ansatz am besten funktioniert, und es wird sicherlich einige Zeit dauern, bis Sie herausfinden, was für Ihr Projekt am besten funktioniert.
6. Andere Überlegungen
Schließlich muss sich Ihre Organisation an die Einführung eines Microservice-Modells anpassen. Die Art und Weise, wie Ihre Teams arbeiten und zusammenarbeiten, muss sich ändern. Treiben Sie einen Wandel in Ihrer Unternehmenskultur voran, um Ihre Teams auf Microservices vorzubereiten.
Beispiele für Microservices
Microservices in Java
Sie können Microservices in verschiedenen Sprachen entwickeln. Allerdings Java wird immer noch als eine der ersten Wahlen für die Erstellung von Anwendungen mit einer solchen Architektur angesehen.
Es gibt mehrere Microservice-Frameworks, die für die Entwicklung mit Java verwendet werden, darunter:
- Frühlingsstiefel
- Prahlerei
- Trikot
- Dropwizard
- JHipster
- Vert.x
- Spielen
Darüber hinaus wird das Microservice-Setup häufig zur Unterstützung einer Umgebung für maschinelles Lernen (ML) verwendet, da es mehrere Frameworks für maschinelles Lernen im Workflow zulässt. TensorFlow, Apache Mahout und Apache Singa sind Beispiele für ML-Frameworks, die mit Java verwendet werden.
Durch das Sammeln, Aggregieren und Analysieren des Datenflusses können die Frameworks Ergebnisse vorhersagen und einen Vergleich zwischen Modellen ermöglichen.
Microservices in Docker
Docker ist eine weitere großartige Software zum Erstellen von Microservices. Da Container verwendet werden, um virtuelle Umgebungen auszuführen, bietet die Plattform mehrere Möglichkeiten, Microservices zu organisieren:
- Jeder Container kann einem einzelnen Dienst zugeordnet werden.
- Ein einzelner Dienst kann in mehrere Container für separate Prozesse innerhalb des Dienstes aufgeteilt werden.
Container sind eine praktische Möglichkeit, Microservices zu isolieren. Sie sind leichtgewichtig, bereitstellbar und auf verschiedene Betriebssysteme und Infrastrukturen skalierbar.
Wenn Sie eine Docker-Anwendung mit mehreren Containern ausführen, ist Docker Compose ein Tool, mit dem Sie alle Ihre Microservices verwalten und konfigurieren können. Dies alles wird mit einem einzigen yaml
erledigt und führt die Aufgaben des Startens, Ausführens, Kommunizierens und Schließens von Containern mit einem einzigen koordinierten Befehl aus.
Multi-Container-Anwendungen mit zahlreichen Docker-Hosts lassen sich am besten mit einer Container-Orchestrierungsplattform wie Swarm verwalten oder Kubernetes. Beide Plattformen ermöglichen es Ihnen, Cluster von Servern mit jeweils mehreren Diensten darauf zu verwalten. Weitere Informationen zu den Unterschieden finden Sie in unserem Artikel Kubernetes vs. Docker Swarm.
Im Folgenden wird veranschaulicht, wie Container-Cluster verwaltet werden, wenn Swarm und Compose in einem einheitlichen System zusammenarbeiten.