Heim >Backend-Entwicklung >Golang >[MICROSERVICES] Message Queues und REST – Ein Ansatz mit Go, NodeJS und Clean Architecture
In den letzten Jahren hat sich die Microservices-Architektur zu einer beliebten Wahl für den Aufbau skalierbarer, flexibler und wartbarer Systeme entwickelt. Durch die Aufteilung einer Anwendung in kleinere, unabhängige Dienste ist es möglich, jeden Dienst autonom zu warten, zu testen und zu aktualisieren, was die Skalierbarkeit und die Einbeziehung neuer Technologien erleichtert.
In diesem Artikel untersuchen wir die Erstellung einer Microservices-Architektur mit Go und NodeJS, zwei weit verbreiteten Sprachen und in diesem Zusammenhang mit komplementären Eigenschaften. Darüber hinaus wenden wir die Prinzipien der Clean Architecture an, einen Designansatz, der darauf abzielt, den Code sauber, modular und einfach zu warten und zu testen und sicherzustellen, dass die Geschäftslogik von Infrastrukturproblemen und/oder Abhängigkeiten isoliert ist.
Ziel dieses Projekts ist es, Go, eine Sprache, die ich kürzlich studiert habe, zu üben und grundlegende Konzepte von Microservices zu überdenken. Gleichzeitig werden wir TypeScript bei der Entwicklung von Diensten verwenden und dabei die Prinzipien der Clean Architecture anwenden, um gute Software-Designpraktiken zu stärken.
Ausgehend von diesen Prämissen werden wir die Möglichkeit haben, sowohl die positiven Aspekte als auch die Herausforderungen dieses Ansatzes zu erkunden. Schließlich benötigt nicht jedes Unternehmen eine so komplexe Struktur, und ein praktisches Projekt ist der beste Weg, seine tatsächlichen Bedürfnisse und Auswirkungen zu verstehen.
Die Microservices-Architektur unterteilt eine Anwendung in kleinere, unabhängige Dienste, von denen jeder für einen bestimmten Teil der Funktionalität verantwortlich ist. Diese Dienste kommunizieren über klar definierte APIs, was die Wartung, Skalierbarkeit und Einführung neuer Technologien erleichtert.
Vorteile:
Modularität: Erleichtert die Wartung und unabhängige Entwicklung jedes Dienstes.
Skalierbarkeit: Ermöglicht die individuelle Skalierbarkeit jedes Dienstes je nach Bedarf.
Ausfallsicherheit: Isoliert Ausfälle und reduziert die Auswirkungen von Problemen in einem Dienst auf andere.
Vergleich mit Monolithen:
Monolithen: Anwendungen, die in eine einzige Codebasis integriert sind. Obwohl sie anfangs einfach sind, kann es mit der Zeit schwierig werden, sie zu warten und zu skalieren.
Microservices: Sie bieten mehr Flexibilität und Skalierbarkeit, können aber zusätzliche Komplexität bei der Verwaltung und Kommunikation zwischen Diensten schaffen.
In einer Microservices-Architektur kann die Kommunikation zwischen Diensten im Wesentlichen auf zwei Arten erfolgen: asynchrone Kommunikation, beispielsweise mithilfe von Nachrichtenwarteschlangen, und synchrone Kommunikation über REST-APIs. Es ist hervorzuheben, dass es neben dem Anstehen und Ausruhen noch andere Formen der Kommunikation gibt.
Nachrichtenwarteschlangen werden verwendet, um eine asynchrone Kommunikation zwischen Microservices zu ermöglichen. Sie ermöglichen es Diensten, Nachrichten zu senden und zu empfangen, ohne dass eine sofortige Antwort erforderlich ist, was zur Verbesserung der Systemstabilität und Skalierbarkeit beiträgt.
Rolle von Nachrichtenwarteschlangen:
Asynchrone Kommunikation: Erleichtert den Informationsaustausch zwischen Diensten, ohne dass eine sofortige Reaktion erforderlich ist.
Ausfallsicherheit: Bewältigt Lastspitzen und vorübergehende Ausfälle und stellt sicher, dass Nachrichten letztendlich verarbeitet werden.
Implementierung:
Tools: RabbitMQ und Kafka sind beliebte Optionen zum Verwalten von Nachrichtenwarteschlangen.
Integration: Implementieren Sie Nachrichtenwarteschlangen für die Kommunikation zwischen in Go und NodeJS geschriebenen Diensten, um einen effizienten und skalierbaren Datenaustausch sicherzustellen.
RESTful APIs werden für die synchrone Kommunikation zwischen Diensten verwendet. Sie basieren auf HTTP-Prinzipien und ermöglichen eine standardisierte und effiziente Interaktion von Diensten.
Clean Architecture ist ein Designansatz, der darauf abzielt, Systeme mit einer gut organisierten Codebasis zu erstellen, die einfach zu warten und/oder zu testen ist. Es betont die Trennung der Anliegen und die Unabhängigkeit der Schichten.
Prinzipien sauberer Architektur:
Schichtentrennung: Teilen Sie den Code in verschiedene Schichten (Domäne, Anwendung, Infrastruktur) auf, um die Geschäftslogik von technischen Belangen zu isolieren.
Unabhängigkeit von Frameworks und Bibliotheken: Stellen Sie sicher, dass die Geschäftslogik nicht von bestimmten Frameworks oder Technologien abhängig ist.
Anwendung in Microservices:
Code-Organisation: Strukturieren Sie jeden Microservice nach den Prinzipien der Clean Architecture, um modularen, testbaren und leicht zu wartenden Code zu gewährleisten.
Wartung und Weiterentwicklung: Erleichtern Sie das Hinzufügen neuer Funktionen und die Änderung vorhandener Funktionen, ohne die Integrität des Systems zu beeinträchtigen.
Im Microservices-Ökosystem spielt ein HTTP-Endpunkt eine entscheidende Rolle bei der Orchestrierung des Dokumenten-Workflows, in diesem Zusammenhang ist er der Ausgangspunkt für alles. Dieser Endpunkt ist für den Empfang und die Verarbeitung der Anfrage zur Erstellung eines neuen Dokuments verantwortlich. Nach Erhalt einer Anfrage stellt es das Dokument in die Warteschlange des Go-Mitarbeiters, der sich um die Generierung und Verarbeitung des Dokuments kümmert. Darüber hinaus gibt der Endpunkt über eine Nachrichtenwarteschlange eine Benachrichtigung an den Dokumentendienst aus, in der er darüber informiert, dass eine neue Ressource, also ein Dokument, zur Verarbeitung in die Warteschlange gelangt ist. Dieser Ansatz gewährleistet eine effiziente Integration zwischen Systemkomponenten und ermöglicht es dem Endpunkt, die Erstellung und Verfolgung von Dokumenten auf koordinierte und asynchrone Weise zu verwalten, während sich der Go-Worker um die eigentliche Erstellung von Dokumenten kümmert und der Dokumentendienst über neue Elemente im aktualisiert wird Warteschlange.
Zusätzlich zum HTTP-Endpunkt verfügt das System über zwei Worker mit unterschiedlichen Rollen. Der erste, in Go implementierte, ist für die Generierung von Dokumenten verantwortlich. Es verbraucht Aufgaben aus einer Nachrichtenwarteschlange, verarbeitet die Daten und benachrichtigt nach Abschluss der Verarbeitung einen bestimmten Endpunkt über den Abschluss. Die Effizienz von Go sorgt für eine schnelle und robuste Verarbeitung. Der zweite, in NodeJS entwickelte Worker kümmert sich um die Erstellung des Ausgangszustands der Dokumente und definiert sie beim Einfügen in das System als „unverarbeitet“. Die Agilität von NodeJS ermöglicht eine schnelle und effiziente Verwaltung des Dokumentstatus vom Beginn des Workflows an.
Zusammenfassend zeigt das beschriebene System einen gut koordinierten Ablauf für das Dokumentenmanagement. Der HTTP-Endpunkt bietet zusammen mit Go- und NodeJS-Workern eine integrierte und effiziente Lösung, die die Dokumentenverarbeitung von der Erstellung bis zur Fertigstellung gewährleistet. Die Interaktion zwischen Workern und REST spiegelt sich im folgenden Architekturbild wider, das zeigt, wie die Architektur Skalierbarkeit und Modularität fördert und so einen robusten und koordinierten Arbeitsablauf gewährleistet. Dieser Ansatz verbessert nicht nur die betriebliche Effizienz, sondern kann auch an verschiedene Nutzungsszenarien angepasst werden und bietet so Flexibilität und zukünftiges Wachstum.
Die endgültige Zeichnung:
Das Projekt-Repository: https://github.com/williamMDsilva/microservice-poc
Die Implementierung einer Microservices-Architektur mit Clean Architecture kann mehrere Herausforderungen mit sich bringen. Eine der größten Herausforderungen ist ein tiefes Verständnis des Geschäfts, um Code zu erstellen, der wirklich skalierbar ist und die Integrität der Geschäftslogik wahrt. Clean Architecture erfordert, dass der Code so strukturiert ist, dass die Belange klar voneinander getrennt werden, was detaillierte Kenntnisse der Domäne erfordert, damit Abstraktionen und Trennungen effektiv sind.
Darüber hinaus ist die Kenntnis der SOLID-Prinzipien von entscheidender Bedeutung. Diese Prinzipien tragen dazu bei, kohärenteren, weniger gekoppelten Code zu erstellen, und ein solides Verständnis dieser Prinzipien kann viel Zeit bei der Recherche und Fehlerbehebung sparen. Die Anwendung der SOLID-Prinzipien verbessert nicht nur die Codequalität, sondern erleichtert auch die Systemwartung und Skalierbarkeit.
Im speziellen Fall von Go kann eine solide Grundlage in der Sprache die Lesbarkeit und Wartbarkeit des Codes verbessern. Go bietet Tools und Praktiken, die dabei helfen, den Code sauber und effizient zu halten, und tieferes Wissen kann bei der Implementierung komplexer Dienste einen Unterschied machen.
Schließlich kann die Verwendung einer guten Boilerplate äußerst vorteilhaft sein. Gut gestaltete Boilerplates für saubere Architektur beschleunigen nicht nur den Entwicklungsstart, sondern stellen auch sicher, dass neue Funktionen innerhalb des ursprünglich vorgeschlagenen Standards hinzugefügt werden. Sie bieten eine Struktur, die dazu beiträgt, die Codekonsistenz und -qualität während des gesamten Projekts aufrechtzuerhalten.
Um die beschriebene Architektur voranzutreiben und zu verbessern, werden einige nächste Schritte empfohlen:
Beziehen Sie Überwachungs- und Beobachtbarkeitsressourcen ein: Die Implementierung von Überwachungs- und Beobachtbarkeitstools ist für die Gewährleistung der Systemgesundheit und -leistung von entscheidender Bedeutung. Die Einbeziehung von Metriken, Protokollen und Ablaufverfolgung hilft, Probleme zu identifizieren und das Systemverhalten in der Produktion zu analysieren.
Behandlungen für Nichtverfügbarkeit hinzufügen: Es ist von entscheidender Bedeutung, Mechanismen zum Umgang mit Ausfällen und Nichtverfügbarkeit einzubeziehen, wie z. B. Wiederholungsversuche, Leistungsschalter und Fallback-Strategien, um die Belastbarkeit des Systems zu erhöhen und die Kontinuität der Dienste zu gewährleisten.
Einheiten- und Integrationstests durchführen: Tests sind unerlässlich, um die Qualität des Codes und die korrekte Integration von Komponenten sicherzustellen. Unit-Tests überprüfen die Funktion isolierter Teile des Codes, während Integrationstests sicherstellen, dass die verschiedenen Komponenten des Systems korrekt zusammenarbeiten.
Dienste und Module umgestalten: Die Überprüfung und Umgestaltung vorhandener Dienste und Module, um sicherzustellen, dass der Code sauber, lesbar und an den Clean Architecture-Prinzipien ausgerichtet bleibt, ist eine fortlaufende Aufgabe, die die Wartbarkeit und Skalierbarkeit des Systems verbessert.
Proof of Concept mit Kafka: Die Erwägung eines Proof of Concept zum Ersetzen von RabbitMQ durch Kafka kann Einblicke in die Auswirkungen verschiedener Tools auf das Projekt geben. Die Analyse der Auswirkungen auf das Servicedesign und die Gesamtarchitektur kann wertvolle Erkenntnisse für zukünftige Technologieentscheidungen liefern.
Dieses Projekt demonstrierte die Wirksamkeit einer gut geplanten Architektur und die Bedeutung einer sorgfältigen Umsetzung der Clean Architecture-Prinzipien. Die Verwendung von Go und NodeJS in Kombination mit Praktiken wie SOLID und der Verwendung von Nachrichtenwarteschlangen und REST-APIs trug zu einem robusten und skalierbaren System bei. Die Entwicklung und Wartung einer Microservices-Architektur stellt jedoch Herausforderungen dar, die fundierte Kenntnisse des Geschäfts und der Technologie erfordern. Die Bewältigung dieser Herausforderungen durch angemessene Planung und die Einführung bewährter Verfahren trägt dazu bei, den Aufbau effizienter und nachhaltiger Systeme sicherzustellen. Der Weg nach vorne beinhaltet die Integration kontinuierlicher Verbesserungen, wie z. B. fortschrittlicher Überwachung und neuer Konzeptnachweise, um die Architektur an die Bedürfnisse und die Entwicklung des Unternehmens anzupassen.
Martin, R. C. (2008). Clean Code: Praktische agile Softwarefähigkeiten. Alta Books.
Martin, R. C. (2017). Saubere Architektur: Frameworks und Prinzipien für Software-Design. Alta Books.
RabbitMQ. (o.J.). Tutorial Zwei – JavaScript. Abgerufen von https://www.rabbitmq.com/tutorials/tutorial-two-javascript
RabbitMQ. (o.J.). Tutorial Zwei – Los. Abgerufen von https://www.rabbitmq.com/tutorials/tutorial-two-go
Aufgrund des akademischen Charakters und des Proof-of-Concept-Charakters dieses Projekts wurden einige Funktionen nicht implementiert und verbleiben als technische Schulden für zukünftige Studien. Bereiche wie automatisierte Tests, Fehlerbehandlung, Ressourcen-Streaming, Service-Authentifizierung und Beobachtbarkeit sind Themen, die noch erforscht werden müssen. Jede konstruktive Kritik ist willkommen und erwünscht, da sie zur kontinuierlichen Verbesserung und Vertiefung des Wissens in diesen wichtigen Bereichen beiträgt.
Das obige ist der detaillierte Inhalt von[MICROSERVICES] Message Queues und REST – Ein Ansatz mit Go, NodeJS und Clean Architecture. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!