Heim > Java > javaLernprogramm > Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

php是最好的语言
Freigeben: 2018-07-27 11:59:40
Original
3156 Leute haben es durchsucht
Seit 2015 bin ich mit der auf Docker basierenden Containertechnologie in Kontakt gekommen. Als Docker-DevOps-Praktiker habe ich mehr als zwei Jahre lang auch die rasante Entwicklung des technischen Systems von Docker miterlebt. In diesem Artikel wird hauptsächlich eine einfache Zusammenfassung basierend auf dem praktischen Prozess der im Unternehmen erstellten Microservice-Architektur erstellt. Ich hoffe, dass ich DevOps-Studenten einen Hinweis geben kann, die sich mit der Gestaltung eines Service-Architektursystems in den frühen Phasen der Unternehmensgründung befassen oder sich ein erstes Verständnis der Architektur auf Unternehmensebene aneignen möchten.

Microservice und Docker

Bezüglich des technischen Aufbaus von Startups sagen viele Stimmen grundsätzlich, dass Startups schnell online gehen und schnell ausprobieren müssen. Schnelle Integration, Entwicklung und Veröffentlichung mit einer einzigen Anwendung oder der Trennung von Front-End- und Back-End-Anwendungen. Tatsächlich werden die durch dieses Ergebnis verursachten versteckten Kosten jedoch höher sein. Wenn sich das Unternehmen weiterentwickelt und es mehr Entwickler gibt, wird es mit dem Problem der Effizienz bei der Bereitstellung großer Systeme und der Effizienz der Entwicklungszusammenarbeit konfrontiert. Anschließend wird die Struktur durch die Aufteilung von Diensten, die Trennung von Lesen und Schreiben von Daten, Unterdatenbanken und Untertabellen usw. umstrukturiert. Darüber hinaus wird diese Methode, wenn sie gründlich durchgeführt werden soll, viel Personal und Material erfordern Ressourcen.

Mein persönlicher Vorschlag ist, dass DevOps mit Ihrer eigenen Einschätzung der aktuellen und langfristigen Entwicklung des Unternehmens kombiniert werden sollte und Sie die Microservice-Architektur in den frühen Phasen des Projekts nutzen können, was der Zukunft zugute kommen wird Generationen.
Mit der Entwicklung der Open-Source-Community rund um Docker kann das Konzept der Microservice-Architektur einen besseren Implementierungsplan haben. Und innerhalb jeder Microservice-Anwendung kann die hexagonale Architektur von DDD (Domain-Drive Design) für das In-Service-Design verwendet werden. Für einige Konzepte zu DDD können Sie auch auf mehrere zuvor verfasste Artikel verweisen: Domänengesteuerte Designorganisation – Konzepte und Architektur, Domänengesteuerte Designorganisation – Entitäts- und Wertobjektdesign, Domänendienste, Domänenereignisse.

Klare Mikroservice-Domänenaufteilung, elegante Implementierung von Architekturebenen innerhalb des Dienstes, notwendiger IPC zwischen Diensten über RPC oder ereignisgesteuert und API-Gateway für die Anforderungsweiterleitung aller Mikrodienste, nicht blockierende Anforderungsergebnisse, die zusammengeführt werden sollen. Im folgenden Artikel wird detailliert beschrieben, wie Sie mit Docker schnell eine Microservice-Architektur mit den oben genannten Merkmalen in einer verteilten Umgebung erstellen können.

Service Discovery-Modell

Wenn Sie Docker-Technologie zum Aufbau eines Microservice-Systems verwenden, ist Service Discovery ein unvermeidliches Thema. Derzeit gibt es zwei gängige Diensterkennungsmodi: den Client-Erkennungsmodus und den Server-Erkennungsmodus.
Client-Erkennungsmodus
Das Architekturdiagramm des Client-Erkennungsmodus lautet wie folgt:
Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Die typische Implementierung des Client-Erkennungsmodus ist die Netflix-Systemtechnologie. Der Client fragt alle verfügbaren Service-Instanzen bei einem Service-Registrierungs-Service-Center ab. Der Client verwendet einen Lastausgleichsalgorithmus, um eine von mehreren verfügbaren Dienstinstanzen auszuwählen und stellt dann eine Anfrage. Eine typische Open-Source-Implementierung ist Eureka von Netflix.

Netflix-Eureka
Der Kunde von Eureka übernimmt einen Selbstregistrierungsmodus. Der Kunde muss für die Verarbeitung der Registrierung und Abmeldung von Dienstinstanzen und das Senden von Heartbeats verantwortlich sein.
Wenn Sie SpringBoot zur Integration eines Microservices verwenden, kann die automatische Registrierung einfach durch die Kombination mit dem SpringCloud-Projekt erreicht werden. Fügen Sie @EnableEurekaClient zur Dienststartklasse hinzu, um den Dienst beim Start der Dienstinstanz beim konfigurierten Eureka-Server zu registrieren und regelmäßig Heartbeats zu senden. Der clientseitige Lastausgleich wird durch Netflix Ribbon implementiert. Das Service-Gateway nutzt Netflix Zuul und der Leistungsschalter nutzt Netflix Hystrix.

Zusätzlich zum unterstützenden Framework für die Serviceerkennung bietet Netflix-Feign von SpringCloud eine deklarative Schnittstelle zur Bearbeitung von Rest-Anfragen für Services. Natürlich können Sie neben FeignClient auch Spring RestTemplate verwenden. Wenn Sie @FeignClient im Projekt verwenden, ist der Code besser lesbar und die Rest-API ist auf einen Blick klar.

Die Registrierungsverwaltung und die Abfrage von Serviceinstanzen erfolgen alle durch Aufrufen der von Eureka bereitgestellten REST-API-Schnittstelle innerhalb der Anwendung (natürlich ist es nicht erforderlich, diesen Teil des Codes zu schreiben, wenn Sie SpringCloud-Eureka verwenden). . Da die Dienstregistrierung und -abmeldung über den Client selbst angefordert wird, besteht ein Hauptproblem bei diesem Modell darin, dass unterschiedliche Dienste für verschiedene Programmiersprachen registriert werden und die Diensterkennungslogik für jede Entwicklungssprache separat entwickelt werden muss. Darüber hinaus muss die Unterstützung für Integritätsprüfungen bei der Verwendung von Eureka explizit konfiguriert werden.

Serverseitiger Erkennungsmodus
Das Architekturdiagramm des serverseitigen Erkennungsmodus sieht wie folgt aus:
Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Der Client sendet eine Anfrage an den Load Balancer, und der Load Balancer stellt eine Anfrage an die Dienstregistrierung und leitet die Anfrage an die in der Registrierung verfügbaren Dienstinstanzen weiter. Dienstinstanzen werden auch in der Registrierung registriert und nicht registriert. Der Lastausgleich kann Haproxy oder Nginx verwenden. Die aktuellen Mainstream-Lösungen für den serverseitigen Erkennungsmodus auf Basis von Docker sind Consul, Etcd und Zookeeper.

Consul
Consul bietet eine API, die es Kunden ermöglicht, sich zu registrieren und Dienste zu entdecken. Seine Konsistenz basiert auf dem RAFT-Algorithmus. Verwalten Sie Mitglieder und senden Sie Nachrichten über das Gossip-Protokoll des WAN, um eine rechenzentrumsübergreifende Synchronisierung durchzuführen und die ACL-Zugriffskontrolle zu unterstützen. Consul bietet außerdem einen Health-Check-Mechanismus und unterstützt den KV-Speicherdienst (wird von Eureka nicht unterstützt). Eine ausführlichere Einführung in Consul finden Sie in dem Artikel, den ich zuvor geschrieben habe: Docker-Container-Bereitstellung des Consul-Clusters.

Etcd
Etcd sind alle stark konsistent (CP, der CAP erfüllt) und hochverfügbar. Etcd basiert auch auf dem RAFT-Algorithmus, um eine starke Konsistenz der KV-Datensynchronisierung zu erreichen. Kubernetes verwendet die KV-Struktur von Etcd, um den Lebenszyklus aller Objekte zu speichern.
Einige interne Prinzipien von Etcd finden Sie in der Etcd v3-Prinzipanalyse

Zookeeper
ZK wurde erstmals in Hadoop verwendet. Sein System ist sehr ausgereift und wird häufig verwendet große Unternehmen. Wenn Sie bereits über einen eigenen ZK-Cluster verfügen, können Sie erwägen, ZK als Ihr eigenes Service-Registrierungszentrum zu nutzen.
Zookeeper ist dasselbe wie Etcd, mit starker Konsistenz und hoher Verfügbarkeit. Der Konsensalgorithmus basiert auf Paxos. Für die Anfangsphase der Microservice-Architektur besteht keine Notwendigkeit, den schwereren ZK für die Serviceerkennung zu verwenden.

Dienstregistrierung

Die Dienstregistrierung ist eine wichtige Komponente bei der Diensterkennung. Zusätzlich zu Kubernetes und Marathon ist ihre Serviceerkennung ein integriertes Modul. Dienste müssen in der Registrierung registriert werden. Eureka, Consul, etcd und ZK, die oben vorgestellt wurden, sind Beispiele für Dienstregister.
Es gibt zwei typische Registrierungsmethoden für die Registrierung von Microservices in der Registrierung: den Selbstregistrierungsmodus und den Drittanbieter-Registrierungsmodus.

Selbstregistrierungsmuster
Der obige Netflix-Eureka-Client ist ein typisches Beispiel für das Selbstregistrierungsmuster. Das heißt, jede Microservice-Instanz muss selbst für die Registrierung und Deregistrierung des Dienstes verantwortlich sein. Eureka bietet außerdem einen Heartbeat-Mechanismus, um die Genauigkeit der Registrierungsinformationen sicherzustellen. Das spezifische Heartbeat-Sendeintervall kann im SpringBoot des Microservices konfiguriert werden.

