NestJS での gRPC マイクロサービス通信

あなたが休暇で家にいて、家族が集まることにしたと想像してください。一人がすべての料理を作るのではなく、全員が自分の得意な料理を持ち寄ることに同意します。目標は、これらすべての料理を組み合わせて完全な食事を作成することです。あなたはチキンチャーハンを作ることに同意し、兄はデザートにケーキを作り、妹はサラダを作ることにします。

各ディッシュは、特定の機能または目的を持つマイクロサービスを表します。たとえば、チャーハンはボリュームのあるメインコースを表し、サラダは新鮮で健康的なおかずを表し、ケーキは甘いデザートを表します。マイクロサービス アーキテクチャでは、開発者は各マイクロサービスを他のマイクロサービスから独立して開発、デプロイ、保守できるため、各マイクロサービスが独立した状態に保たれます。

家族のパーティーの各料理が異なる機能や目的を持つマイクロサービスを表すのと同じように、ソフトウェア システム内の各マイクロサービスは他のマイクロサービスと効果的に通信して、完全に機能するアプリケーションを形成する必要があります。おいしい食事を作るために各料理を他の料理と調整する必要があるのと同様に、マイクロサービスの数が増加するにつれて、マイクロサービス間の通信がますます重要になります。gRPC などの効率的な通信フレームワークを使用して耐久性とスケーラブルなシステムを構築することで、マイクロサービスがシームレスに実行できるようになります。

ここに画像の説明を挿入します

この記事では、高性能のオープンソース リモート プロシージャ コール フレームワークである gRPC を使用して、NestJS アプリケーション内のマイクロサービスがどのように通信できるようにするかを学びます。gRPC を使用する利点、NestJS アプリケーションでそれを行う方法について説明し、gRPC を使用してマイクロサービスがどのように通信できるかの例を示します。

前提条件

まずは前提条件と必要なツールについて説明します。

  • NPM を使用した Node.js – アプリケーションの依存関係を実行および処理します。
  • NestJS CLI – NestJS アプリケーションの構築、管理、実行用。
  • プロトコル バッファ – gRPC でメッセージとサービスを定義します。
  • gRPC – NestJS アプリケーションのマイクロサービスが相互に通信できるようにします。
  • grpurl – 単純なマイクロサービス通信をテストできます。

マイクロサービスとその通信方法

マイクロサービスはさまざまな方法で相互に通信します。マイクロサービス アーキテクチャ内の各マイクロサービスは特定の機能またはタスクを実行するため、アプリケーション全体が正しく機能することを保証するには通信が必要です。マイクロサービス アーキテクチャでは、各マイクロサービスが独立しているため、開発者はより柔軟でスケーラブルでフォールト トレラントなアプリケーションを作成できます。さらに、マイクロサービスのモジュール設計により、異なるシステム コンポーネントには異なるニーズや要件があるため、複雑なアプリケーションに最適です。

マイクロサービス通信の課題

通常、マイクロサービスは明確に定義された API とプロトコルを通じて相互に通信し、各マイクロサービスが確実かつ効率的に通信できるようにします。ただし、マイクロサービス間の通信は少し難しく、注意が必要な場合があります。多くのマイクロサービスが相互に通信する場合、開発者は次のようないくつかの問題に遭遇する可能性があります。

  • 遅延: 通信とデータ転送の非効率によるネットワークの混雑。
  • セキュリティ: アクセス制御が不十分に管理されているか、必要なセキュリティ プロトコルが導入されていないことが原因で、潜在的な脆弱性や脅威が発生する可能性があります。
  • サービスの検出: システム内のサービスの数が増えると、適切なサービスの管理と検索が困難になります。さらに悪いことに、ハードコーディングされたエンドポイントがあると、システムが脆弱になる可能性があります。
  • フォールト トレランス: 複数のサービスが相互に対話するため、サービスの障害がシステム全体に波及する可能性があります。

