Entwerfen einer Microservices-basierten Anwendung

Wenn Sie eine Anwendung mit der Microservices-Architektur entwerfen, sollten Sie die Best Practices für Microservices und die 12 Erfolgsmuster für die Entwicklung von Microservices einhalten. Diese Muster umfassen die Überlegungen zur 12-Faktor-App und basieren auf Erfahrungen in Microservices-Bereitstellungen neben einer konvergierten Datenbank.

Best Practices für das Entwerfen von Microservices kennenlernen

Durch die Befolgung bestimmter Best Practices beim Entwerfen von Microservices können Sie sicherstellen, dass Ihre Anwendung einfach zu skalieren, bereitzustellen und zu warten ist. Beachten Sie, dass möglicherweise nicht alle hier diskutierten Best Practices für Ihre Anwendung relevant sind.

Jeder Microservice muss eine einzelne Komponente der Anwendungsfunktionalität implementieren. Die Entwicklungsteams müssen die Grenzen und Verantwortlichkeiten der einzelnen Microservices definieren. Ein Ansatz besteht darin, einen Microservice für jede häufig angeforderte Aufgabe in der Anwendung zu definieren. Alternativ können Sie die Funktionalität nach Geschäftsaufgaben aufteilen und dann einen Microservice für jeden Bereich definieren.

Berücksichtigen Sie die folgenden Anforderungen in Ihrem Design:

  • Reaktionsfähige Microservices: Die Microservices müssen eine Antwort an die anfordernden Clients zurückgeben, selbst wenn der Service ausfällt.
  • Rückwärtskompatibilität: Wenn Sie die Funktionalität eines Microservice hinzufügen oder aktualisieren, dürfen sich die Änderungen an den API-Methoden und -Parametern nicht auf die Clients auswirken. Die REST-API muss abwärtskompatibel bleiben.
  • Flexible Kommunikation: Jeder Microservice kann das Protokoll angeben, das für die Kommunikation zwischen den Clients und dem API-Gateway sowie für die Kommunikation zwischen den Microservices verwendet werden muss.
  • Dempotenz: Wenn ein Kunde einen Microservice mehrmals aufruft, sollte er dasselbe Ergebnis erzielen.
  • Effizienter Betrieb: Das Design muss eine einfache Überwachung und Fehlerbehebung erleichtern. Zur Implementierung dieser Anforderung wird häufig ein Logsystem verwendet.

12 Erfolgsmuster für Microservices

Microservices sind schwer zu implementieren, und diese 12 Muster erleichtern es, die Vorteile der Agilität und Einfachheit einer Mircoservices-Architektur mit einer konvergierten Datenbankplattform neben Containern und Kubernetes zu nutzen.

  1. Gebundene Kontexte: Entwerfen Sie sie im Voraus, oder unterteilen Sie Monolithen mit einem Data Refactoring Advisor in Microservices.
  2. Lose Kopplung: Entkoppeln Sie Daten, indem Sie das Schema mit dem Microservice isolieren und ein zuverlässiges Ereignis-Mesh verwenden.
  3. CI/CD für Microservices: Eine mehrmandantenfähige Datenbank macht sie zu einer natürlichen Lösung für Microservices. Fügen Sie eine integrierbare Datenbank (PDB) hinzu, die unabhängig bereitgestellt und erstellt werden soll. Eine App (mit Jenkins) und ein Schema (Liquibase, Flyway und EBR in der Datenbank) sind ebenfalls eine gute Wahl.
  4. Sicherheit für Microservices: Sichern Sie jeden Endpunkt vom API-Gateway über den Load Balancer über das Ereignis-Mesh bis zur Datenbank.
  5. Einheitliche Beobachtbarkeit für Microservices: Metriken, Logs und Traces in einem einzigen Dashboard zur Optimierung und Selbstheilung.
  6. Transaktionsausgang: Senden einer Nachricht und eines Datenmanipulationsvorgangs in einer einzelnen lokalen Transaktion.
  7. Zuverlässiges Ereignis-Mesh: Ereignis-Mesh für alle Ereignisse mit transaktionalem Messaging und Pub und Sub mit hohem Durchsatz; mit Ereignistransformationen und Ereignisweiterleitung.
  8. Ereignisaggregation: Ereignisse sind flüchtig und benachrichtigen oder lösen Echtzeitaktionen aus. Danach werden sie in der Datenbank aggregiert. Die Datenbank ist das ultimative komprimierte Thema.
  9. Command Query Responsibility Segregation (CQRS): Gibt an, wo betriebliche und analytische Kopien von Daten für Microservices verfügbar sind.
  10. Sagas: Transaktionen über Microservices hinweg, mit Unterstützung durch Event Mesh und Escrow-Journaling in der Datenbank.
  11. Polyglot-Programmierung: Unterstützung für Microservices und Nachrichtenformate in einer Vielzahl von Sprachen, wobei JSON als Payload verwendet wird.
  12. Back-End-as-a-Service (BaaS): Eine Microservices-Infrastruktur, die für Test-, Entwicklungs- und Produktionsbereitstellungen (klein bis mittel) in beliebigen Cloud- oder On-Premise-Deployments geeignet ist; für Spring Boot Apps.