Wie folgt: Wenn Sie Eureka als Registrierung verwenden, werden beim Start des Mikrodienstes (SpringBoot-Anwendung) Dienstregistrierungsinformationen angezeigt:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Ähnlich: Wann Wenn die Anwendung deaktiviert ist, muss die Dienstinstanz die Instanzinformationen aktiv abmelden:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Die Selbstregistrierungsmethode ist eine relativ einfache Dienstregistrierungsmethode, für die keine zusätzlichen Funktionen erforderlich sind oder Agenten. Die Microservice-Instanz selbst verwaltet die Dienstregistrierung. Die Mängel liegen jedoch auch auf der Hand. Beispielsweise bietet Eureka derzeit nur Java-Clients an und eignet sich daher nicht für die Erweiterung um mehrsprachige Mikrodienste. Da der Microservice die Service-Registrierungslogik selbst verwalten muss, koppelt die Microservice-Implementierung auch die Service-Registrierung und den Heartbeat-Mechanismus. Die sprachübergreifende Leistung ist relativ schlecht.

Hier empfehle ich jedem eine Architektur-Lern- und Austauschgruppe. Kommunikations- und Lerngruppennummer: 478030634. Es werden einige von erfahrenen Architekten aufgezeichnete Videos geteilt: Spring, MyBatis, Netty-Quellcode-Analyse, Prinzipien hoher Parallelität, hohe Leistung, verteilte und Microservice-Architektur, JVM-Leistungsoptimierung, verteilte Architektur usw. Diese sind zu einem notwendigen Wissenssystem für Architekten geworden. Sie können auch kostenlose Lernressourcen erhalten und profitieren derzeit stark

Drittanbieter-Registrierungsmuster

Drittanbieter-Registrierung, also die Verwaltung der Service-Registrierung (Anmeldung, Stornierung von Services) Durch einen dedizierten Servicemanager (Registar) ist verantwortlich. Registrator ist eine Open-Source-Service-Manager-Implementierung. Der Registrator bietet Registrierungsdienstunterstützung für Etcd und Consul. Registrator muss als Proxy-Dienst auf dem Server oder der virtuellen Maschine bereitgestellt und ausgeführt werden, auf dem sich der Mikrodienst befindet. Die einfachere Installationsmethode besteht darin, es als Container über Docker auszuführen.
Das Architekturdiagramm des Drei-Parteien-Registrierungsmodells lautet wie folgt:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Durch das Hinzufügen eines Service Managers registrieren sich Microservice-Instanzen nicht mehr direkt und melden sich bei der Registrierung ab Center. Der Dienstmanager (Registar) erkennt verfügbare Dienstinstanzen, indem er Dienste abonniert, Heartbeats verfolgt, sich beim Registrierungszentrum (Consul, etcd usw.) registriert, Instanzen abmeldet und Heartbeats sendet. Auf diese Weise kann die Entkopplung von Service-Discovery-Komponenten und Microservice-Architektur erreicht werden.

Registrator arbeitet mit Consul und Consul Template zusammen, um ein Service Discovery Center aufzubauen. Sie können sich auf Folgendes beziehen: Skalierbare Architektur DR CoN: Docker, Registrator, Consul, Consul Template und Nginx. Dieser Artikel enthält ein Beispiel für die Verwendung von Nginx zum Lastausgleich. Im spezifischen Implementierungsprozess können stattdessen auch Haproxy oder andere Lösungen verwendet werden.

Zusammenfassung

Zusätzlich zu den oben genannten Service-Discovery-Technologien verfügt Kubernetes über ein eigenes Service-Discovery-Modul, das für die Verarbeitung der Registrierung und Deregistrierung von Serviceinstanzen verantwortlich ist. Kubernetes führt außerdem auf jedem Clusterknoten einen Agenten aus, um die serverseitige Erkennung von Routern zu implementieren. Wenn die Orchestrierungstechnologie k8n verwendet, können Sie die vollständigen Docker-Microservice-Lösungen von k8n verwenden. Wer sich für k8n interessiert, kann das Architekturdesign und die Kernprinzipien von Kubernetes lesen.

Bei der tatsächlichen Technologieauswahl ist es am wichtigsten, vernünftige Entscheidungen auf der Grundlage der zukünftigen Entwicklungsmerkmale des Unternehmens und des Systems zu treffen.

  • In der CAP-Theorie. Eureka erfüllt AP, Consul ist CA, ZK und Etcd sind CP. Sowohl Eureka als auch Consul können die Verfügbarkeit in verteilten Szenarien garantieren. Der Aufbau eines Eureka-Dienstes geht relativ schneller, da kein zusätzliches hochverfügbares Service-Registrierungszentrum aufgebaut werden muss. Bei der Verwendung kleiner Serverinstanzen können durch den Einsatz von Eureka bestimmte Kosten eingespart werden.

  • Eureka und Consul stellen beide WebUI-Komponenten bereit, mit denen Dienstregistrierungsdaten angezeigt werden können. Consul bietet auch KV-Speicher und unterstützt http- und DNS-Schnittstellen. Für Startups, die zunächst Microservices erstellen möchten, werden diese beiden empfohlen.

  • Im Hinblick auf Multi-Rechenzentren verfügt Consul über eine eigene Rechenzentrums-WAN-Lösung. Weder ZK noch Etcd bieten Unterstützung für die Funktionalität mehrerer Rechenzentren und erfordern zusätzliche Entwicklung.

  • In Bezug auf die Sprachübergreifendheit muss Zookeeper die von ihm bereitgestellte Client-API verwenden, und die sprachübergreifende Unterstützung ist schwach. Etcd und Eureka unterstützen beide http, und Etcd unterstützt auch grpc. Neben http bietet Consul auch DNS-Unterstützung.

  • In Bezug auf die Sicherheit unterstützen Consul und Zookeeper ACL und Consul und Etcd unterstützen den sicheren Kanal HTTPS.

  • SpringCloud bietet derzeit entsprechende Unterstützung für Eureka, Consul, Etcd und ZK.

  • Consul ist wie Docker in der Go-Sprache implementiert. Microservice-Anwendungen, die auf der Go-Sprache basieren, können der Verwendung von Consul Vorrang einräumen.

IPC-Mechanismus zwischen Diensten

Nachdem das Problem der Diensterkennung gemäß dem Microservice-Architektursystem gelöst wurde. Sie müssen einen geeigneten Kommunikationsmechanismus zwischen Diensten auswählen. Wenn Sie sich in einer SpringBoot-Anwendung befinden, ist die Verwendung der auf dem HTTP-Protokoll basierenden REST-API eine synchrone Lösung. Darüber hinaus kann die API im Restful-Stil jede Microservice-Anwendung ressourcenorientierter machen, und die Verwendung leichtgewichtiger Protokolle wurde auch von Microservices befürwortet.

Wenn jeder Mikrodienst die DDD-Idee (Domain-Driven Design) verwendet, muss jeder Mikrodienst versuchen, den synchronen RPC-Mechanismus nicht zu verwenden. Asynchrone nachrichtenbasierte Methoden wie AMQP oder STOMP wären eine gute Wahl, um die Abhängigkeiten zwischen Microservices lose zu koppeln. Derzeit gibt es viele Optionen für nachrichtenbasierte Punkt-zu-Punkt-Pub/Sub-Frameworks. Im Folgenden finden Sie eine detaillierte Einführung in einige Lösungen der beiden IPCs.

Synchronisation
Für synchrone Kommunikation im Anforderungs-/Antwortmodus. Sie können wählen, ob Sie zwischen Diensten kommunizieren möchten, die auf dem HTTP-Protokoll im Restful-Stil oder dem Thrift-Protokoll mit guten sprachübergreifenden Funktionen basieren. Wenn Sie reine Java-Sprach-Microservices verwenden, können Sie auch Dubbo verwenden. Wenn es sich um ein in SpringBoot integriertes Microservice-Architektursystem handelt, wird empfohlen, RPC mit guter sprachübergreifender Leistung und besserer Unterstützung durch die Spring-Community zu wählen.

Dubbo
Dubbo ist ein von Alibaba entwickeltes Open-Source-Java-Client-RPC-Framework. Dubbo überträgt Daten basierend auf langen Verbindungen des TCP-Protokolls. Das Übertragungsformat verwendet die hessische Binärserialisierung. Das Service-Registrierungscenter kann über Zookeeper implementiert werden.

ApacheThrift
ApacheThrift ist ein von Facebook entwickeltes RPC-Framework. Seine Codegenerierungs-Engine kann effiziente Dienste in mehreren Sprachen wie C++, Java, Python, PHP, Ruby, Erlang, Perl usw. erstellen. Die übertragenen Daten liegen im Binärformat vor und ihre Pakete sind kleiner als das HTTP-Protokoll, das das Json- oder XML-Format verwendet. Eine hohe Parallelität ist in Big-Data-Szenarien vorteilhafter.

Rest
Rest basiert auf dem HTTP-Protokoll und das HTTP-Protokoll selbst verfügt über eine umfangreiche Semantik. Da Springboot weit verbreitet ist, erfreuen sich immer mehr APIs im Restful-Stil großer Beliebtheit. REST basiert auf dem HTTP-Protokoll und die meisten Entwickler sind mit HTTP vertraut.

Ein weiterer Punkt, der hier erwähnt werden muss, ist, dass viele Unternehmen oder Teams auch Springboot verwenden, und sie sagen auch, dass sie auf dem Restful-Stil basieren. Die Realität ist jedoch, dass die Umsetzung häufig nicht erfolgt. Um herauszufinden, ob Ihr Restful wirklich Restful ist, können Sie diesen Artikel lesen, der eine vierstufige Analyse der Reife von APIs im Restful-Stil durchführt: Das Richardson-Reifemodell führt zum Ruhm von REST.

Wenn Sie Springboot verwenden, können Sie unabhängig vom verwendeten Diensterkennungsmechanismus das RestTemplate von Spring verwenden, um grundlegende HTTP-Anfragen zu kapseln.

Wenn Sie das oben erwähnte Netflix-Eureka verwenden, können Sie Netflix-Feign verwenden. Feign ist ein deklarativer Webdienst-Client. Der clientseitige Lastausgleich verwendet Netflix-Ribbon.