全体として、マイクロサービス間の通信は困難で複雑になる可能性があります。開発者は、システムを設計するときに次の要素を考慮することで、拡張性が高く、フォールト トレラントで復元力の高いマイクロサービス アーキテクチャを作成できます。

  • コミュニケーションが中心です。
  • 効率的な通信プロトコル。
  • 適切なセキュリティプロトコル。
  • サービスを動的に見つけて通信するためのサービス検出メカニズム。

マイクロサービスの通信パターン

ここに画像の説明を挿入します

マイクロサービスは、さまざまな通信パターンを使用して相互に通信します。パブリッシュ/サブスクライブ、リクエスト/レスポンス、イベント駆動型アーキテクチャ、メッセージ キューなどのいくつかを見ていきます。

  • パブリッシュ/サブスクライブ パターン: 複数のサブスクライバーにメッセージをパブリッシュする 1 対多の通信が含まれます。たとえば、企業はさまざまなニュースレターの購読者に電子メールを送信します。
  • リクエストとレスポンスのパターン: あるサービスが別のサービスにリクエストを送信し、受信したサービスがレスポンスを送り返します。たとえば、API がリクエストを受信し、リクエストされたデータまたはエラー メッセージを応答として送り返す場合です。
  • メッセージ キュー パターン: このパターンでは、メッセージはキューに送信され、サービスが処理できるようになるまで保存されます。たとえば、配送会社はこのパターンを使用して、顧客の配送リクエストを受信して​​整理し、所在地に基づいて利用可能なドライバーを割り当てることができます。
  • イベント駆動型アーキテクチャ: このパターンでは、イベントが発生するとサービスがメッセージを交換します。たとえば、ユーザーがモバイル バンキング アプリから送金すると、口座更新サービスに差し引かれた金額が通知されます。

gRPC の概要

gRPC は、Google が開発した高性能のオープンソース リモート プロシージャ コール (RPC) フレームワークです。これにより、クライアント アプリケーションは、ローカル オブジェクトのメソッドを呼び出すのと同じくらい簡単に、リモート コンピュータにあるサーバー アプリケーションのメソッドを呼び出すことができます。クライアント アプリケーションとサーバー アプリケーションの間で言語に依存しない効率的な通信を提供することで、分散アプリケーションの構築と拡張のプロセスを簡素化します。

マイクロサービスにおける gRPC、REST、SOAP の比較

マイクロサービス アーキテクチャで使用される通信プロトコルには、gRPC、REST、SOAP などがあります。それらの主な違いは次のとおりです。

  • 言語サポート: Web ベースのプログラミング言語では REST と SOAP が一般的に使用されますが、gRPC は C++、Java、Python などの複数のプログラミング言語をサポートします。
  • パフォーマンス: gRPC はバイナリ シリアル化、圧縮データ形式、双方向ストリーミングを使用するため、REST や SOAP よりも高速で効率的です。したがって、クライアント アプリケーションとサーバー アプリケーションはリアルタイムで通信できます。
  • データ形式: REST と SOAP は XML または JSON を使用しますが、gRPC はバイナリ シリアル化標準であるプロトコル バッファーを使用します。
  • 強力な型指定とサービス コントラクト: サービス コントラクトを確立するために、gRPC はプロトコル バッファーを使用します。これにより、強力な型指定が提供され、サービスのバージョン管理とメンテナンスが容易になります。REST と SOAP は、サービス コントラクトで表現力が低く柔軟な WSDL または OpenAPI 定義を使用します。
  • スケーラビリティ: gRPC は、大規模な分散システムを処理するように構築されており、負荷分散やヘルス チェックなどの機能をすぐに備えているため、マイクロサービス アーキテクチャに最適です。

NestJS での gRPC の使用

このセクションでは、gRPC を使用して「Hello, World!」を返す単純な NestJS マイクロサービスを作成する方法を学習します。

まず、NestJS CLI と gRPC ツールをインストールする必要があります。

npm install -g @nestjs/cli
npm install @nestjs/microservices @grpc/grpc-js

CLI を使用して新しい NestJS プロジェクトを作成する必要があります。

nest new hello-world-demo

この例のプロジェクト名は「hello-world-demo」です。

