web-dev-qa-db-ja.com

Nest.jsマイクロサービスを個別のプロジェクトに分割する方法は?

単純な映画管理プラットフォームを作りたいとしましょう。 moviescinemaspaymentsなどのマイクロサービスはほとんど必要ありません。

Nest.jsでどのように実行しますか?モノリスを作るような感覚で、同じ大きなフォルダーに入れたくないのです。それらを独自のgitリポジトリを持つ個別のNest.jsプロジェクトにして、後でKubernetesでオーケストレーションできるようにしたいと思います。

どうやって? 2つの別個のプロジェクトであり、共有するだけの場合、サービスcinemasからサービスmoviesに接続する方法、たとえば、Redis?

編集:これは、一般的なマイクロサービスに関する質問ではありません。これは、Nest.js固有の質問です。ドキュメントを読みましたが、@Clientトランスポート層への接続用。そのデコレータの使用場所を知りたいだけで、「2つの別個のNest.jsリポジトリを使用して、相互に通信できるようにそれらを接続する方法」についての短いコードを参照できます。

トランスポート層については気にしません。自分で理解できることです。ドキュメントが不足していると思うので、フレームワーク自体に関するアドバイスが必要です。

13

うまくいきました。基本的には、2つの別々のプロジェクトを作成する方法です。たとえば、1つはcreateMicroserviceで、もう1つは単なるHTTPアプリです(ただし、簡単に別のマイクロサービスにすることもできます)。テスト用に簡単に呼び出すことができるように、「通常の」アプリを使用しました。

マイクロサービスを作成するmain.tsファイルは次のとおりです。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { Transport } from '@nestjs/common/enums/transport.enum';

async function bootstrap() {
  const app = await NestFactory.createMicroservice(AppModule, {
    transport: Transport.REDIS,
    options: {
      url: 'redis://localhost:6379',
    },
  });
  await app.listen(() => console.log('MoviesService is running.'));
}
bootstrap();

そして、コントローラーの1つ:

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @MessagePattern({ cmd: 'LIST_MOVIES' })
  listMovies(): string[] {
    return ['Pulp Fiction', 'Blade Runner', 'Hatred'];
  }
}

さて、マイクロサービスでは、コントローラーがどの種類のイベントに反応するかを宣言します(@MessagePattern)。 「通常の」サービスでは、他のマイクロサービスに何かを要求するときにコントローラーでこれを行います(main.tsは、@nestjs/cliを使用して新しいプロジェクトを作成するときに取得する最も簡単な例です。

コントローラーコード:

@Controller()
export class AppController {
  private readonly client: ClientProxy;

  constructor(private readonly appService: AppService) {
    this.client = ClientProxyFactory.create({
      transport: Transport.REDIS,
      options: {
        url: 'redis://localhost:6379',
      },
    });
  }

  @Get()
  listMovies() {
    const pattern = { cmd: 'LIST_MOVIES' };

    return this.client.send<string[]>(pattern, []);
  }
}

したがって、clientがマイクロサービスと同じトランスポート層に接続されている限り、@MessagePatternを使用して互いに通信できます。

より良いコードを作成するには、this.client部分をコンストラクターからプロバイダーに移動し、モジュールでプロバイダーを宣言して依存関係の注入を使用します。

23