Asynchron
In der Microservice-Architektur ist eine reine „ereignisgesteuerte Architektur“ ausgeschlossen. Das Szenario der Verwendung von Nachrichtenwarteschlangen dient im Allgemeinen der Entkopplung zwischen Microservices. Dienste müssen nicht wissen, welche Dienstinstanz Nachrichten konsumiert oder veröffentlicht. Verwalten Sie einfach die Logik innerhalb Ihrer eigenen Domäne und veröffentlichen Sie sie dann über den Nachrichtenkanal oder abonnieren Sie die Nachrichten, die Ihnen wichtig sind. Derzeit gibt es viele Open-Source-Nachrichtenwarteschlangentechnologien. Zu den Apache-Projekten zählen mittlerweile beispielsweise Apache Kafka, RabbitMQ, Apache ActiveMQ und Alibabas RocketMQ. Im Nachrichtenwarteschlangenmodell sind die drei Hauptkomponenten:
Produzent: Erstellt Nachrichten und schreibt Nachrichten an Kanäle.
Nachrichtenbroker: Nachrichtenbroker verwaltet die in den Kanal geschriebenen Nachrichten entsprechend der Struktur der Warteschlange. Verantwortlich für das Speichern/Weiterleiten von Nachrichten. Broker ist im Allgemeinen ein Cluster, der separat erstellt und konfiguriert werden muss und hochverfügbar sein muss.
Verbraucher: Der Verbraucher der Nachricht. Die meisten aktuellen Nachrichtenwarteschlangen stellen sicher, dass Nachrichten mindestens einmal verbraucht werden. Daher müssen Verbraucher abhängig von der verwendeten Nachrichtenwarteschlangenfunktion idempotent sein.
Verschiedene Nachrichtenwarteschlangenimplementierungen haben unterschiedliche Nachrichtenmodelle. Auch die Eigenschaften der einzelnen Frameworks sind unterschiedlich:

RabbitMQ
RabbitMQ ist eine Open-Source-Implementierung auf Basis des AMQP-Protokolls, geschrieben in Erlang, das für seine hohe Leistung und Skalierbarkeit bekannt ist . Derzeit unterstützt der Client Java, .Net/C# und Erlang. Unter den AMQP-Komponenten (Advanced Message Queuing Protocol) kann der Broker mehrere Exchange-(Switch-)Komponenten enthalten. Exchange kann mehrere Warteschlangen sowie andere Exchanges binden. Nachrichten werden gemäß den in Exchange festgelegten Routing-Regeln an die entsprechende Nachrichtenwarteschlange gesendet. Nachdem der Verbraucher die Nachricht konsumiert hat, stellt er eine Verbindung zum Broker her. Senden Sie Benachrichtigungen für konsumierte Nachrichten. Dann entfernt Message Queue die Nachricht.

Kafka
Kafka ist ein leistungsstarkes, auf Publish/Subscribe basierendes, sprachübergreifendes verteiltes Nachrichtensystem. Die Entwicklungssprache von Kafka ist Scala. Seine wichtigeren Funktionen sind:
Schnelle Nachrichtenpersistenz mit einer Zeitkomplexität von O(1);
Unterstützt die Nachrichtenpartitionierung zwischen Diensten und den verteilten Verbrauch und stellt gleichzeitig sicher, dass Nachrichten sequentiell übertragen werden Online-Horizontalerweiterung und Lastausgleich;
unterstützt den Modus „Nur Verbrauch“ und „Nur einmal“ (Exactly Once) usw.
Lassen Sie uns über einen Mangel sprechen: Die Verwaltungsschnittstelle ist etwas nutzlos. Sie können den Open-Source-Kafka-Manager verwenden.
Seine hohen Durchsatzeigenschaften können nicht nur als Nachrichtenwarteschlange zwischen Mikrodiensten verwendet werden für Protokollsammlung, Offline-Analyse, Echtzeitanalyse usw.
Kafka stellt offiziell eine Java-Version der Client-API bereit und die Kafka-Community unterstützt derzeit mehrere Sprachen, darunter PHP, Python, Go, C/C++, Ruby, NodeJS usw.

ActiveMQ

ActiveMQ ist ein JMSProvider, der auf Basis von JMS (Java Messaging Service) implementiert ist. JMS stellt hauptsächlich zwei Arten von Nachrichten bereit: Point-to-Point und Publish/Subscribe. Derzeit unterstützt der Client Java, C, C++, C#, Ruby, Perl, Python und PHP. Und ActiveMQ unterstützt mehrere Protokolle: Stomp, AMQP, MQTT und OpenWire.

RocketMQ/ONS

RocketMQ ist eine von Alibaba entwickelte Open-Source-Warteschlange für verteilte Nachrichten mit hoher Verfügbarkeit. ONS ist ein Hochverfügbarkeitscluster, der eine kommerzielle Version bereitstellt. ONS unterstützt Pull/Push. Es kann aktives Pushen und die Anhäufung von zig Milliarden Nachrichten unterstützen. ONS unterstützt globale sequentielle Nachrichten und verfügt über eine benutzerfreundliche Verwaltungsseite, die den Verbrauch von Nachrichtenwarteschlangen überwachen kann und das manuelle Auslösen mehrerer erneuter Nachrichtensendungen unterstützt.
Zusammenfassung

Durch den Service-Discovery-Mechanismus von Microservices im vorherigen Artikel und die Hinzufügung der Restful API kann eine synchronisierte Interprozesskommunikation zwischen Microservices gelöst werden. Da Microservices verwendet werden, hoffen wir natürlich, dass alle Microservices einen angemessenen begrenzten Kontext (Systemgrenzen) haben können. Eine synchrone Kommunikation zwischen Mikrodiensten sollte so weit wie möglich vermieden werden, um zu verhindern, dass sich die Domänenmodelle zwischen Diensten gegenseitig stören. Um diese Situation zu vermeiden, können Sie in der Microservice-Architektur eine API-Gateway-Schicht (wird weiter unten vorgestellt) verwenden. Alle Microservices leiten einheitliche Anfragen über das API-Gateway weiter und führen sie zusammen. Und das API-Gateway muss auch synchrone Anforderungen und asynchrone NIO-Anforderungen unterstützen (was die Effizienz und Leistung der Anforderungszusammenführung verbessern kann).

Nachrichtenwarteschlange kann zur Entkopplung zwischen Mikrodiensten verwendet werden. In einer Service-Cluster-Umgebung, die auf Docker-Microservices basiert, ist die Netzwerkumgebung komplexer als in einem allgemeinen verteilten Cluster. Wählen Sie einfach eine hochverfügbare Implementierung einer verteilten Nachrichtenwarteschlange. Wenn Sie selbst eine Clusterumgebung wie Kafka oder RabbitMQ aufbauen, stellen Sie hohe Anforderungen an die Hochverfügbarkeit der Broker-Einrichtungen. Für auf Springboot basierende Microservices empfiehlt sich die Verwendung von Kafka oder ONS. Obwohl ONS im Handel erhältlich ist, ist es einfach zu verwalten und weist eine hohe Stabilität auf. Es eignet sich besser für Microservice-Architekturen, die nur in notwendigen Szenarien auf Nachrichtenwarteschlangen angewiesen sind. Wenn Sie bedenken, dass Protokollsammlung, Echtzeitanalyse und andere Szenarien erforderlich sind, können Sie auch einen Kafka-Cluster erstellen. Derzeit verfügt Alibaba Cloud auch über kommerzielle Cluster-Einrichtungen auf Basis von Kafka.

Verwenden Sie API Gateway, um die Weiterleitung und Zusammenführung von Microservice-Anfragen zu verwalten
Im vorherigen Abschnitt wird hauptsächlich die Lösung der Serviceerkennungs- und Kommunikationsprobleme von Microservices vorgestellt. Wenn im Microservice-Architektursystem DDD-Denken zur Aufteilung begrenzter Kontexte zwischen Diensten verwendet wird, werden Aufrufe zwischen Microservices minimiert. Um Microservices zu entkoppeln, gibt es eine Optimierungslösung auf Basis von API Gateway.

Entkoppelte Microservice-Aufrufe
Zum Beispiel das folgende häufige Nachfrageszenario – eine Aggregationsseite der „Benutzerbestellliste“. Sie müssen „Benutzerservice“ anfordern, um grundlegende Benutzerinformationen zu erhalten, und „Bestellservice“, um Bestellinformationen zu erhalten, und dann „Produktservice“ anfordern, um Produktbilder, Titel und andere Informationen in der Bestellliste zu erhalten. Wie in der folgenden Abbildung dargestellt:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Wenn der Client (z. B. H5, Android, iOS) mehrere Anforderungen zum Auflösen mehrerer Informationsaggregationen stellen darf, erhöht sich die Komplexität des Clients. Eine sinnvollere Möglichkeit besteht darin, eine API-Gateway-Schicht hinzuzufügen. Wie Microservices kann auch API Gateway in Docker-Containern bereitgestellt und ausgeführt werden. Es handelt sich ebenfalls um eine Springboot-Anwendung. Nach der Weiterleitung über die Gateway-API wie folgt:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Alle angeforderten Informationen werden vom Gateway aggregiert, das auch der einzige Knoten ist, der das System betritt. Und Gateway und alle Microservices, die den Kunden bereitgestellt werden, sind ebenfalls APIs im Restful-Stil. Die Einführung der Gateway-Schicht kann das Problem der Informationsaggregation gut lösen. Und es kann sich besser an die Anforderungen verschiedener Clients anpassen. Auf H5-Seiten müssen beispielsweise keine Benutzerinformationen angezeigt werden. Sie müssen lediglich eine Gateway-API hinzufügen, um Ressourcen anzufordern Es sind keine Änderungen auf der Microservice-Ebene erforderlich.

Funktionen von API Gateway

API Gateway kann nicht nur Anfragen zusammenführen und weiterleiten. Es benötigt außerdem weitere Funktionen, um ein vollständiges Gateway zu werden.

Responsive Programmierung
Gateway ist der Einstiegspunkt für alle Kundenanfragen. Ähnlich dem Fassadenmodus. Um die Leistung von Anforderungen zu verbessern, ist es am besten, ein nicht blockierendes E/A-Framework zu wählen. In einigen Szenarien, in denen mehrere Microservices angefordert werden müssen, müssen Anforderungen für jeden Microservice nicht unbedingt synchronisiert werden. Im oben angegebenen Beispiel „Benutzerbestellliste“ sind das Abrufen von Benutzerinformationen und das Abrufen der Bestellliste zwei unabhängige Anfragen. Um nur die Produktinformationen der Bestellung zu erhalten, müssen Sie auf die Rückgabe der Bestellinformationen warten und dann den Produkt-Microservice basierend auf der Produkt-ID-Liste der Bestellung anfordern. Um die Antwortzeit der gesamten Anfrage zu verkürzen, muss Gateway in der Lage sein, unabhängige Anfragen gleichzeitig zu verarbeiten. Eine Lösung besteht darin, reaktive Programmierung einzuführen.

