两个程序中, 提供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 = ;
} message Cat { // 返回类型
int32 id = ;
string name = ;
}
       以上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: , name: 'John' },
{ id: , 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: })
} @Post()
createPosts (@Body() dto: CreateCatsDto) {
return dto
} }
启动demo1与demo2, 这样demo2就可以调用到demo1的方法了
 
 
 

使用nestjs集成grpc具体操作的更多相关文章

  1. Spring Boot 集成 GRPC

    代码地址如下:http://www.demodashi.com/demo/14110.html 一.背景 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring ...

  2. Spring Boot WebFlux 集成 Mongodb 数据源操作

    WebFlux 整合 Mongodb 前言 上一讲用 Map 数据结构内存式存储了数据.这样数据就不会持久化,本文我们用 MongoDB 来实现 WebFlux 对数据源的操作. 什么是 MongoD ...

  3. springmvc集成aop记录操作日志

    首先说明一下,这篇文章只做了记录日志相关事宜 具体springmvc如何集成配置aop对cotroller进行拦截,请看作者的另一篇文章 http://www.cnblogs.com/guokai87 ...

  4. 7、redis之使用spring集成commons-pool来操作常见数据类型

    环境的搭建参见:http://www.cnblogs.com/yangzhilong/p/4729857.html 下面直接贴具体的测试代码: package com.yzl; import java ...

  5. springboot集成grpc

    gRPC 简介 gRPC 是一个现代开源的高性能 RPC 框架,可以在任何环境下运行.它可以有效地将数据中心内和跨数据中心的服务与可插拔支持进行负载均衡.跟踪.健康检查和认证.它也适用于分布式计算,将 ...

  6. Abp + gRpc 如何实现用户会话状态传递

    0.背景 在实际项目当中,我们采用的是 Abp 框架,但是 Abp 框架官方并没有针对 Grpc 进行模块封装.基于此我结合 Abp 与 MagicOnion 封装了一个 Abp.Grpc 模块,它包 ...

  7. 烂泥:KVM、kickstart与FTP集成

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. 在上一篇文章中,我们介绍了有关KVM.kickstart与NFS集成的相关内容.在这节我们将继续介绍FTP与KVM.kickstart集成的相关操作. ...

  8. Zabbix 集成 OneAlert 实现全方位告警

    1. 前言 告警将重要信息发送给运维「或者其他相关人」,及时发现并且处理问题.在所有开源监控软件里面,Zabbix 的告警方式无疑是最棒的.告警的方式各式各样,从 Email 告警到飞信.139/18 ...

  9. ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)

    早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...

随机推荐

  1. 安装php7.2

    1,yum源默认的版本太低了,手动安装有一些麻烦,所以可以采用yum的方式进行安装. 2,检查当前安装的PHP包yum list installed | grep php 如果有安装的PHP包,先删除 ...

  2. 04-Java 对象和类

    Java作为一种面向对象语言.支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研究对象和类的概念. 对象:对象是类的一个实例(对象不是找个女朋友),有状态和行为.例 ...

  3. Number of Digit One(Medium)

    1.算法说明: 如3141592,在m(digitDivide)=100时,即要求计算百位上"1"的个数 其中a为31415,b为92,31415中出现了3142次"1& ...

  4. 函数动态参数和Python中的三种空间

    动态参数 : *args 实参角度: 定义一个函数时, * 将所有的位置参数聚合到一个元祖中 顺序 : 位置参数 > * args > 默认参数 > **kwargs 接受所有参数 ...

  5. 【Linux_Shell 脚本编程学习知识点、判断传入参数是否是 整数】

    判断脚本传入的参数是否是整数 常用的几种方法 完整Shell 脚本如下: #!/bin/sh ##################################################### ...

  6. Windows 10操作系统针对不同环境下的安装方法

    一.电脑系统能正常运行 1.解压win10镜像文件 到电脑的非系统分区,运行setup安装文件 2.点击setup应用程序,准备安装 3.准备安装 4.等待安装过程结束,重启即可. 二.光盘安装 1. ...

  7. motionbuilder卸载/完美解决安装失败/如何彻底卸载清除干净motionbuilder各种残留注册表和文件的方法

    在卸载motionbuilder重装motionbuilder时发现安装失败,提示是已安装motionbuilder或安装失败.这是因为上一次卸载motionbuilder没有清理干净,系统会误认为已 ...

  8. Java IO: PipedInputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedInputStream可以从管道中读取字节流数据,代码如下: 01 InputSt ...

  9. dos窗口运行python文件提示找不到模块

    问题:在pycharm直接运行test_suit.py正常,通过dos窗口运行则提示找不到模块. 原因: https://blog.csdn.net/crylearner/article/detail ...

  10. CF580D_Kefa and Dishes

    D. Kefa and Dishes time limit per test 2 seconds memory limit per test 256 megabytes input standard ...