首页 > Web开发 > 详细

使用nestjs集成grpc具体操作

时间:2019-11-22 15:30:11      阅读:219      评论:0      收藏:0      [点我收藏+]
两个程序中, 提供grpc服务的称为服务端, 调用grpc服务的为客户端, 以下是grpc服务端和客户端的代码编写
 

 
1. 创建两个nestjs项目demo1(端口: 3000)和demo2(端口: 3001), demo1一个提供grpc服务,demo2调用demo1中的方法
 
  如何创建nest项目和启动这里就不赘述了, nest官网有
 
2. 下载依赖包
npm i --save @nestjs/microservices
npm i --save grpc @grpc/proto-loader

 

3. 服务端demo1中代码
 
     3.1 创建cats.proto文件,此文件demo1与demo2都需要编写这个文件, 内容一致, 名字随便, 但必须是.proto文件
syntax = "proto3";

package first; // 包名

service CatsService {
rpc FindOne (ById) returns (Cat) {} // 暴露方法
}

// message定义结构
message ById { // 参数
int32 id = 1;
}

message Cat { // 返回类型
int32 id = 1;
string name = 2;
}
       以上cats.proto文件中, 定义了路径/first.CatsService/FindOne
        .proto文件:  Protobuf即Protocol Buffers,是Google公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议。
 
     3.2 创建文件 grpc.option.ts, 引用.proto文件
import { Transport, ClientOptions } from @nestjs/microservices;
import { join } from path;
export const grpcServerOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: localhost:8888, // grpc连接ip与端口
    package: first, // 包名 与.proto中保持一致
    protoPath: join(__dirname, ../cats.proto) // 找到cats.proto
  },
};
 
     3.3 main.ts中开启grpc服务
 // 开启grpc 作为grpc服务   
app.connectMicroservice(grpcServerOptions);// grpcServerOptions为3.2中的配置
app.startAllMicroservicesAsync()

 

     3.4 在相应的controller中暴露方法
import { Controller, Get, Param } from @nestjs/common;
import { AppService } from ./app.service;
import { GrpcMethod } from @nestjs/microservices

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

  // @GrpcMethod(CatsService, FindOne) 
  // GrpcMethod中第一个是.proto中服务, 第二个参数是暴露方法名, 不写的话默认是方法的首字母大写
  @GrpcMethod(CatsService, FindOne)
  findOne (data: {id: number}, metdata: any) {
    const items = [
      { id: 1, name: John },
      { id: 2, name: Doe },
    ];
    return items.find(
      ({ id }) => id === data.id
    );
  }

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }

}
公开了方法:
localhost:8888/first.CatsService/FindOne



 
 
4. 客户端demo2中的代码编辑, 目的是使用demo1中的cats的findOne方法
     4.1 创建cats.proto文件, 与demo1中的文件一致
     4.2 创建文件grpc.client.server.ts
import { Injectable } from "@nestjs/common";
import { ClientGrpc, Client } from "@nestjs/microservices";

import { Transport, ClientOptions } from @nestjs/microservices;
import { join } from path;
// 与服务端的options中配置一致
export const grpcClientOptions: ClientOptions = {
  transport: Transport.GRPC,
  options: {
    url: ‘localhost:8888‘, // grpc连接ip与端口
    package: ‘first‘, // 包名 与.proto中保持一致
    protoPath: join(__dirname, ‘../cats.proto‘) // 找到cats.proto
  },
};

@Injectable()
export class ClentServe {
   // 客户端 实例 使用@Client()装饰器 @Client(grpcClientOptions)
public readonly client: ClientGrpc; }

 

     4.3 使用
import { Controller, Get, Post, Body, Inject, OnModuleInit } from @nestjs/common;
import { ApiOperation } from @nestjs/swagger;
import { CreateCatsDto } from ./dto/cat.dto;
import { GrpcMethod } from @nestjs/microservices;
import { ClentServe } from src/grpc-client/client.serve;
import { CatsService } from src/grpc-client/interface/api.interface;

@Controller(cats)
export class CatsController implements OnModuleInit {
private catService
  constructor(@Inject(ClentServe) private readonly clentServe: ClentServe)  {}
  
  onModuleInit() {
  // 可以在程序中创建接口CatsService, 这样调用方法时方便,有提示, 没有也可以
  // this.catService = this.clentServe.client.getService<CatsService>(CatsService)
this.catService = this.clentServe.client.getService(CatsService) } @Get() index() { return this.catService.findOne({id: 2}) } @Post() createPosts (@Body() dto: CreateCatsDto) { return dto } }

 

启动demo1与demo2, 这样demo2就可以调用到demo1的方法了
 
 
 

使用nestjs集成grpc具体操作

原文:https://www.cnblogs.com/liangyy/p/11911626.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!