Zu den aktuellen reaktiven Programmiermethoden, die den Java-Technologie-Stack verwenden, gehören CompletableFuture von Java8 und die JVM-basierte Implementierung von ReactiveX – RxJava.

ReactiveX ist eine Programmierschnittstelle, die beobachtbare Datenströme für die asynchrone Programmierung verwendet. ReactiveX kombiniert die Essenz des Beobachtermusters, des Iteratormusters und der funktionalen Programmierung. Neben RxJava gibt es auch mehrsprachige Implementierungen wie RxJS und RX.NET.

Für Gateway kann das von RxJava bereitgestellte Observable sehr gut parallele unabhängige E/A-Anfragen lösen, und wenn Java8 in Microservice-Projekten verwendet wird, lernen und absorbieren die Teammitglieder die RxJava-Funktionen schneller. Responsive Programmierung, die ebenfalls auf dem Lambda-Stil basiert, kann den Code prägnanter machen. Eine ausführliche Einführung in RxJava finden Sie in der RxJava-Dokumentation und den Tutorials.

Durch den Observable-Modus der reaktiven Programmierung können Sie ganz einfach und bequem Ereignisströme und Datenströme erstellen und einfache Funktionen zum Kombinieren und Konvertieren von Daten verwenden. Gleichzeitig können Sie jeden beobachtbaren Datenstrom abonnieren und führen Sie es aus.
Durch die Verwendung von RxJava, dem Ressourcenanforderungssequenzdiagramm der „Benutzerbestellliste“:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Responsive Programmierung kann über Observables und Scheduler verschiedene Thread-Synchronisationen und gleichzeitige Anforderungen besser verarbeiten Bereitstellung eines transparenten Datenflusses und Thread-Verarbeitung des Ereignisflusses. Im agilen Entwicklungsmodell macht die reaktive Programmierung den Code prägnanter und einfacher zu warten.

Authentifizierung
Gateway ist der einzige Zugang zum System. Sämtliche auf Microservices basierende Authentifizierung kann rund um das Gateway erfolgen. Im Springboot-Projekt kann die Grundautorisierung Spring-Boot-Starter-Security und Spring Security verwenden (Spring Security kann auch in das Spring MVC-Projekt integriert werden).
Spring Security verwendet AOP hauptsächlich zum Abfangen von Ressourcenanforderungen und verwaltet die Filterkette einer Rolle intern. Da alle Microservices über Gateway angefordert werden, kann @Secured von Microservices entsprechend den Rollenebenen verschiedener Ressourcen in Gateway festgelegt werden.

Spring Security bietet grundlegende Schnittstellenspezifikationen für die Rollenüberprüfung. Die Verschlüsselung, Speicherung und Überprüfung der vom Client angeforderten Token-Informationen muss jedoch von der Anwendung selbst durchgeführt werden. Redis kann zum Speichern tokenverschlüsselter Informationen verwendet werden. Hier ist noch zu erwähnen, dass es zur Gewährleistung der Variabilität einiger verschlüsselter Informationen am besten ist, beim Entwurf des Token-Moduls zu Beginn die Unterstützung mehrerer Versionsschlüssel in Betracht zu ziehen, um zu verhindern, dass der interne Schlüssel durchsickert (ich hörte einen Freund sagen). bevor der Token-Verschlüsselungscode seines Unternehmens von Mitarbeitern freigegeben wurde). Was den Verschlüsselungsalgorithmus und seine spezifische Implementierung betrifft, werden wir hier nicht weiter darauf eingehen. Nachdem die Gateway-Authentifizierung bestanden wurde, können die analysierten Token-Informationen direkt an die Microservice-Schicht übergeben werden, die die Anforderung fortsetzen muss.

Wenn die Anwendung eine Autorisierung erfordert (Ressourcenanforderungen müssen verschiedene Rollen und Berechtigungen verwalten), kann dies auf der Grundlage der AOP-Idee basierend auf der Rest-API von Gateway erfolgen. Die einheitliche Verwaltung von Authentifizierung und Autorisierung ist ebenfalls einer der Vorteile der Verwendung der Gateway-API, ähnlich wie im Fassadenmodus.

Lastausgleich
API Gateway stellt wie Microservice die Rest-API als Springboot-Anwendung bereit. Es läuft also auch in einem Docker-Container. Die Diensterkennung zwischen Gateway und Microservices kann weiterhin den oben genannten Client-Erkennungsmodus oder Server-Erkennungsmodus verwenden.
In einer Clusterumgebung kann API Gateway einen einheitlichen Port verfügbar machen und seine Instanzen werden auf Servern mit unterschiedlichen IPs ausgeführt. Da wir das ECS von Alibaba Cloud als Container-Infrastruktur verwenden, wird der Lastausgleichs-SLB von Alibaba Cloud auch für den Lastausgleich in der Clusterumgebung und AliyunDNS auch für die Auflösung von Domänennamen verwendet. Die folgende Abbildung ist ein Diagramm einer einfachen Netzwerkanforderung:

Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

In der Praxis kann der Nginx-Dienst auch bereitgestellt werden, um den Dienstport und die Ressourcenadresse nicht offenzulegen Als Reverse-Proxy können externe Lastausgleichsfunktionen wie SLB Anforderungen an den Nginx-Server weiterleiten und diese dann über Nginx an den Gateway-Port weiterleiten. Wenn es sich um einen Cluster handelt, der in einem selbstgebauten Computerraum aufgebaut ist, muss ein hochverfügbares Lastausgleichszentrum aufgebaut werden. Um maschinenübergreifende Anforderungen zu bewältigen, ist es am besten, Consul, Consul (Consul-Vorlage) + Registor + Haproxy als Service-Erkennungs- und Lastausgleichszentrum zu verwenden.

Caching
Für einige hohe QPS-Anfragen kann mehrstufiges Caching im API Gateway durchgeführt werden. Der verteilte Cache kann Redis, Memcached usw. verwenden. Wenn es sich um einige Anfragen auf Seitenebene handelt, die keine hohen Echtzeitanforderungen haben und eine geringe Änderungshäufigkeit, aber hohe QPS aufweisen, kann lokales Caching auch auf der Gateway-Ebene erfolgen. Und Gateway kann die Caching-Lösung flexibler und vielseitiger machen.

  • Fehlerbehandlung von API Gateway

Im spezifischen Implementierungsprozess von Gateway ist die Fehlerbehandlung ebenfalls eine sehr wichtige Sache. Für die Gateway-Fehlerbehandlung können Sie Hystrix verwenden, um angeforderte Leistungsschalter zu verarbeiten. Und der mit RxJava gelieferte onErrorReturn-Rückruf kann auch die Rückgabe von Fehlerinformationen bequem verarbeiten. Für den Leistungsschaltermechanismus müssen folgende Aspekte berücksichtigt werden:

  • Fehlertolerante Verarbeitung von Serviceanfragen

Als angemessenes Gateway , sollte es nur für den Prozessdatenfluss und den Ereignisfluss verantwortlich sein, nicht für die Geschäftslogik. Bei der Verarbeitung von Anfragen von mehreren Microservices kann es bei Microservice-Anfragen zu einer Zeitüberschreitung kommen und sie sind nicht mehr verfügbar. In einigen spezifischen Szenarien müssen Teilausfälle angemessen behandelt werden. Wenn beispielsweise in der „Benutzer-Bestellliste“ im obigen Beispiel ein Fehler im Mikrodienst „Benutzer“ auftritt, sollte dies keine Auswirkungen auf die Anforderung von „Bestell“-Daten haben. Der beste Weg, damit umzugehen, besteht darin, Standarddaten an die zu diesem Zeitpunkt falsche Benutzerinformationsanfrage zurückzugeben, z. B. die Anzeige eines Standard-Avatars und eines Standard-Benutzer-Spitznamens. Anschließend werden die korrekten Daten für die Anforderung normaler Bestellungen und Produktinformationen zurückgegeben. Wenn eine wichtige Microservice-Anfrage abnormal ist, beispielsweise wenn ein Microservice im Feld „Bestellung“ abnormal ist, sollte dem Client ein Fehlercode und eine angemessene Fehlermeldung gegeben werden. Diese Art der Verarbeitung kann versuchen, die Benutzererfahrung zu verbessern, wenn ein Teil des Systems nicht verfügbar ist. Bei Verwendung von RxJava besteht die spezifische Implementierungsmethode darin, onErrorReturn zu schreiben und Fehlerdaten für verschiedene Clientanforderungen kompatibel zu machen.

  • Ausnahmeerfassung und -aufzeichnung

Gateway ist hauptsächlich für die Weiterleitung und Zusammenführung von Anfragen verantwortlich. Um Probleme eindeutig zu beheben und das Problem bei einem bestimmten Dienst oder sogar bei welchem ​​Docker-Container zu lokalisieren, muss Gateway in der Lage sein, verschiedene Arten von Ausnahmen und Geschäftsfehlern zu erfassen und aufzuzeichnen. Wenn Sie FeignClient verwenden, um Microservice-Ressourcen anzufordern, können Sie die Antwortergebnisse weiter filtern und alle Anforderungsinformationen im Protokoll aufzeichnen, indem Sie die ErrorDecoder-Schnittstelle implementieren. Wenn Sie Spring Rest Template verwenden, können Sie ein benutzerdefiniertes RestTempate definieren und die zurückgegebene ResponseEntity analysieren. Protokollieren Sie Fehlermeldungen, bevor Sie das serialisierte Ergebnisobjekt zurückgeben.

  • Timeout-Mechanismus

