zoukankan      html  css  js  c++  java
  • 使用nestjs集成grpc具体操作

    两个程序中, 提供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的方法了
     
     
     
  • 相关阅读:
    vs2013+opencv2410的一些问题
    windows下bat批量处理启动exe
    https://blog.csdn.net/u012235003/article/details/54576737
    error LNK2005:"private:__thiscall编译错误
    后缀自动机学习笔记
    后缀数组学习笔记
    AC自动机学习笔记
    KMP
    Manacher学习笔记
    字符串Hash/树Hash学习笔记
  • 原文地址:https://www.cnblogs.com/liangyy/p/11911626.html
Copyright © 2011-2022 走看看