Mit einem gebundenen Kontextmuster beginnen

Das empfohlene Muster zum Implementieren von Persistenz für einen Microservice ist die Verwendung einer einzelnen integrierbaren Datenbank (PDB) in einer Containerdatenbank. Halten Sie die persistenten Daten für jeden Microservice privat, und erstellen Sie die integrierbare Datenbank als Teil der Microservice-Implementierung.

In diesem Muster können die privaten persistenten Daten nur über die Microservice-API aufgerufen werden.

Die folgende Abbildung zeigt das Persistenzdesign für Microservices.

Beschreibung von microservices_persistence.png folgt
Beschreibung der Abbildung microservices_persistence.png
Die folgenden Varianten dieser Microservice-Implementierung gelten für konvergierte Datenbanken:
  • Private Tabellen: Jeder Service besitzt eine Gruppe von Tabellen oder Dokumenten.
  • Schema: Jeder Service besitzt ein privates Datenbankschema oder eine private Collection.
  • Datenbank: Jeder Service besitzt eine integrierbare Datenbank innerhalb einer Containerdatenbank, wie in der Abbildung dargestellt.

Ein Persistenz-Antimuster für Ihre Microservices besteht darin, ein Datenbankschema über mehrere Microservices hinweg gemeinsam zu nutzen. Sie können atomare, konsistente, isolierte und dauerhafte Transaktionen zur Datenkonsistenz implementieren. Ein Vorteil bei diesem Anti-Muster ist, dass es eine einfache Datenbank verwendet. Die Nachteile sind, dass sich die Microservices beim Zugriff auf die Datenbank gegenseitig stören können, und die Entwicklungszyklen können sich verlangsamen, da Entwickler verschiedener Microservices die Schemaänderungen koordinieren müssen, was auch die Abhängigkeiten zwischen Services erhöht.

Ihre Microservices können eine Verbindung zu einer Oracle Database-Instanz herstellen, die auf Oracle Cloud Infrastructure ausgeführt wird. Die mehrmandantenfähige Oracle-Datenbank unterstützt mehrere integrierbare Datenbanken (PDBs) in einem Container. Dies ist die beste Wahl für die Persistenzschicht für Microservices, für die gebundene Kontextisolierung von Daten, Sicherheit und für High Availability. In vielen Fällen können weniger PDBs mit Isolation auf Schemaebene verwendet werden.

Nutzen der Bereitstellung von Microservices in Containern verstehen

Nachdem Sie Ihren Microservice erstellt haben, müssen Sie ihn containerisieren. Ein Microservice, der in einem eigenen Container ausgeführt wird, wirkt sich nicht auf die Microservices aus, die in den anderen Containern bereitgestellt werden.

Ein Container ist eine standardisierte Softwareeinheit, die zum Entwickeln, Versenden und Bereitstellen von Anwendungen verwendet wird.

Container werden mit einer Container-Engine wie Docker verwaltet. Die Container Engine stellt die Tools bereit, die erforderlich sind, um alle Anwendungsabhängigkeiten als Container zu bündeln.