Die meisten Gateway-Threads sind IO-Threads. Um zu verhindern, dass das Gateway aufgrund der Blockierung einer bestimmten Microservice-Anfrage zu viele wartende Threads hat, was die Systemressourcen wie Thread-Pools und Warteschlangen erschöpft. Im Gateway muss ein Timeout-Mechanismus bereitgestellt werden, damit eine ordnungsgemäße Dienstverschlechterung an der Timeout-Schnittstelle durchgeführt werden kann.
Hystrix ist in das Feign-Projekt von SpringCloud integriert. Hystrix bietet einen relativ umfassenden Schutzschaltermechanismus für die Timeout-Verarbeitung. Standardmäßig ist der Timeout-Mechanismus aktiviert. Neben der Konfiguration von Timeout-bezogenen Parametern bietet Netflix auch ein Echtzeit-Überwachungs-Netflix-Dashboard auf Basis von Hytrix, und der Cluster-Dienst muss nur zusätzlich mit Netflix-Turbine bereitgestellt werden. Allgemeine Hytrix-Konfigurationselemente finden Sie unter Hystrix-Konfiguration.
Wenn Sie Observable von RxJava für die reaktive Programmierung verwenden und unterschiedliche Zeitüberschreitungen für verschiedene Anforderungen festlegen möchten, können Sie die Rückrufmethode und die Zeitüberschreitungszeit direkt in den Parametern der timeout()-Methode von Observable festlegen.

  • Wiederholungsmechanismus

Für einige wichtige Unternehmen muss Gateway in der Lage sein, die korrekte Datenrückgabe sicherzustellen, wenn die Anforderung abläuft Bereitstellung eines Wiederholungstestmechanismus. Wenn Sie SpringCloudFeign verwenden, stellt das integrierte Menüband eine Standard-Wiederholungskonfiguration bereit, die durch Festlegen von spring.cloud.loadbalancer.retry.enabled=false deaktiviert werden kann. Der von Ribbon bereitgestellte Wiederholungsmechanismus wird ausgelöst, wenn die Anforderung oder das Socket-Lese-Timeout abläuft. Zusätzlich zum Festlegen des Wiederholungsversuchs können Sie auch den Wiederholungszeitschwellenwert und die Anzahl der Wiederholungsversuche anpassen.

Für Anwendungen, die Spring RestTemplate zusätzlich zu Feign verwenden, können Sie ein benutzerdefiniertes RestTemplate verwenden, um die Ergebnisse des zurückgegebenen ResponseEntity-Objekts zu analysieren, wenn die Anforderung erneut versucht werden muss (z. B. eine Fehlercodemethode mit festem Format). um die Wiederholungsstrategie zu identifizieren), Anfragen über Interceptor abzufangen und mehrere Anfragen über Rückrufe aufzurufen.

Zusammenfassung

Für die Microservice-Architektur kann über ein unabhängiges API-Gateway eine einheitliche Anforderungsweiterleitung, Zusammenführung und Protokollkonvertierung durchgeführt werden. Es kann sich flexibler an die Anforderungsdaten verschiedener Kunden anpassen. Darüber hinaus können Anforderungen, die mit verschiedenen Clients (z. B. H5 und iOS haben unterschiedliche Anzeigedaten) und verschiedenen Versionen kompatibel sind, in Gateway gut abgeschirmt werden, um Microservices reiner zu machen. Microservices müssen sich lediglich auf das Design interner Domänendienste und die Ereignisverarbeitung konzentrieren.

API-Gateway kann auch bestimmte Fehlertoleranzen und Dienstverschlechterungen bei Microservice-Anfragen durchführen. Die Verwendung reaktiver Programmierung zur Implementierung des API-Gateways kann die Thread-Synchronisierung und den Parallelitätscode einfacher und leichter zu verwalten machen. Anfragen für Microservices können über FeignClint vereinheitlicht werden. Der Code wird auch sehr hierarchisch sein. Die folgende Abbildung ist ein Beispiel für die angeforderte Klassenhierarchie.

1Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

  • Clint ist verantwortlich für die Integration der Serviceerkennung (für die Selbstregistrierung mit Eureka), den Lastausgleich, das Stellen von Anfragen und das Erhalten von ResponseEntity-Objekten.

  • Der Übersetzer konvertiert ResponseEntity in Observable-Objekte und führt eine einheitliche Protokollerfassung von Ausnahmen durch, ähnlich dem Konzept der Korrosionsschutzschicht in DDD.

  • Adapter ruft jeden Übersetzer auf und verwendet die Observable-Funktion, um die angeforderten Datenströme zusammenzuführen. Wenn mehrere Datenassemblys vorhanden sind, können Sie eine Assembler-Ebene hinzufügen, um speziell die Konvertierung von DTO-Objekten in Modelle zu verwalten.

  • Controller ermöglicht die Verwaltung von Restful-Ressourcen. Jeder Controller fordert nur eine eindeutige Adaptermethode an.

Kontinuierliche Integrationsbereitstellung von Microservices

Der vorherige Artikel stellt hauptsächlich die Serviceerkennung, Servicekommunikation und das API-Gateway von Microservices vor. Zunächst wird das Modell der gesamten Microservice-Architektur betrachtet. In tatsächlichen Entwicklungs-, Test- und Produktionsumgebungen. Wenn Sie Docker zum Implementieren von Mikrodiensten verwenden, wird die Netzwerkumgebung des Clusters komplexer. Die Microservice-Architektur selbst bedeutet, dass mehrere Container-Services verwaltet werden müssen und jeder Microservice unabhängig bereitgestellt, erweitert und überwacht werden sollte. Im Folgenden wird weiterhin erläutert, wie eine kontinuierliche Integrationsbereitstellung (CI/CD) von Docker-Mikrodiensten durchgeführt wird.

Mirror Warehouse
Um Docker zum Bereitstellen von Microservices zu verwenden, müssen Sie die Microservices in Docker-Images packen, genau wie wenn Sie sie auf einem Webserver bereitstellen und in War-Dateien packen. Es ist nur so, dass das Docker-Image in einem Docker-Container ausgeführt wird.
Wenn es sich um einen Springboot-Dienst handelt, werden Springboot einschließlich des Apache Tomcat-Servers und die kompilierte Java-Anwendung einschließlich der Java-Laufzeitbibliothek direkt in ein Docker-Image gepackt.
Um die Verpackung und Verteilung (Pull/Push) von Bildern einheitlich zu verwalten. Unternehmen müssen im Allgemeinen ihre eigene private Spiegeldatenbank einrichten. Auch die Umsetzung ist sehr einfach. Die Containerversion von Registry2 des Spiegellagers des Docker-Hubs kann direkt auf dem Server bereitgestellt werden. Die aktuellste Version ist V2.

Code Warehouse
Code-Übermittlung, Rollback und andere Verwaltung sind ebenfalls Teil der kontinuierlichen Integration des Projekts. Im Allgemeinen ist es auch erforderlich, ein privates Repository für das Code-Warehouse des Unternehmens einzurichten. Sie können Tools zur Codeversionsverwaltung wie SVN und GIT verwenden.
Derzeit verwendet das Unternehmen Gitlab, und Installations- und Bereitstellungsvorgänge über das Docker-Image von Git sind ebenfalls sehr praktisch. Spezifische Schritte finden Sie in der Docker-Gitlab-Installation. Um schnell zu erstellen und zu paketieren, können Git und Registry auch auf demselben Server bereitgestellt werden.

Projektkonstruktion
Im Springboot-Projekt kann das Build-Tool Maven oder Gradle sein. Gradle ist flexibler als Maven und die Springboot-Anwendung selbst ist dekonfigurierbar, sodass Gradle basierend auf Groovy DSL selbst prägnanter und effizienter ist als XML.
Weil Gradle benutzerdefinierte Aufgaben unterstützt. Nachdem die Docker-Datei des Mikrodienstes geschrieben wurde, können Sie sie daher mit dem Task-Skript von Gradle erstellen und in ein Docker-Image packen.
Es gibt auch einige Open-Source-Gradle-Tools zum Erstellen von Docker-Images, wie zum Beispiel das Transmode-Gradlew-Plug-in. Neben der Erstellung von Docker-Images für Teilprojekte (einzelne Microservices) kann es auch das gleichzeitige Hochladen von Bildern in Remote-Image-Warehouses unterstützen. Auf der Build-Maschine in der Produktionsumgebung können Sie den Build des Projekts, das Packen des Docker-Images und das Pushen des Images direkt über einen einzigen Befehl ausführen.

Container-Orchestrierungstechnologie
Nachdem das Docker-Image erstellt wurde, werden Dienste isoliert zwischen Containern bereitgestellt, da jeder Container eine andere Microservice-Instanz ausführt. Durch die Orchestrierungstechnologie kann DevOps die Bereitstellung und Überwachung von Containern vereinfachen und so die Effizienz des Containermanagements verbessern.
Derzeit können einige gängige Orchestrierungstools wie Ansible, Chef und Puppet auch Container orchestrieren. Da es sich jedoch bei keinem davon um ein Orchestrierungstool speziell für Container handelt, müssen Sie einige Skripte selbst schreiben und diese bei der Verwendung mit Docker-Befehlen kombinieren. Beispielsweise kann Ansible tatsächlich eine sehr bequeme Bereitstellung und Verwaltung von Cluster-Containern erreichen. Ansible bietet derzeit eine Integrationslösung für die von seinem Team entwickelte Containertechnologie an: Ansible Container.

Das Clusterverwaltungssystem verwendet den Host als Ressourcenpool und entscheidet basierend auf den Ressourcenanforderungen jedes Containers, für welchen Host der Container geplant werden soll.
Zu den ausgereifteren Technologien rund um die Planung und Orchestrierung von Docker-Containern gehören derzeit Googles Kubernetes (im Folgenden als k8s abgekürzt), Mesos in Kombination mit Marathon zur Verwaltung von Docker-Clustern und Docker Swarm, das offiziell in Docker-Version 1.12.0 bereitgestellt wird und darüber. Die Orchestrierungstechnologie ist einer der Schwerpunkte der Containertechnologie. Durch die Wahl einer Container-Orchestrierungstechnologie, die zu Ihrem Team passt, können auch Betrieb und Wartung effizienter und automatisierter werden.