次に、プロジェクト フォルダーに移動します。

cd hello-world-demo

次に、新しいモジュールとサービスを作成する必要があります。サービスは特定のタイプの機能をアプリケーションに提供するクラスであり、モジュールは関連するサービス、コントローラー、プロバイダーのコレクションのコンテナーです。これを行うことで、基本的に、管理可能でテスト可能な機能の新しいレイヤーを NestJS アプリケーションに追加することになります。これにより、将来他の機能を追加しやすくなり、アプリケーションの一般的なアーキテクチャと保守性が向上します。

nest g module hello
nest g service hello

hello-world-demo/src/hello/hello.service.ts次に、次のコードでファイルを更新する必要があります。

import {
    
     Injectable } from '@nestjs/common';
import {
    
     GrpcMethod } from '@nestjs/microservices';

@Injectable()
export class HelloService {
    
    
  @GrpcMethod('HelloService', 'SayHello')
  sayHello(data: any): {
    
     message: string } {
    
    
    return {
    
     message: 'Hello, World!' };
  }
}

このサービス ファイルには、注入可能なプロバイダーとしてマークされた HelloService クラスが含まれています。@GrpcMethodデコレータは、sayHelloメソッドを「Hello, World!」メッセージを返す gRPC メソッドとしてマークするために使用されます。全体として、このコードは、NestJS を使用して基本的な gRPC サービスを作成する方法を示しています。

hello-world-demo/src/app.module.tsgRPC を含めて使用するようにファイルを更新しますHelloService

import {
    
     Module } from '@nestjs/common';
import {
    
     ClientsModule, Transport } from '@nestjs/microservices';
import {
    
     AppController } from './app.controller';
import {
    
     AppService } from './app.service';
import {
    
     HelloService } from './hello/hello.service';

@Module({
    
    
  imports: [
    ClientsModule.register([
      {
    
    
        name: 'HELLO_PACKAGE',
        transport: Transport.GRPC,
        options: {
    
    
          url: 'localhost:5000',
          package: 'hello',
          protoPath: './hello.proto',
        },
      },
    ]),
  ],
  controllers: [AppController],
  providers: [AppService, HelloService],
})
export class AppModule {
    
    }

これには、HelloService プロバイダー クラス、HTTP コントローラー、および AppService HelloService プロバイダー クラス用の gRPC クライアントがあります。ClientsModule によって使用されます。サービスを説明するプロトタイプ ファイルへのパス、gRPC サーバーの URL、パッケージの名前など、提供されたオプションを使用して gRPC クライアントを登録します。プロバイダー アプリケーションのビジネス ロジックを管理する AppService クラスと HelloService クラスは、フィールドに含まれています。AppController への受信 HTTP リクエストを管理するクラスは、controllers プロパティのメンバーです。

新しいファイルを作成しhello-world-demo/hello.proto、次のコードを追加します。

syntax = "proto3";

package hello;o

service HelloService {
  rpc SayHello (HelloRequest) returns (HelloResponse);
}

message HelloRequest {
  string name = 1;
}

message HelloResponse {
  string message = 1;
}

プロトタイプ ファイルは、gRPC サービスの構造とインターフェイスを定義するために使用されます。これは、サービスのプロセスとパラメータの入出力データの形式の概要を説明するドキュメントです。gRPC フレームワークは、プロトコル バッファー言語で記述された proto ファイルを使用して、NestJs でクライアント コードとサーバー コードを生成します。

最後に、hello-world-demo/src/main.tsファイルを更新して gRPC マイクロサービスを開始します。

import {
    
     NestFactory } from '@nestjs/core';
import {
    
     Transport } from '@nestjs/microservices';
import {
    
     AppModule } from './app.module';

async function bootstrap() {
    
    
  const app = await NestFactory.createMicroservice(AppModule, {
    
    
    transport: Transport.GRPC,
    options: {
    
    
      url: 'localhost:5000',
      package: 'hello',
      protoPath: './hello.proto',
    },
  });
  await app.listen();
}
bootstrap();

