返回

轻松入门!gRPC + NestJS 的微服务通信之路

见解分享

gRPC 微服务通信:在 NestJS 中实现快速、可扩展的通信

什么是 gRPC?

gRPC 是一种高效的远程过程调用(RPC)框架,允许开发人员跨不同机器轻松调用函数。它以其高性能、可扩展性和易用性而闻名。

gRPC 的优势

  • 高性能: gRPC 利用二进制协议,优化数据传输,确保快速和高效的函数调用。
  • 可扩展性: gRPC 旨在支持大规模系统,提供动态服务发现和负载均衡功能,以适应不断增长的需求。
  • 易于使用: gRPC 提供了直观的 API,简化了客户端和服务端实现的创建,降低了开发难度。

NestJS 中安装 gRPC

要开始在 NestJS 中使用 gRPC,你需要:

npm install @grpc/grpc-js

protobuf 类型系统

gRPC 使用 protobuf 类型系统定义数据结构。Protobuf 是一种语言无关的格式,允许跨不同编程语言表示复杂的数据类型。

proto3 基础知识

proto3 是 protobuf 类型系统的最新版本,它引入了新功能,例如枚举和映射类型。强烈建议了解 proto3 基础知识以创建有效的 gRPC 服务定义。

实战:创建 gRPC 服务

创建一个 proto 文件(helloworld.proto):

syntax = "proto3";

package helloworld;

service Greeter {
  rpc SayHello(HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 1;
}

编译 proto 文件:

protoc --js_out=import_style=commonjs,binary:./js proto/helloworld.proto

创建 gRPC 服务(helloworld.service.ts):

import { Injectable } from '@nestjs/common';
import { ServerGrpc } from '@nestjs/microservices';

@Injectable()
export class HelloworldService {
  private readonly client: any;

  constructor() {
    this.client = new ServerGrpc('localhost:50051');
  }

  sayHello(data: any): Promise<any> {
    return this.client.send('Greeter.SayHello', data);
  }
}

创建 gRPC 客户端

创建一个 gRPC 客户端(helloworld.controller.ts):

import { Controller, Post, Body } from '@nestjs/common';
import { HelloworldService } from './helloworld.service';

@Controller('helloworld')
export class HelloworldController {
  constructor(private readonly helloworldService: HelloworldService) {}

  @Post('sayHello')
  sayHello(@Body() data: any): Promise<any> {
    return this.helloworldService.sayHello(data);
  }
}

使用 gRPC 客户端

在客户端应用程序中,使用 gRPC 客户端发送请求:

const grpc = require('@grpc/grpc-js');
const helloworld = require('./helloworld.pb');

const client = new helloworld.Greeter('localhost:50051', grpc.credentials.createInsecure());

client.sayHello({ name: 'John Doe' }, (err, response) => {
  if (err) {
    console.error(err);
    return;
  }

  console.log(response.message);
});

结论

通过在 NestJS 中集成 gRPC,你可以实现高效、可扩展和易于维护的微服务通信。gRPC 的高性能、灵活性和易用性使其成为现代分布式系统开发的理想选择。

常见问题解答

  1. 什么是 NestJS?
    NestJS 是一个流行的 Node.js 框架,用于构建健壮和可扩展的服务器端应用程序。

  2. gRPC 仅适用于 Node.js 吗?
    不,gRPC 是跨平台的,支持多种编程语言,包括 Java、Python 和 Go。

  3. 何时应该使用 gRPC?
    gRPC 非常适合需要低延迟和高吞吐量的微服务通信方案。

  4. 如何保护 gRPC 通信?
    你可以使用 TLS 或 mTLS 来保护 gRPC 通信,以加密数据并在服务器和客户端之间建立信任。

  5. gRPC 与 RESTful API 有什么区别?
    与 RESTful API 相比,gRPC 采用二进制协议,提供更快的性能和更低的资源消耗。