Docker Compose
Docker Compose ist ein einfaches Docker-Container-Orchestrierungstool. Es konfiguriert die Anwendungen, die über YAML-Dateien ausgeführt werden müssen, und startet dann die Container, die mehreren Diensten entsprechen der Befehl zum Verfassen. Compose ist nicht in Docker integriert und muss separat installiert werden.
Compose kann für die kontinuierliche Integration von Microservice-Projekten verwendet werden, ist jedoch nicht für die Containerverwaltung großer Cluster geeignet. In großen Clustern kann Compose mit Ansible für die Cluster-Ressourcenverwaltung und Service-Governance kombiniert werden.
Für Situationen, in denen sich nicht viele Server im Cluster befinden, können Sie Compose verwenden. Die Hauptschritte sind:

  1. Definieren Sie in Kombination mit der Microservice-Betriebsumgebung die Docker-Datei des Dienstes

  2. Schreiben Sie die Datei docker-compose.yml basierend auf dem Dienst-Image, dem Port, den laufenden Variablen usw., damit die Dienste zusammen bereitgestellt werden können

  3. Führen Sie den Befehl docker-compose up aus und geben Sie die Containerinstanz ein. Wenn Sie ihn als Hintergrundprozess ausführen müssen, verwenden Sie docker-compose up-d.
Docker Swarm

Im Jahr 2016, nach der Veröffentlichung der Version 1.12 von Docker, kam die neue Version von Docker mit dem Docker-Swarm-Modus. Es müssen keine zusätzlichen Plug-in-Tools installiert werden. Es ist ersichtlich, dass das Docker-Team seit letztem Jahr auch begonnen hat, sich mit der Service-Orchestrierungstechnologie zu befassen. Durch den integrierten Swarm-Modus möchte es auch einen Teil des Service-Orchestrierungsmarktes erobern. Wenn das Team eine neue Version von Docker verwendet, können Sie den Docker-Schwarmmodus für die Planung und Verwaltung von Cluster-Containern wählen. Swarm unterstützt auch fortlaufende Updates, Sicherheitsverschlüsselung der Transportschicht zwischen Knoten, Lastausgleich usw.
Beispiele für die Verwendung von DockerSwarm finden Sie in dem Artikel, den ich zuvor geschrieben habe: Verwenden von Docker-Swarm zum Erstellen eines kontinuierlichen Integrationsclusterdienstes.

Kubernetes

Kubernetes ist Googles Open-Source-Container-Cluster-Verwaltungssystem, das mithilfe der Go-Sprache implementiert wird und Anwendungsbereitstellung, Wartung, Erweiterungsmechanismen und andere Funktionen bietet. Derzeit kann k8s auf GCE, vShpere, CoreOS, OpenShift, Azure und anderen Plattformen verwendet werden. Derzeit bietet Aliyun in China auch eine Service-Management-Plattform auf Basis von k8s an. Wenn es sich um einen Docker-Cluster handelt, der auf physischen Maschinen oder virtuellen Maschinen basiert, können Sie k8s auch direkt bereitstellen und ausführen. In einer Microservice-Cluster-Umgebung kann Kubernetes Microservice-Container-Instanzen problemlos maschinenübergreifend verwalten.
Derzeit gilt k8s grundsätzlich als eine der leistungsstärksten Open-Source-Service-Governance-Technologien. Es bietet hauptsächlich die folgenden Funktionen:

    Automatisierte Bereitstellung und Replikation von Serviceinstanzen auf Basis von Docker
  1. Laufen in einem Cluster und können Cross-Management verwalten Maschinencontainer sowie fortlaufende Upgrades und Speicherorchestrierung.
  2. Integriertes Docker-basiertes Serviceerkennungs- und Lastausgleichsmodul
  3. K8s bietet einen leistungsstarken Selbstheilungsmechanismus, der abgestürzte Container repariert. Ersatz (ohne Wissen der Benutzer oder sogar des Entwicklungsteams) und die Kapazität kann jederzeit erweitert oder reduziert werden. Machen Sie das Containermanagement flexibler.
  4. k8s vervollständigt hauptsächlich die Verwaltung elastischer Containercluster durch die folgenden wichtigen Komponenten:
  1. Pod ist das kleinste Verwaltungselement von Kubernetes. Ein oder mehrere Container werden in einem Pod ausgeführt. Der Lebenszyklus eines Pods ist sehr kurz und stirbt ab, wenn die Planung fehlschlägt, der Knoten abstürzt oder andere Ressourcen recycelt werden.

  2. Label ist eine Schlüssel-/Wertspeicherstruktur, die Pods zugeordnet werden kann. Sie wird hauptsächlich zum Markieren von Pods und Gruppendiensten verwendet. Microservices verwenden Label-Selektoren (Selektoren), um Pods zu identifizieren.

  3. Replication Controller ist die Kernkomponente des k8sMaster-Knotens. Wird verwendet, um sicherzustellen, dass jederzeit eine bestimmte Anzahl von Pod-Repliken (Repliken) im Kubernetes-Cluster ausgeführt wird. Das heißt, es bietet die Funktion eines Selbstheilungsmechanismus und ist auch zum Verkleinern und Erweitern sowie zum Rollieren von Upgrades nützlich.

  4. Service ist eine Abstraktion der Strategie für eine Gruppe von Pods. Es ist auch eines der Grundelemente des K8s-Managements. Der Dienst identifiziert eine Gruppe von Pods über die Bezeichnung. Bei der Erstellung wird auch das DNS eines lokalen Clusters erstellt (um die Dienstadresse des Pods zu speichern, der dem Dienst entspricht). Daher fordert der Client den Erhalt der IP-Adressen einer Reihe aktuell verfügbarer Pods an, indem er DNS anfordert. Die Anfrage wird dann über den in jedem Knoten ausgeführten Kube-Proxy an einen der Pods weitergeleitet. Diese Lastausgleichsebene ist transparent, aber die aktuelle Lastausgleichsstrategie von k8s ist nicht sehr vollständig und die Standardeinstellung ist zufällig.

Zusammenfassung

In einem Microservice-Architektursystem kann ein geeignetes kontinuierliches Integrationstool den Betrieb, die Entwicklung und die Entwicklungseffizienz des Teams erheblich verbessern. Derzeit gibt es ähnlich wie bei Jenkins kontinuierliche Integrations-Plug-Ins für Docker, es gibt jedoch immer noch viele Mängel. Daher wird empfohlen, Swarm, k8s und Mesos zu wählen, die sich speziell mit der Docker-Container-Orchestrierungstechnologie befassen. Oder kombinieren Sie mehrere Technologien, z. B. Jenkins für CI+k8s für CD.

Swarm, k8s und Mesos verfügen jeweils über eigene Funktionen und bieten Unterstützung für die kontinuierliche Bereitstellung, Verwaltung und Überwachung von Containern. Mesos unterstützt auch das Rechenzentrumsmanagement. Der Docker-Schwarmmodus erweitert die bestehende Docker-API. Durch den Aufruf und die Erweiterung der Docker-Remote-API können Container für die Ausführung auf bestimmten Knoten geplant werden. Kubernetes ist derzeit die größte Orchestrierungstechnologie auf dem Markt. Viele große Unternehmen sind ebenfalls der k8s-Familie beigetreten. K8s ist flexibler bei der Erweiterung, Wartung und Verwaltung von Clusteranwendungen, die Lastausgleichsstrategie ist jedoch relativ grob. Mesos konzentriert sich mehr auf die allgemeine Planung und bietet eine Vielzahl von Planern.

Für die Service-Orchestrierung müssen Sie immer noch diejenige auswählen, die am besten zu Ihrem Team passt. Wenn die Anzahl der anfänglichen Maschinen gering und die Cluster-Umgebung nicht komplex ist, können Sie auch Ansible+Docker Compose plus Gitlab verwenden CI für kontinuierliche Integration.

Service-Cluster-Lösungen
Wenn Unternehmen üben, Docker zum Bereitstellen und Ausführen von Microservice-Anwendungen zu verwenden, unabhängig davon, ob sie die Microservice-Architektur von Anfang an entwerfen oder von der herkömmlichen Einzelanwendung ausgehen, migrieren Architektur bis hin zu Microservices. Alle müssen in der Lage sein, Serviceplanung, Orchestrierung, Überwachung und andere Probleme in komplexen Clustern zu bewältigen. Im Folgenden wird hauptsächlich die sicherere und effizientere Verwendung von Docker in einem verteilten Service-Cluster sowie alle Aspekte vorgestellt, die beim Architekturdesign berücksichtigt werden müssen.

Lastausgleich
Wovon wir hier sprechen, ist der Lastausgleich im Cluster. Wenn es sich um eine reine serverseitige API handelt, handelt es sich um den Lastausgleich der Gateway-API . Wenn Nginx verwendet wird, bezieht es sich auf den Nginx-Lastausgleich. Wir nutzen derzeit den Lastausgleichsdienst SLB von Alibaba Cloud. Einer der Hauptgründe ist, dass es an den DNS-Domänennamendienst gebunden werden kann. Für Unternehmen, die gerade erst anfangen, ein Unternehmen zu gründen, können Sie Lastausgleichsgewichte über die Weboberfläche festlegen, was für Teilfreigaben, Tests und Überprüfungen, Überwachung von Gesundheitsprüfungen usw. praktischer ist. Es ist eine geeignetere Wahl im Hinblick auf Effizienz und Einsparung von Betriebs- und Wartungskosten.

Wenn Sie selbst einen siebenschichtigen Lastausgleich erstellen, z. B. mit Nginx oder Haproxy, müssen Sie außerdem sicherstellen, dass der für den Lastausgleich verantwortliche Cluster ebenfalls hochverfügbar ist und eine bequeme Clusterüberwachung (blau-grün) bietet Bereitstellung und andere Funktionen.

Persistenz und Caching

Relationale Datenbank (RDBMS)
Bei Microservices orientiert sich die verwendete Speichertechnologie hauptsächlich an den Bedürfnissen des Unternehmens. Um Kosten zu sparen, wird im Allgemeinen MySQL verwendet. Bei der Auswahl der MySQL-Engine wird empfohlen, die InnoDB-Engine zu wählen (MyISAM war vor Version 5.5 die Standardeinstellung). InnoDB ist im Umgang mit Parallelität effizienter und die Lücke in der Abfrageleistung kann auch durch Caching, Suche und andere Lösungen ausgeglichen werden. Zu den kostenlosen Lösungen von InnoDB für das Kopieren und Sichern von Daten gehören Binlog und Mysqldump. Um jedoch eine automatisierte Sicherung und Wiederherstellung sowie ein überwachbares Rechenzentrum zu erreichen, ist weiterhin ein DBA oder ein Betriebs- und Wartungsteam erforderlich. Auch die relativen Kosten sind höher. Wenn Sie ein Start-up sind, können Sie auch darüber nachdenken, auf die PaaS-Dienste einiger relativ großer Cloud-Computing-Plattformen im In- und Ausland zu setzen.

