開発覚書はてな版

個人的な開発関連の備忘録

【NestJS】NestJSでgRPCを使ってみた - client編

概要

今回はNestJS上でgRPCクライアントを作成したサンプルです。

gRPCについては以下のページを参照 grpc.io

NestJSのgRPCの説明記事 docs.nestjs.com

NestJSでgRPC Serverを作成した記事 kakkoyakakko2.hatenablog.com

実行環境

  • Node.js - 10.x

使用ライブラリ

  • @nestjs/core - 6.7.x
  • @nestjs/microservices - 7.0.x
  • grpc - 1.24.x

サンプルソース

proto/sample.proto

syntax = "proto3";

package sample;

service AppService {
  rpc FindOne (SampleDataById) returns (SampleData) {}
}

message SampleDataById {
  int32 id = 1;
}

message SampleData {
  int32 id = 1;
  string name = 2;
}

app.service.ts

  • @Inject('SAMPLE_PACKAGE')app.module.ts で設定した内容が設定されます。
import { Injectable, OnModuleInit, Inject } from '@nestjs/common';
import { ClientGrpc } from '@nestjs/microservices';
import { Observable } from 'rxjs';

interface SampleService {
  findOne(data: { id: number }): Observable<any>;
}

@Injectable()
export class AppService implements OnModuleInit {
  private sampleService: SampleService;

  constructor(@Inject('SAMPLE_PACKAGE') private client: ClientGrpc) {}

  onModuleInit() {
    this.sampleService = this.client.getService<SampleService>('AppService');
  }

  getSampleData(): Observable<string> {
    return this.sampleService.findOne({ id: 1 });
  }
}

app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { Observable } from 'rxjs';

import { AppService } from './app.service';

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

  @Get()
  call(): Observable<any> {
    return this.appService.getSampleData();
  }
}

app.module.ts

  • localhost:5000 はローカルのgRPCサーバーのアドレスです。
import { Module } from '@nestjs/common';
import { Transport, ClientsModule } from '@nestjs/microservices';
import { join } from 'path';

import { AppController } from './app.controller';
import { AppService } from './app.service';

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

main.ts

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

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  await app.listen(3000);
}
bootstrap();

実行結果

  • http://localhost:3000/ にブラウザからアクセスすることで、gRPCサーバーからデータを取得します。

f:id:kakkoya:20200518094720p:plain

サンプルソース一式

github.com

おわりに

  • 追加のインストールや設定などが複雑ではないので、簡単に環境が構築できました。
  • gRPCのサーバー・クライアント共にNestJSで完結して開発できるので便利です。