Sie können die Docker-Engine verwenden, um Ihre Microservices-Anwendungen in Containern zu erstellen, bereitzustellen und auszuführen. Microservices, die in Docker-Containern ausgeführt werden, weisen die folgenden Merkmale auf:

  • Standard: Die Microservices sind portabel. Sie können überall laufen.
  • Leichtgewichtig: Docker teilt sich den Betriebssystem-(BS-)Kernel, benötigt nicht für jede Instanz ein BS und wird als einfacher Prozess ausgeführt.
  • Sicher: Jeder Container wird als isolierter Prozess ausgeführt. Die Microservices sind also sicher.

Der Prozess der Containerisierung eines Microservice umfasst das Erstellen einer Dockerfile, das Erstellen und Erstellen eines Containerimages, das seine Abhängigkeiten und die Umgebungskonfiguration enthält, das Deployment des Images in einer Docker-Engine und das Hochladen des Images in eine Container-Registry zum Speichern und Abrufen.

Beschreibung von docker_container_process.png folgt
Beschreibung der Abbildung docker_container_process.png

Erfahren Sie mehr über die Orchestrierung von Microservices mit Kubernetes

Die Microservices, die in Containern ausgeführt werden, müssen interagieren und integrieren können, um die erforderlichen Anwendungsfunktionen bereitzustellen. Diese Integration kann durch Containerorchestrierung erreicht werden.

Mit der Containerorchestrierung können Sie Container in Clustern starten, stoppen und gruppieren. Es ermöglicht auch High Availability und Skalierung. Kubernetes ist eine der Container-Orchestrierungsplattformen, mit denen Sie Container verwalten können.

Nachdem Sie Ihre Microservices containerisiert haben, können Sie sie in Oracle Cloud Infrastructure Container Engine for Kubernetes bereitstellen.

Bevor Sie Ihre containerisierte Microservices-Anwendung in der Cloud bereitstellen, müssen Sie sie wie folgt in einer lokalen Kubernetes-Engine bereitstellen und testen:

  • Erstellen Sie Ihre Microservices-Anwendung.
  • Erstellen Sie Docker-Images, um Ihre Microservices zu containerisieren.
  • Führen Sie Ihre Microservices in der lokalen Docker-Engine aus.
  • Übertragen Sie die Containerimages per Push an eine Containerregistrierung.
  • Stellen Sie Ihre Microservices bereit, und führen Sie sie in einer lokalen Kubernetes-Engine wie Minikube aus.

Nachdem Sie die Anwendung in einer lokalen Kubernetes-Engine getestet haben, stellen Sie sie wie folgt in Oracle Cloud Infrastructure Container Engine for Kubernetes bereit:

  • Cluster erstellen.
  • Laden Sie die Datei kubeconfig herunter.
  • Installieren Sie das Tool kubectl auf einem lokalen Gerät.
  • Bereiten Sie die Datei deployment.yaml vor.
  • Stellen Sie den Microservice für das Cluster bereit.
  • Testen Sie den Microservice.

Das folgende Diagramm zeigt den Prozess zum Deployment einer containerisierten Microservices-Anwendung in Oracle Cloud Infrastructure Container Engine for Kubernetes.

Beschreibung von oke_deployment_process.png folgt
Beschreibung der Abbildung oke_deployment_process.png

Informationen zu Oracle Backend for Spring Boot and Microservices

Spring Boot ist das beliebteste Framework für die Erstellung von Microservices in Java. Eines der 12 Erfolgsmuster für die erfolgreiche Bereitstellung der Microservices-Architektur ist das Backend-as-a-Service-(BaaS-)Muster. Oracle BaaS ist im OCI Marketplace verfügbar und kann innerhalb von 30 Minuten mit Terraform und Ansible bereitgestellt werden. Oracle BaaS stellt eine Reihe von Plattformservices bereit, die für das Deployment und den Betrieb von Microservices erforderlich sind. Sie sind integraler Bestandteil der Spring Boot-Umgebung. Die Details der Oracle Backend for Spring Boot and Microservices-Plattform sind im folgenden Diagramm dargestellt.