概要
今回は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サーバーからデータを取得します。
サンプルソース一式
おわりに
- 追加のインストールや設定などが複雑ではないので、簡単に環境が構築できました。
- gRPCのサーバー・クライアント共にNestJSで完結して開発できるので便利です。