Microservices sind im Allgemeinen nach Geschäftsbereichen unterteilt, daher ist es am besten, von Anfang an eine Unterbibliothek für Microservices zu entwerfen. Ob eine Tabellenunterteilung erforderlich ist, erfordert eine detaillierte Analyse basierend auf der Entwicklung der spezifischen Geschäftsfelder jedes Mikroservices und der Größe der Daten. Es wird jedoch empfohlen, für Modelle in relativ Kernbereichen, wie z. B. „Bestellungen“, die Untertabellenfelder im Voraus zu entwerfen und zu reservieren.

KV-Modelldatenbank (Schlüsselwertspeicher)
Redis ist eine Open-Source-Schlüsselwertstrukturdatenbank. Es basiert auf Speicher, verfügt über eine effiziente Caching-Leistung und unterstützt auch Persistenz. Redis verfügt hauptsächlich über zwei Persistenzmethoden. Eine davon ist RDB, das in bestimmten Zeitintervallen Point-in-Time-Snapshots des Datensatzes erstellt und diese zur Persistenz aus dem Speicher auf die Festplatte schreibt. Die RDB-Methode führt zu einem gewissen Datenverlust, die Leistung ist jedoch gut. Der andere ist AOF. Sein Schreibmechanismus ähnelt in gewisser Weise den AOF-Dateibefehlen, die alle im Redis-Protokollformat gespeichert sind. Diese beiden Arten von Persistenz können gleichzeitig vorhanden sein. Wenn Redis neu gestartet wird, wird zuerst die AOF-Datei zum Wiederherstellen von Daten verwendet. Da die Persistenz optional ist, kann die Redis-Persistenz auch deaktiviert werden.

In tatsächlichen Szenarien wird empfohlen, die Persistenz beizubehalten. Beispielsweise kann Redis verwendet werden, um die derzeit beliebte Verifizierung von SMS-Verifizierungscodes zu lösen. Im Microservice-Architektursystem kann Redis auch zur Verarbeitung einiger KV-Datenstrukturszenarien verwendet werden. Die leichtgewichtige Datenspeicherlösung eignet sich auch sehr gut für die Microservice-Idee, bei der leichte Lösungen im Vordergrund stehen.

In der Praxis speichern und speichern wir Redis zwischen und unterteilen die beiden Funktionsmerkmale in separate Bibliotheken.
Im integrierten Springboot-Projekt wird spring-boot-starter-data-redis verwendet, um die Redis-Datenbankverbindung und Grundkonfiguration sowie die von spring-data-redis bereitgestellten Rich-Data-APIOperations durchzuführen.
Wenn es sich außerdem um eine Anwendung handelt, die einen hohen Durchsatz erfordert, können Sie die Verwendung von Memcached zum Zwischenspeichern einfacher KV-Datenstrukturen in Betracht ziehen. Es eignet sich besser zum Lesen großer Datenmengen, die unterstützten Datenstrukturtypen sind jedoch relativ einzeln.

Graph Database (Graph Database)
Da die Graphdatenbank sozialbezogene Modelldaten speichert, ist sie eine effizientere und flexiblere Wahl für sich überschneidende relationale Datenbanken. Die Graphdatenbank ist ebenfalls eine Art Nosql. Es unterscheidet sich von KV. Bei den gespeicherten Daten handelt es sich hauptsächlich um Datenknoten (Knoten), Richtungsbeziehungen (Beziehungen) und Eigenschaften (Eigenschaften) für Knoten und Beziehungen.

Wenn Sie Java als Hauptentwicklungssprache für Microservices verwenden, wählen Sie am besten Neo4j. Neo4j ist eine Java-basierte Graphdatenbank, die ACID unterstützt. Es bietet eine umfangreiche JavaAPI. In Bezug auf die Leistung macht die lokale Natur von Graphdatenbanken Durchläufe sehr schnell, insbesondere umfangreiche Tiefendurchläufe. Dies liegt außerhalb der Reichweite von Mehrtabellenzuordnungen in relationalen Datenbanken.

Das Bild unten ist ein offizielles Beispiel für den Einstieg in ein Datenmodell, das mit dem WebUI-Tool von Neo4j angezeigt wird. Die Anweisung MATCH p=()-[r:DIRECTED]->() RETURN p LIMIT 25 im Beispiel ist die von Neo4j - Cypher bereitgestellte Abfragesprache.

2Verwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur

Das SpringData-Projekt Spring Data Neo4j kann bei Verwendung im Projekt integriert werden. Und SpringBootStartersspring-boot-starter-data-neo4j

Dokumentendatenbank (Dokumentendatenbank)
Die derzeit weit verbreitete dokumentenorientierte Open-Source-Datenbank kann Mongodb verwenden. Mongo verfügt über hohe Verfügbarkeit, hohe Skalierbarkeit und flexible Datenstrukturspeicherung, insbesondere für die Json-Datenstrukturspeicherung. Es eignet sich besser für die Speicherung von Modellen wie Blogs und Kommentaren.

Suchtechnologie
Während des Entwicklungsprozesses sehen wir manchmal Leute, die SQL mit mehreren Tabellenabfragen schreiben, das lang, kompliziert und schwer zu warten ist, oder verschiedene Unterabfrageanweisungen für mehrere Tabellenzuordnung. Wenn es für ein bestimmtes Domänenmodell viele solcher Szenarien gibt, ist es an der Zeit, über das Hinzufügen einer Suchlösung nachzudenken. Verwenden Sie SQL nicht, um alles zu lösen, insbesondere nicht Abfrageszenarien. Das Problem langsamer Abfrageanweisungen kann manchmal sogar zum Ausfall der Datenbank führen. Wenn das Datenbanküberwachungssystem nicht vorhanden ist, kann es schwierig sein, das Problem zu beheben.

Elasticsearch ist eine verteilte Open-Source-Such- und Analysemaschine in Echtzeit, die auf Apache Lucene basiert. Springboot-Projekte bieten auch Integrationsmethoden: spring-boot-starter-data-elasticsearch und spring-data-elasticsearch.
Um einen Suchcluster zu erstellen, können Sie Docker verwenden. Spezifische Konstruktionsmethoden finden Sie unter Erstellen eines Elasticsearch-Clusters mit Docker. Informationen zur Integration von Springboot-Projekten finden Sie unter Integrieren von Suchdiensten in Springboot Microservices. Bisher unterstützt die neueste Version von Spring Data Elasticsearch Version 5.x von ES, wodurch viele Schwachstellen von Version 2.x behoben werden können.

Wenn es sich um einen kleinen Suchcluster handelt, können Sie drei Maschinen mit niedriger Konfiguration verwenden und ihn dann mit ES Docker erstellen. Sie können auch einige kommerzielle Versionen von PaaS-Diensten nutzen. Die Auswahl hängt immer noch von der Größe und dem Szenario des Teams und des Unternehmens ab
.
Die derzeit am weitesten verbreitete Open-Source-Suchmaschine Solr basiert ebenfalls auf Lucene und konzentriert sich auf die Textsuche. Die Textsuche von ES ist in der Tat nicht so gut wie die von Solr. ES konzentriert sich hauptsächlich auf die Unterstützung der verteilten Unterstützung und verfügt im Vergleich zu Solr über eine integrierte Serviceerkennungskomponente, um den Clusterstatus aufrechtzuerhalten (was die Hilfe von so etwas wie Zookeeper erfordert). Verteilung) ist die Bereitstellung auch einfacher. Neben der Analyse von Abfragen kann ES auch die Protokollerfassung sowie -analyse und -verarbeitung integrieren.

Nachrichtenwarteschlange
Wie im vorherigen Artikel erwähnt, kann die Nachrichtenwarteschlange als gute entkoppelnde Kommunikationsmethode für Microservices verwendet werden. Im Szenario verteilter Cluster kann es auch eine technische Grundgarantie für die endgültige Konsistenz unter verteilten Bedingungen bieten. Und Nachrichtenwarteschlangen können auch zur Bewältigung von Verkehrseinbußen genutzt werden.
Der Vergleich der Nachrichtenwarteschlangen wird hier nicht wiederholt. Das Unternehmen nutzt derzeit ONS von Alibaba Cloud. Da die Verwendung von Nachrichtenwarteschlangen weiterhin eine hohe Verfügbarkeit sowie eine einfache Verwaltung und Überwachung erfordert, haben wir uns für eine sichere und zuverlässige Plattform für Nachrichtenwarteschlangen entschieden.

Sicherheitstechnologie
Sicherheit ist die Grundlage, die bei der Architektur berücksichtigt werden muss. Die Internetumgebung ist komplex und der Schutz der Sicherheit von Diensten ist ebenfalls eine grundlegende Verpflichtung gegenüber den Benutzern. Sicherheitstechnologie deckt ein breites Themenspektrum ab. In diesem Artikel werden einige häufig auftretende Probleme und häufig verwendete Methoden ausgewählt, um sie kurz vorzustellen.

Sicherheit von Dienstinstanzen
Der verteilte Cluster selbst ist eine Garantie für die Sicherheit von Dienstinstanzen. Wenn ein Problem mit einem Server oder einer bestimmten Dienstinstanz auftritt, kann der Lastausgleich die Anfrage an andere verfügbare Dienstinstanzen weiterleiten. Viele Unternehmen bauen jedoch ihre eigenen Computerräume, und es handelt sich dabei um Einzelmaschinenräume. Diese Anordnung ist tatsächlich gefährlicher. Da die Sicherung und Notfallwiederherstellung des Servers nicht vollständig garantiert werden kann. Das Erschreckendste ist, dass sich die Datenbank ebenfalls im selben Computerraum befindet und der Haupt- und der Backup-Server alle zusammen sind. Nicht nur ist die Sicherheit nicht gewährleistet, auch die täglichen Betriebs- und Wartungskosten sind relativ hoch. Außerdem müssen Sie auf die Konfiguration der Firewall-Sicherheitsrichtlinien achten.
Wenn möglich, versuchen Sie, einige hochverfügbare, hoch skalierbare und stabile IaaS-Plattformen zu verwenden.

