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 und 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, um sicherzustellen, dass die Geschäftslogik von Infrastrukturproblemen und/oder Abhängigkeiten isoliert ist.
Das 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.
Auf der Grundlage dieser 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.
Belastbarkeit: 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 jedoch zu zusätzlicher Komplexität bei der Verwaltung und Kommunikation zwischen Diensten führen.
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 Warteschlangen und Ruhen noch andere Formen der Kommunikation gibt.
Nachrichtenwarteschlangen werden verwendet, um die 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.
Umsetzung:
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.
Saubere Architekturprinzipien:
層の分離: コードを個別の層 (ドメイン、アプリケーション、インフラストラクチャ) に分割して、ビジネス ロジックを技術的な懸念事項から分離します。
フレームワークやライブラリからの独立性: ビジネス ロジックが特定のフレームワークやテクノロジーに依存していないことを確認します。
マイクロサービスでのアプリケーション:
コードの構成: クリーン アーキテクチャの原則に従って各マイクロサービスを構造化し、コードがモジュール化され、テスト可能で保守が容易になるようにします。
メンテナンスと進化: システムの整合性を損なうことなく、新しい機能の追加や既存の機能の変更を容易にします。
マイクロサービス エコシステムでは、HTTP エンドポイントはドキュメント ワークフローを調整する上で重要な役割を果たします。このコンテキストでは、HTTP エンドポイントがすべての始まりです。このエンドポイントは、新しいドキュメントを作成するリクエストを受信して処理する役割を果たします。リクエストを受信すると、ドキュメントを Go ワーカーのキューに入れ、Go ワーカーがドキュメントの生成と処理を担当します。さらに、エンドポイントは、メッセージ キューを介してドキュメント サービスに通知を発行し、新しいリソース、つまりドキュメントが処理のためにキューに入ったことを知らせます。このアプローチにより、システム コンポーネント間の効率的な統合が保証され、エンドポイントが協調的かつ非同期的な方法でドキュメントの作成と追跡を管理できるようになり、Go ワーカーが実際のドキュメントの作成を担当し、ドキュメント サービスがシステム内の新しいアイテムで更新されます。待ちます
HTTP エンドポイントに加えて、システムには異なる役割を持つ 2 つのワーカーがあります。 1 つ目は Go で実装され、ドキュメントの生成を担当します。メッセージ キューからタスクを消費し、データを処理し、処理が完了すると、特定のエンドポイントに完了を通知します。 Go の効率性により、高速かつ堅牢な処理が保証されます。 NodeJS で開発された 2 番目のワーカーは、ドキュメントの初期状態の作成を処理し、システムに挿入されるときにドキュメントを「未処理」として定義します。 NodeJS の機敏性により、ワークフローの開始時からドキュメントの状態を迅速かつ効率的に管理できます。
要約すると、ここで説明したシステムは、文書管理の適切に調整されたフローを示しています。 HTTP エンドポイントは、Go および NodeJS ワーカーと連携して、統合された効率的なソリューションを提供し、作成から完了までのドキュメント処理を保証します。ワーカーと REST の間の対話は、以下のアーキテクチャ イメージに反映されています。これは、アーキテクチャがどのようにスケーラビリティとモジュール性を促進し、堅牢で調整されたワークフローを保証するかを示しています。このアプローチは、運用効率を向上させるだけでなく、さまざまな使用シナリオに適応させることができ、柔軟性と将来の成長を実現します。
最終的な絵:
プロジェクトリポジトリ: https://github.com/williamMDsilva/microservice-poc
クリーン アーキテクチャを使用してマイクロサービス アーキテクチャを実装すると、いくつかの課題が発生する可能性があります。主な課題の 1 つは、ビジネスを深く理解し、真にスケーラブルでビジネス ロジックの整合性を維持するコードを作成することです。クリーン アーキテクチャでは、関心事項を明確に分離する方法でコードを構造化する必要があります。これには、抽象化と分離を効果的に行うためのドメインの詳細な知識が必要です。
さらに、SOLID原則の知識が非常に重要です。これらの原則は、より結合性の低いコードを作成するのに役立ち、それらをしっかりと理解することで、調査やトラブルシューティングにかかる時間を大幅に節約できます。 SOLID 原則を適用すると、コードの品質が向上するだけでなく、システムのメンテナンスとスケーラビリティも容易になります。
Go の特定のケースでは、言語の強固な基盤により、コードの可読性と保守性が向上します。 Go は、コードをクリーンかつ効率的に保つのに役立つツールとプラクティスを提供しており、複雑なサービスを実装する際には深い知識が違いを生みます。
最後に、優れた定型文を使用することは非常に有益です。クリーン アーキテクチャ向けに適切に設計されたボイラープレートは、開発の開始を迅速化するだけでなく、最初に提案された標準内に新しい機能が確実に追加されるようにします。これらは、プロジェクト全体を通じてコードの一貫性と品質を維持するのに役立つフレームワークを提供します。
ここで説明したアーキテクチャを発展させ、改善するには、次のいくつかのステップが推奨されます:
監視および可観測性リソースを含める: システムの健全性とパフォーマンスを確保するには、監視および可観測性ツールの実装が不可欠です。メトリクス、ログ、トレースを含めることで、本番環境での問題を特定し、システムの動作を分析するのに役立ちます。
単体テストと統合テストを実行する: テストは、コードの品質とコンポーネントの正しい統合を確認するために不可欠です。単体テストはコードの分離された部分の機能を検証し、統合テストはシステムのさまざまなコンポーネントが正しく連携して動作することを確認します。
サービスとモジュールのリファクタリング: 既存のサービスとモジュールをレビューおよびリファクタリングして、コードがクリーンで読みやすく、クリーン アーキテクチャの原則に沿っていることを確認することは、システムの保守性と拡張性を向上させる継続的なタスクです。
Kafka を使用した概念実証: RabbitMQ を Kafka に置き換える概念実証を検討すると、さまざまなツールがプロジェクトにどのような影響を与えるかについての洞察が得られます。サービス設計と全体的なアーキテクチャに対する影響分析は、将来のテクノロジーに関する意思決定に貴重な洞察を提供します。
4.3 結論
マーティン、RC (2008)。クリーンなコード: 実践的なアジャイル ソフトウェア スキル。アルタブックス
うさぎMQ。 (未確認)。チュートリアル 2 - JavaScript。 https://www.rabbitmq.com/tutorials/tutorial-two-javascript から取得
うさぎMQ。 (未確認)。チュートリアル 2 - https://www.rabbitmq.com/tutorials/tutorial-two-go から取得
免責事項
このプロジェクトの学術的および概念実証の性質により、一部の機能は実装されず、将来の研究のための技術的負債として残されています。自動テスト、エラー処理、リソース ストリーミング、サービス認証、可観測性などの領域は、今後も検討する必要があるトピックです。これらの重要な分野の継続的な改善と知識を深めることに貢献するため、建設的な批判はすべて歓迎され、奨励されます。
以上が[MICROSERVICES] メッセージ キューと REST – Go、NodeJS、クリーン アーキテクチャを使用したアプローチの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。