Microservices sind ein heißes Thema in der Softwareentwicklung, und das aus gutem Grund. Durch die Aufteilung einer monolithischen Anwendung in kleinere, unabhängig voneinander einsetzbare Dienste können Teams die Geschwindigkeit und Flexibilität ihres Entwicklungsprozesses erhöhen. Die Bereitstellung und Verwaltung von Microservices in einer Produktionsumgebung ist jedoch eine Herausforderung. Deshalb ist es wichtig, Best Practices zu befolgen, um die Stabilität und Zuverlässigkeit deines Microservices-basierten Systems zu gewährleisten.
Führende Unternehmen haben diese Praktiken getestet und die Leistung und Zuverlässigkeit von Microservices-basierten Systemen erheblich verbessert. Lies also weiter, wenn du das Beste aus deinen Microservices herausholen willst!
Warum Microservices
Microservices werden für Unternehmen verwendet, die von traditionellen Lizenzierungs- zu Abonnementmodellen, wie SaaS-Lösungen, übergehen. Dies ist oft notwendig, wenn von einer On-Premise-Bereitstellung zu einer globalen, öffentlichen Cloud-Bereitstellung mit elastischen Funktionen übergegangen wird. Unternehmen wie Atlassian haben ihre Produkte in Microservices umgewandelt und in der Cloud bereitgestellt, um ihre Anwendungen weltweit verfügbar zu machen. Microservices sind jedoch komplex und nicht für jedes Unternehmen geeignet, vor allem nicht für Startups in der Anfangsphase.
Für Unternehmen ist der Übergang von einem traditionellen Lizenzmodell zu einem abonnementbasierten Modell von entscheidender Bedeutung, um in der digitalen Landschaft von heute bestehen zu können. Die Vorteile dieser Umstellung lassen sich am Erfolg von SaaS-Lösungen wie Google Mail ablesen, bei denen die Kunden nur eine geringe monatliche Gebühr für den Zugang zu einer breiten Palette von Funktionen zahlen.
Dieses Konzept lässt sich auch auf Microservices anwenden und macht sie zu einem unverzichtbaren Werkzeug für Unternehmen, die diesen Wandel vollziehen wollen. Nehmen wir zum Beispiel Atlassian und sein Produkt Jira. Bisher wurde Jira in On-Premise-Umgebungen eingesetzt, doch für die Umstellung auf ein abonnementbasiertes Modell benötigte das Unternehmen eine globale Reichweite, die nur in der Public Cloud erreicht werden kann. Dieser Schritt ermöglichte Elastizität, so dass die Anwendung je nach Bedarf horizontal skaliert und ohne Einschränkungen an Laständerungen angepasst werden konnte.
Best Practice Nr. 1: Definiere klare Verantwortlichkeiten und Zuständigkeiten für jeden Microservice
Einer der Hauptvorteile von Microservices besteht darin, dass sie es Teams ermöglichen, unabhängiger zu arbeiten und schneller voranzukommen. Diese Unabhängigkeit kann jedoch auch zu Verwirrung darüber führen, wer für die einzelnen Dienste verantwortlich ist.
Deshalb ist es wichtig, die Verantwortlichkeit für jeden Microservice zu definieren. Das bedeutet, dass die Verantwortung einem bestimmten Team oder einer bestimmten Person zugewiesen wird und dass dieses Team oder diese Person für die Entwicklung, die Wartung und den Support des Dienstes verantwortlich ist.
Durch die Festlegung klarer Zuständigkeiten und Verantwortlichkeiten kannst du sicherstellen, dass jeder Microservice von einem engagierten Team betreut wird, das sich auf seinen Erfolg konzentriert. Darüber hinaus hilft die IT dabei, Probleme wie Verzögerungen bei der Behebung von Fehlern oder der Implementierung neuer Funktionen zu vermeiden, da klar ist, wer für die Lösung dieser Probleme verantwortlich ist.
Doch wie legst du die Verantwortlichkeiten für deine Microservices fest?
Option 1: Individuelle Verantwortung für eine Reihe von Services
Ein Ansatz ist die Verwendung eines Service-Ownership-Modells, bei dem jedes Team oder jeder Einzelne für eine bestimmte Gruppe von Services verantwortlich ist. Jedes SCRUM-Team liefert eine Lösung, einen Satz von Komponenten (Microservices). Mit Option 1 wird sichergestellt, dass jeder Dienst einen eigenen Verantwortlichen hat, der für seinen Erfolg verantwortlich ist.
Option 2: Individuelle Verantwortung für eine Reihe von Features
Eine weitere Option ist die Verwendung eines Feature-Ownership-Modells, bei dem jedes Team oder jeder Einzelne für die Entwicklung und Pflege eines bestimmten Satzes von Features über mehrere Services hinweg verantwortlich ist. Option 2 kann eine gute Möglichkeit sein, wenn du nur eine kleine Anzahl von Diensten hast oder wenn die Funktionen, die du entwickelst, mehrere Dienste umfassen.
Unabhängig davon, welchen Ansatz du wählst, musst du sicherstellen, dass die Zuständigkeiten und Verantwortlichkeiten klar definiert sind und an alle Teammitglieder weitergegeben werden. So sollte beispielsweise jeder Entwickler für ein Feature, die Bereitstellung und den Hypercare-Support verantwortlich sein. Auf diese Weise wird sichergestellt, dass jeder weiß, wer für den jeweiligen Microservice verantwortlich ist, und Verwirrung und Verzögerungen im Entwicklungsprozess können vermieden werden.
Best Practice Nr. 2: Versionierung und semantische Versionierung für alle Microservices verwenden
Bei der Arbeit mit Microservices ist es wichtig, den Überblick über die verschiedenen Versionen der einzelnen Dienste zu behalten. So kannst du bei Problemen mit einer neuen Version zu einer früheren Version zurückkehren und sicherstellen, dass im gesamten System die richtige Version eines jeden Dienstes verwendet wird.
Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Versionierung für deine Microservices. Bei der Versionierung wird jeder Version eines Microservices eine Versionsnummer zugewiesen, z. B. 1.0, 1.1 usw. Auf diese Weise kannst du die verschiedenen Versionen deiner Microservices leicht nachverfolgen.
Es ist jedoch auch eine gute Idee, die semantische Versionierung für deine Microservices zu verwenden. Bei der semantischen Versionierung wird eine dreiteilige Versionsnummer verwendet (z. B. 1.2.3), wobei die Teile jeweils für die Hauptversion, die Nebenversion und die Patch-Nummer stehen. Die Hauptversion wird bei signifikanten Änderungen erhöht, die Nebenversion bei neuen abwärtskompatiblen Funktionen und die Patch-Nummer bei Fehlerbehebungen und anderen kleineren Änderungen.
Die semantische Versionierung kann es einfacher machen, die Auswirkungen einer neuen Version zu verstehen, und sie kann auch dazu beitragen, dass im gesamten System die richtige Version jedes Dienstes verwendet wird. Daher ist es eine gute Idee, sowohl die Versionierung als auch die semantische Versionierung für deine Microservices zu verwenden, um sicherzustellen, dass du ein klares und umfassendes Verständnis für die verschiedenen Versionen der einzelnen Services hast.
Zum Beispiel sollte das gesamte Mono-Repository mit einer Reihe von Microservices für eine Geschäftsdomäne mit einem semver2-Tag versioniert werden. Das Tag könnte in Form eines git annotated tag vorliegen, was ein Objekt in Git ist.
Best Practice Nr. 3: Verwende eine CI/CD-Pipeline für automatisiertes Testen und Deployment
Bist du es leid, deine Microservices manuell zu testen und bereitzustellen? Dann ist es an der Zeit, den Einsatz einer CI/CD-Pipeline (Continuous Integration and Delivery) in Betracht zu ziehen.
Eine CI/CD-Pipeline ist eine Reihe von automatisierten Prozessen, die das Testen, Bereitstellen und Freigeben deiner Microservices übernehmen. Sie ermöglicht es dir, viele Aufgaben im Entwicklungs- und Bereitstellungsprozess zu automatisieren, z. B. das Erstellen, Testen und Bereitstellen deines Codes. Auf diese Weise kannst du den Entwicklungsprozess beschleunigen und die Zuverlässigkeit deines auf Microservices basierenden Systems verbessern.
Für das Einrichten einer CI/CD-Pipeline stehen mehrere Tools und Plattformen zur Verfügung, darunter Jenkins, CircleCI und AWS CodePipeline. Jede Anwendung verfügt über spezielle Funktionen und Möglichkeiten, daher ist es wichtig, diejenige zu wählen, die deinen Anforderungen am besten entspricht.
Die Bereitstellungslogik sollte vom ersten Tag an zusammen mit dem Mono-Repository vorbereitet werden. Der Arbeitsablauf sieht so aus, dass ein Entwickler, wenn er eine Übergabe vornimmt, den Build (Kompilieren des Artefakts und Veröffentlichen des Images im Docker-Hub) des Projekts in der CI startet. Schließlich wird das Projekt auf der Hosting-Plattform, z. B. EKS, bereitgestellt, so dass du prüfen kannst, ob der Code bereitgestellt werden kann, das REPL-Feeling hast und das Ergebnis den Produktverantwortlichen zeigen kannst.
Durch den Einsatz einer CI/CD-Pipeline kannst du das Testen und Bereitstellen deiner Microservices automatisieren und deinen Teams den Rücken freihalten, damit sie sich auf die Entwicklung und Verbesserung deiner Services konzentrieren können.
Best Practice Nr. 4: Verwende Container und Container-Orchestrierungstools:
Bist du es leid, deine Microservices manuell bereitzustellen und zu skalieren? Dann ist es an der Zeit, den Einsatz von Containern und Container-Orchestrierungstools in Betracht zu ziehen.
Mit Containern kannst du deine Microservices und deren Abhängigkeiten in einer einzigen Einheit verpacken, was die Bereitstellung und Ausführung in verschiedenen Umgebungen erleichtert. So reduzierst du den Zeit- und Arbeitsaufwand für die Bereitstellung und Skalierung deiner Microservices und verbesserst deren Zuverlässigkeit.
Neben der Verwendung von Containern empfiehlt sich auch der Einsatz eines Container-Orchestrierungs-Tools zur Verwaltung der Bereitstellung und Skalierung deiner Microservices. Mit diesen Tools kannst du das Deployment, die Skalierung und die Verwaltung deiner Container automatisieren und so die Ausführung und Wartung deines auf Microservices basierenden Systems vereinfachen.
Außerdem sollte jeder Microservice containerisiert und in einem Docker-Hub mit einem geeigneten semver2-Tag veröffentlicht werden.
Einige beliebte Tools zur Container-Orchestrierung sind Kubernetes, Docker Swarm und Mesos.
Durch den Einsatz von Containern und Container-Orchestrierungstools kannst du die Bereitstellung und Verwaltung deiner Microservices rationalisieren und deinen Teams den Rücken freihalten, um sich auf die Entwicklung und Verbesserung deiner Services zu konzentrieren.
Best Practice Nr. 5: Verwende ein API-Gateway, um den externen Zugriff auf Microservices zu verwalten
Wenn externe Clients, z. B. mobile Anwendungen oder Web-Clients, auf dein auf Microservices basierendes System zugreifen, verwende ein API-Gateway, um den Zugriff auf deine Microservices zu verwalten. Wenn deine Microservices (meist REST-API) Modelle offenlegen, die nicht ausreichen, um dein Modell zu erstellen, dann sollte eine GraphQL-API präsentiert werden, eine Art Fassade, die Backed for Frontend (BFF) genannt wird.
Was ist ein API-Gateway?
Ein API-Gateway ist eine Schicht, die zwischen deinen Clients und deinen Microservices sitzt und dafür verantwortlich ist, Anfragen von Clients an den entsprechenden Microservice weiterzuleiten und die Antwort an den Client zurückzugeben. Es kann auch Authentifizierungs-, Ratenbegrenzungs- und Caching-Aufgaben übernehmen.
Durch den Einsatz eines API-Gateways kannst du die Sicherheit und Leistung deines Systems verbessern. Es fungiert als zentraler Einstiegspunkt für externen Datenverkehr und kann bestimmte Aufgaben von deinen Microservices abnehmen. Außerdem lässt sich der externe Zugriff auf deine Microservices leichter verwalten und überwachen, da du alle Anfragen und Antworten über das Gateway verfolgen und protokollieren kannst.
Mehrere Optionen für die Implementierung eines API-Gateways umfassen die Verwendung eines Drittanbieterdienstes oder die Erstellung eines eigenen Gateways mit Tools wie Kong oder Tyk.
Wenn du darüber hinaus sicherheitsrelevante Fragen wie Keycloak und IDS klären willst, solltest du insbesondere API-Gateway-Komponenten wie Kong
Durch den Einsatz eines API-Gateways kannst du die Sicherheit und Leistung deines auf Microservices basierenden Systems verbessern und die Verwaltung des externen Zugriffs auf deine Services erleichtern.
Best Practice Nr. 6: Überwache den Zustand und die Leistung von Microservices:
Bei der Arbeit mit Microservices ist es von entscheidender Bedeutung, den Zustand und die Leistung der einzelnen Services zu überwachen, um sicherzustellen, dass sie reibungslos funktionieren und die Anforderungen deines Systems erfüllen.
Es gibt verschiedene Tools und Techniken, die du zur Überwachung des Zustands und der Leistung deiner Microservices einsetzen kannst, darunter:
- Tools zur Überwachung der Anwendungsleistung (APM): Diese Tools verfolgen die Leistung deiner Microservices und geben Aufschluss über mögliche Probleme oder Engpässe.
- Tools zur Protokollanalyse: Mit diesen Tools kannst du die von deinen Microservices generierten Protokolle analysieren, um Fehler, Leistungsprobleme und andere wichtige Informationen zu ermitteln.
- Tools für Lasttests: Mit diesen Tools kannst du die Belastung deiner Microservices simulieren, um deren Leistung zu testen und mögliche Probleme zu erkennen.
Mit diesen und anderen Tools und Techniken kannst du den Zustand und die Leistung deiner Microservices überwachen und auftretende Probleme erkennen und beheben. So stellst du sicher, dass deine Microservices reibungslos funktionieren und die Anforderungen deines Systems erfüllen.
Best Practice Nr. 7: Implementiere eine rollierende Bereitstellungsstrategie:
Wenn du Updates für deine Microservices bereitstellst, solltest du daran denken, dass es wichtig ist, Ausfallzeiten und Unterbrechungen deines Systems zu minimieren. Eine Möglichkeit, dies zu erreichen, ist die Implementierung einer rollenden Bereitstellungsstrategie.
Bei einer Rolling Deployment-Strategie stellst du Updates für mehrere Microservices gleichzeitig bereit und führst das Update dann schrittweise für den Rest des Systems ein. Auf diese Weise kannst du die Aktualisierung in kleinem Maßstab testen, bevor du sie für das gesamte System bereitstellst, wodurch das Risiko von Unterbrechungen oder Problemen minimiert wird.
Für die Implementierung einer Strategie der schrittweisen Bereitstellung gibt es folgende Ansätze:
- Blue-Green-Bereitstellung: Dabei werden die Aktualisierungen in einer separaten "grünen" Umgebung bereitgestellt und der Datenverkehr von der "blauen" Umgebung umgeschaltet, sobald die Aktualisierung getestet wurde und in Betrieb genommen werden kann.
- Kanarische Bereitstellung: Hierbei werden die Updates für einen kleinen Prozentsatz der Benutzer bereitgestellt und der Anteil im Laufe der Zeit schrittweise erhöht, während du auf Probleme achtest.
Durch die Implementierung einer rollierenden Bereitstellungsstrategie kannst du Ausfallzeiten und Unterbrechungen während der Aktualisierungen minimieren und einen reibungslosen und zuverlässigen Bereitstellungsprozess gewährleisten.
Best Practice Nr. 8: Verwende ein zentrales Protokollierungs- und Überwachungssystem
Bei der Arbeit mit Microservices ist es wichtig, eine Möglichkeit zu haben, den allgemeinen Zustand und die Leistung deines Systems zu überwachen. Eine Möglichkeit, dies zu tun, ist die Verwendung eines zentralisierten Protokollierungs- und Überwachungssystems.
Mit einem zentralisierten Protokollierungs- und Überwachungssystem kannst du Protokolle und andere Daten von deinen Microservices an einem einzigen Ort sammeln und analysieren, was die Verfolgung des allgemeinen Zustands und der Leistung deines Systems erleichtert. Auf diese Weise kannst du Probleme schneller erkennen und beheben, da du alle relevanten Daten an einem Ort sehen kannst.
Es gibt mehrere Optionen für die Implementierung eines zentralen Protokollierungs- und Überwachungssystems, einschließlich der Verwendung eines Drittanbieterdienstes wie Splunk oder der Erstellung eines eigenen Systems mit Tools wie Elasticsearch und Logstash. Es ist wichtig, die Option zu wählen, die deinen Anforderungen und deinem Budget am besten entspricht.
Mit einem zentralen Protokollierungs- und Überwachungssystem kannst du den Gesamtzustand und die Leistung deines auf Microservices basierenden Systems verfolgen und alle auftretenden Probleme erkennen und beheben. Warum also nicht ausprobieren?
Best Practice Nr. 9: Verwende Schutzschalter und Abschottungen, um Kaskadenausfälle zu verhindern
Bei der Arbeit mit Microservices ist es wichtig zu verhindern, dass Probleme in einem Service das gesamte System beeinträchtigen. Eine Möglichkeit, dies zu erreichen, ist die Verwendung von Stromkreisunterbrechern und Trennwänden.
Ein Circuit-Breaker ist ein Muster, das es einem Dienst ermöglicht, schnell zu versagen und die Verarbeitung von Anfragen zu stoppen, wenn ein Problem auftritt, anstatt zu versuchen, die Verarbeitung fortzusetzen und möglicherweise weitere Probleme zu verursachen, um kaskadierende Ausfälle zu verhindern und die Gesamtstabilität des Systems zu schützen.
Ein Bulkhead ist ein Muster, mit dem du verschiedene Teile deines Systems isolieren kannst, so dass sich Probleme in einem Teil nicht auf den Rest des Systems auswirken. Auf diese Weise verhinderst du kaskadenartige Ausfälle erhhöhst die Stabilität des Gesamtsystems.
Durch den Einsatz von Leistungsschaltern und Trennwänden kannst du verhindern, dass sich Probleme in einem Dienst auf das gesamte System auswirken, und die Stabilität und Zuverlässigkeit deines auf Microservices basierenden Systems sicherstellen.
Best Practice Nr. 10: Implementierung einer angemessenen Teststrategie
Wenn du mit Microservices arbeitest, solltest du die Stabilität und Zuverlässigkeit deines Systems sicherstellen, indem du deine Microservices ordnungsgemäß testest. Es gibt mehrere Arten von Tests, die du in Betracht ziehen solltest, darunter:
- Unit-Tests: Hierbei werden einzelne Codeeinheiten getestet, um sicherzustellen, dass sie korrekt funktionieren.
- Integrationstests: Hierbei wird die Integration zwischen verschiedenen Microservices getestet, um sicherzustellen, dass sie korrekt zusammenarbeiten.
- Leistungstests: Hierbei wird die Leistung deiner Microservices unter verschiedenen Lasten und Bedingungen getestet, um sicherzustellen, dass sie die Anforderungen deines Systems erfüllen.
- Chaos-Tests: Hierbei werden absichtlich Ausfälle oder andere Störungen in dein System eingeführt, um seine Widerstandsfähigkeit zu testen und sicherzustellen, dass es sich von Ausfällen erholen kann.
Fazit
Durch die Umsetzung einer geeigneten Teststrategie und regelmäßige Tests deiner Microservices kannst du die Stabilität und Zuverlässigkeit deines auf Microservices basierenden Systems sicherstellen.
Unternehmen, die in der Lage sind, neue Features und Funktionen in der heutigen schnelllebigen Geschäftswelt schnell und zuverlässig bereitzustellen, haben einen erheblichen Wettbewerbsvorteil. Microservices können ein leistungsfähiges Tool für die schnelle Entwicklung und Bereitstellung sein, aber sie bringen auch neue Herausforderungen bei der Bereitstellung und Verwaltung mit sich.
Die 10 Best Practices, die in diesem Artikel beschrieben werden, bieten einen Fahrplan für die erfolgreiche Bereitstellung und Verwaltung von Microservices in einer Produktionsumgebung. Wenn Unternehmen diese Best Practices befolgen, können sie sicherstellen, dass ihre Microservices stabil und zuverlässig sind und die bestmögliche Leistung erbringen. Auf diese Weise können sie neue Features und Funktionen schneller bereitstellen und der Konkurrenz einen Schritt voraus sein.
Neben der Verbesserung der Leistung von Microservices tragen diese Best Practices auch dazu bei, das Risiko kostspieliger Ausfallzeiten und Ausfälle zu verringern. Außerdem verbessern Sie die allgemeine Zuverlässigkeit und Stabilität der Systeme. Sie schützen den Ruf deines Unternehmens und die Kundenzufriedenheit, was letztlich zum Geschäftserfolg beiträgt.
Daher sind diese Best Practices ein Muss für jedes Unternehmen, das das Beste aus seinen Microservices-basierten Systemen herausholen möchte. Mach den ersten Schritt zur Umsetzung dieser Best Practices und überzeug dich selbst von den Vorteilen.