次に、gRPC マイクロサービスを開始します。

npm run start

サーバーが起動すると、指定された URL とポート (この場合は 5000) で受信 gRPC リクエストをリッスンします。その後、Web フロントエンド、モバイル アプリ、その他のマイクロサービスなどの gRPC クライアントからサーバーにリクエストを送信できます。私たちが取り組んでいる「Hello World」の例では、grpcurl コマンドライン ツールを使用してリクエストを送信することでサーバーをテストできます。マイクロサービスをテストするには、gRPC サービスと対話するためのコマンド ライン ツールである grpcurl を使用できます。

grpcurl -plaintext -d '{"name": "John"}' localhost:5000 hello.HelloService/SayHello

これにより、次の応答が返されるはずです。

{
    
    
  "message": "Hello, World!"
}

それでおしまい!gRPC を使用して「Hello, World!」を返す NestJS マイクロサービスを作成し、grpcurl でテストしました。もちろん、実際のアプリケーションでは、マイクロサービスは、単一のリクエストに応じて単に「Hello, World!」を返すよりも複雑な機能を備えている場合があります。ただし、サーバーを起動し、受信リクエストをリッスンし、ビジネス ロジックに基づいてそれらのリクエストを処理するという基本的なプロセスは同じです。

マイクロサービス通信に gRPC を使用する利点

マイクロサービス通信に NestJS と gRPC を使用すると、より高速で信頼性が高く、よりスケーラブルなシステムを実現できます。以下にいくつかの利点があります。

  • 厳密に型指定されたコントラクト: gRPC によって提供される API は厳密に型指定されており、プロトコル バッファーを使用してサービス コントラクトを構築します。つまり、サーバーとクライアントの両方が、送受信するメッセージが特定のスキーマに従っていることを確認できます。
  • 自動コード生成: NestJS は、gRPC サービス定義ファイル (.proto) から TypeScript コードを簡単に自動生成できるツールを提供します。これにより、マイクロサービスと NestJS の統合が簡単になります。
  • 相互運用性: NestJS と gRPC を、異なる通信プロトコルを使用する他のサービスで実行できるようにすることで、HTTP/REST などの他のプロトコルでの実行を容易にします。
  • 使いやすさ: NestJS は、gRPC サービスを定義するためのわかりやすい API を提供し、マイクロサービスの構築と管理を簡単にします。

結論は

マイクロサービス アーキテクチャは、複雑でスケーラブルなアプリケーションを設計する方法としてより一般的になりつつあります。アプリケーションを独立した専用コンポーネントに分解することで、柔軟性と拡張性を提供します。ただし、この設計の有効性は、マイクロサービス間の効果的な通信に依存します。ここで、高性能リモート プロシージャ コール (RPC) フレームワークである gRPC が登場します。

この記事では、マイクロサービス通信に NestJS で gRPC を使用する利点を検討しました。レイテンシ、セキュリティ、サービス検出、フォールト トレランスなど、マイクロサービス通信に関わる課題について説明します。また、開発者がこれらの課題を克服し、スケーラブルでフォールト トレラントなマイクロサービス アーキテクチャを構築するのに gRPC がどのように役立つかを検討します。さらに、gRPC を REST や SOAP などの他の通信プロトコルと比較し、その言語サポート、パフォーマンス、データ形式、サービス契約の利点を強調します。

さらに、NestJS で gRPC を使用してシンプルな「hello world」サービスを構築し、Nest アプリケーション内のサービスが gRPC を使用して効果的に通信する方法を実証しました。

最後に、強く型指定されたコントラクト、自動コード生成、相互運用性、使いやすさなど、NestJS でのマイクロサービス通信に gRPC を使用する利点について説明しました。

要約すると、開発者は gRPC のパフォーマンスとタイプ セーフティ、そして NestJS のシンプルさを利用して、効率的な通信チャネルを備えたスケーラブルで保守可能なマイクロサービスを構築でき、その結果、より堅牢で信頼性の高いシステムが実現します。

おすすめ

転載: blog.csdn.net/jslygwx/article/details/132425858