Netzwerksicherheit

1. Verhindern von Netzwerkangriffen
Es gibt derzeit mehrere Hauptnetzwerkangriffe:
SQL-Injection: je nach Persistenzschicht-Framework, Bewältigung Strategien sind unterschiedlich. Wenn Sie JPA verwenden, müssen Sie sich grundsätzlich keine Sorgen machen, solange Sie die JPA-Spezifikationen befolgen.
XSS-Angriff: Machen Sie einen guten Job beim Escapen und Überprüfen von Parametern. Weitere Informationen finden Sie unter XSS-Prävention
CSRF-Angriff: Machen Sie gute Arbeit bei der Token- und Refer-Überprüfung der HTTP-Header-Informationen. Weitere Informationen finden Sie unter CSRF-Prävention
DDOS-Angriff: Bei DDoS-Angriffen mit großem Datenverkehr wird im Allgemeinen eine hochsichere IP-Adresse verwendet. Sie können auch auf die hochsichere IP einiger Cloud-Computing-Plattformen zugreifen.
Oben sind nur einige häufige Angriffe aufgeführt. Wenn Sie mehr darüber erfahren möchten, können Sie mehr über die REST-Sicherheitspräventionstabelle lesen. Im Bereich der Netzwerksicherheit wird es von Start-ups im Allgemeinen leicht ignoriert. Wenn kein Betriebs- und Wartungssicherheitsteam vorhanden ist, ist es am besten, Produkte wie Alibaba Cloud-Cloud Shield zu verwenden. Sparen Sie Sorgen und Kosten.

2. Sicherheitsprotokolle verwenden
Dies ist selbstverständlich, egal ob für die Microservice-Kommunikation die Restful API, der CDN oder der DNS-Dienst verwendet wird. Beim HTTP-Protokoll empfiehlt es sich, einheitlich HTTPS zu verwenden. Unabhängig von der Größe der Anwendung ist es notwendig, sich vor Traffic-Hijacking zu schützen, da dies andernfalls zu einer sehr schlechten Benutzererfahrung führt.

3. Authentifizierung
API Gateway hat die Authentifizierung von Microservices bereits eingeführt. Zusätzlich zu den Mikrodiensten selbst müssen einige der von uns verwendeten Dienste wie MySQL, Redis, Elasticsearch, Eureka usw. auch eine Authentifizierung einrichten und versuchen, über das Intranet darauf zuzugreifen. Setzen Sie nicht zu viele Ports der Außenwelt aus. Für das API-Gateway von Microservices ist es zusätzlich zur Authentifizierung am besten, wenn das Front-End die API-Schicht über den Nginx-Reverse-Proxy anfordert.

Protokollerfassung und -überwachung

Das auf Containertechnologie basierende Überwachungssystem für Microservices steht vor einer komplexeren Netzwerk- und Serviceumgebung. Viele Microservice-DevOps denken ständig darüber nach, wie die Protokollsammlung und -überwachung Microservices für Entwickler weniger aufdringlich und transparenter machen kann.

1. Sammlung von Microservice-Protokollen
Die Überwachung der API-Schicht von Microservices erfordert die Verfolgung, Sammlung und Analyse des Aufrufpfads vom API-Gateway zu jedem Microservice. Wenn Sie die Rest-API verwenden, können Sie zum Sammeln aller Anfragen den OncePerRequestFilter von Spring Web verwenden, um alle Anfragen abzufangen. Beim Sammeln von Protokollen ist es auch am besten, den RT der Anfrage aufzuzeichnen.

Neben der Aufzeichnung von Zugriffen, Anfragen und anderen Informationen ist auch die Anfrageverfolgung von API-Aufrufen erforderlich. Wenn Sie einfach die Protokolle jedes Dienstes und Gateways aufzeichnen, wissen Sie beim Auftreten einer Ausnahme im Gateway-Protokoll nicht, bei welcher Containerinstanz des Mikrodienstes ein Problem vorliegt. Wenn die Anzahl der Container ein bestimmtes Niveau erreicht, ist es nicht mehr möglich, die Protokolle aller Container und Serviceinstanzen zu überprüfen. Eine relativ einfache Lösung besteht darin, an alle Protokollinformationen eine eindeutig identifizierbare Trace-Zeichenfolge anzuhängen, die Containerinformationen enthält.

Nachdem das Protokoll erfasst wurde, muss es noch analysiert werden. Wenn Sie das technische System von E.L.K nutzen, können Sie die verteilten Echtzeitfunktionen von Elasticsearch flexibel nutzen. Logstash kann Protokolle sammeln und analysieren und Daten mit Elasticsearch synchronisieren. Kibana kombiniert Logstash und ElasticSearch, um eine gute WebUI bereitzustellen, die die Protokollanalyse erleichtert und die visuelle Verwaltung von Protokolldaten verbessert.
Für die Erfassung von Protokollen mit großen Datenmengen muss zur Verbesserung der Erfassungsleistung die oben erwähnte Nachrichtenwarteschlange verwendet werden. Die optimierte Architektur ist wie folgt:



2. Sammlung von Anrufprotokollen der Basisdienste
Durch Durch die Mikroprotokollerfassung und -analyse aller Rest-APIs des Dienstes können Anforderungsinformationen überwacht werden.
Im Rahmen des Dienstes sind auch die Protokollerfassung und die Analyse der Leistung von Middleware- und Infrastrukturaufrufen (einschließlich Redis, Mysql, Elasticsearch usw.) erforderlich.

Für die Protokollsammlung von Middleware-Diensten können wir derzeit dynamische Proxys zum Abfangen und Rückrufen von Protokollierungsmethoden für grundlegende Methoden namens Cache und Repository (einschließlich Suche und DB) verwenden, die vom Dienst aufgerufen werden. Die spezifische Implementierungsmethode kann das Bytecode-Generierungsframework ASM verwenden. Informationen zur logischen Injektion von Methoden finden Sie im Artikel ASM (4). Verwenden Sie die Methodenkomponente, um Methodenlogik dynamisch zu injizieren Da die Wartung nicht einfach ist, können Sie auch relativ API-freundliches Cglib verwenden.

Fünf Elemente der Architektur:
Schließlich betrachten wir das technische System, das wir zum Aufbau der Docker-Microservice-Architektur verwenden, basierend auf den fünf Kernelementen der Architektur:

  1. Hohe Leistung
    Nachrichtenwarteschlange, asynchrone RxJava-Parallelität, verteilter Cache, lokaler Cache, HTTP-Etag-Cache, Verwendung von Elasticsearch zur Optimierung von Abfragen, CDN usw.

  2. Verfügbarkeits-Container-Service-Cluster, RxJava-Leistungsschalterverarbeitung, Service-Verschlechterung, idempotente Nachrichtenverarbeitung, Timeout-Mechanismus, Wiederholungsmechanismus, verteilte Eventualkonsistenz usw.

  3. Skalierbarkeit: Servercluster-Skalierbarkeit, Container-Orchestrierung Kubernetes, Datenbank-Sharding und Tabellen-Sharding, lineare Nosql-Skalierbarkeit, Suchcluster-Skalierbarkeit usw.

  4. Skalierbarkeit Docker-basierte Microservices selbst sind für Skalierbarkeit konzipiert!

  5. Sicherheit
    JPA/Hibernate, SpringSecurity, High-Defense-IP, Protokollüberwachung, HTTPS, Nginx-Reverse-Proxy, HTTP/2.0 usw.

Zusammenfassung

Für Service-Cluster-Lösungen sind sie tatsächlich relativ universell, unabhängig davon, ob es sich um eine Microservice-Architektur oder eine SOA-Architektur handelt. Nur für den Aufbau einiger Middleware-Cluster kann Docker verwendet werden. Mit nur einem Satz von Docker ps können die Informationen zum laufenden Dienst problemlos abgefragt werden, und es ist auch praktisch, grundlegende Dienste zu aktualisieren.

Das Streben nach exzellentem Cluster-Architekturdesign ist endlos. Nachdem ich viele technische Freunde von Startup-Unternehmen kontaktiert habe, ziehen es alle vor, Dienste schnell zu erstellen, zu entwickeln und zu veröffentlichen. Allerdings gibt es einerseits auch Bedenken, dass die Architektur von Microservices komplizierter wird, was Zeitverschwendung wäre. Aber Microservices selbst sind eine hervorragende Praxis des agilen Modus. Wenn sich ihr Geschäft schnell entwickelt, stehen diese Freunde oft vor einem Problem, nämlich der Peinlichkeit, Dienste aufzuteilen, Datenbank-Unterdatenbanken und -Tabellen zu trennen und Nudel-ähnlichen Synchronisationscode durch Nachrichten zu entkoppeln. Sie möchten die Leistung optimieren, haben aber keine Möglichkeit, damit anzufangen.
In diesem Artikel werden hauptsächlich technische Lösungen für die Microservice-Praxis von Docker ausgewählt und vorgestellt. Verschiedene Unternehmen und Teams können für unterschiedliche Architektursysteme und technische Lösungen geeignet sein.

Als Architekt sollten Sie ein langfristiges Layout erstellen, das auf der kurzfristigen und langfristigen strategischen Planung des Unternehmens basiert. Zumindest muss die Basisarchitektur in der Lage sein, eine dreijährige Entwicklungszeit zu unterstützen, in der kontinuierlich neue Technologien eingeführt, Service-Upgrades durchgeführt und eine kontinuierliche Rekonstruktion der Codeschicht durchgeführt werden können.
Vielleicht dauert es nicht lange, bis ein Architekt ein komplettes System von Grund auf aufgebaut hat. Das Wichtigste ist, Domain-Driven Design im Team kontinuierlich zu fördern. Und ermöglichen Sie dem Team, Clean Code zu befolgen und eine agile Entwicklungs-OvO durchzuführen.

Verwandte Artikel:

Analyse der Microsoft Microservice-Architektur eShopOnContainers

Verwandte Videos:

Geek Academy Docker-Video-Tutorial – kostenloses Online-Video-Tutorial

Das obige ist der detaillierte Inhalt vonVerwendung der Containertechnologie von Docker zum Entwerfen des Service-Architektursystems DevOps – JAVA-Architektur. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage