什么是 gRPC?如何在 Node.js 中实现 gRPC

2025-06-08

什么是 gRPC?如何在 Node.js 中实现 gRPC

根据定义,

gRPC (gRPC Remote Procedure Calls) is an open source remote procedure call (RPC) system initially developed at Google. It uses HTTP/2 for transport, Protocol Buffers as the interface description language, and provides features such as authentication, bidirectional streaming and flow control, blocking or nonblocking bindings, and cancellation and timeouts. 

这么多专业术语,对吧?我们来一一分析一下。

gRPC 建立在远程过程调用和带有协议缓冲区的 Http/2 之上。

什么是远程过程调用(RPC)?

首先,远程过程调用是一种协议,一个程序可以使用它来请求位于不同网络上的另一个程序中的服务,而无需了解网络详细信息。

它不同于正常的过程调用。它利用内核对不同网络中的另一个服务发出请求调用。

什么是协议缓冲区?

Protocol Buffers是一种语言无关的序列化结构化数据的方式。简单来说,它将数据转换为二进制格式并通过网络传输。与 XML、JSON 相比,它更轻量级。

gRPC 如何工作?

gRPC 客户端向服务器发送请求,gRPC 服务器返回响应。最重要的是,gRPC 发送和接收请求的方式使其更加特殊

gRPC 支持双向流,这是其他任何通信方式都不支持的。双向流是指发送数据流和接收数据流。发送请求/响应有多种方式。

  • 一元 RPC - 这是一种发送单个请求并接收响应的方式
  • 服务器流 RPC:它是从服务器端发送数据流的过程。
  • 客户端流式 RPC:它是从客户端发送数据流的过程。
  • 双向流 RPC:它是从客户端和服务器发送数据流的过程。

来源 :https://grpc.io/docs/guides/

在 Node.js 中实现 gRPC

让我们看看如何在 Node.js 中使用 gRPC,通过使用 CRUD APi 构建一个简单的待办事项应用程序

首先,我们需要安装应用程序的依赖项

npm install --save grpc
npm install --save uuid

之后,我们需要创建一个名为todo.proto的文件,它只是数据的协议缓冲区。

获取数据的 API

syntax = "proto3";


service TodoService {
    rpc List(Empty) returns (TodoList) {}
}

message Empty {}

message Todo {
    string id=1;
    string title = 2;
    bool iscompleted = 3;
}

message TodoList {
    repeated Todo todo = 1;
}

首先,.proto 文件就像我们定义的一种结构请求和响应数据的方式。

proto 缓冲区文件主要包含三部分:EntityRequest ObjectResponse Object

message Empty {} 

它是服务rpc中使用的请求对象

message TodoList {
    repeated Todo todo = 1;
}

TodoList是一个响应对象,它会作为响应发送给客户端。如果你注意到,有一个叫做repeated 的对象,它类似于数组。在这里,我们将其定义为待办事项数组。

现在,您需要创建一个名为server.js的文件,用于处理请求

const grpc = require('grpc');
const uuid = require('uuid/v1');
const todoproto = grpc.load('todo.proto')
const server = new grpc.Server()


server.bind('127.0.0.1:50051',
grpc.ServerCredentials.createInsecure())
console.log('server is running at http://127.0.0.1:50051')
server.start()

如果您在命令行中运行 server.js,它应该显示消息

服务器正在运行 http://127.0.0.1:50051

node server.js

现在,我们需要将服务添加到服务器文件。在server.js文件中添加以下代码

server.addService(todoproto.TodoService.service,{
    list : (_,callback) =>{
        callback(null,todos)
    }
})

之后,创建一个名为client.js的文件,它作为客户端向 gRPC 服务器发送请求。

const grpc = require('grpc');

const PROTO_PATH = './todo.proto'

const TodoService = grpc.load(PROTO_PATH).TodoService

const client = new TodoService('localhost:50051',
grpc.credentials.createInsecure())

module.exports = client

要从客户端进行调用,您需要在调用服务的实际文件中导入文件。创建一个名为get_todos.js的文件,使用客户端调用该服务。

const client = require('./client')

client.list({},(error,todos) => {
    if(!error){
        console.log('successfully fetched todo lists');
        console.log(todos);
    }
    else{
        console.error(error);
    }
});

要测试 List API,您需要运行调用该服务的服务器和客户端。

node server.js
node get_todos.js

创建插入 RPC 服务以创建新的 Todo

首先,您需要在todo.proto中添加插入服务

syntax = "proto3";


service TodoService {

    rpc List(Empty) returns (TodoList) {}
    rpc Insert(Todo) returns (Todo) {}
}

message Empty {}

message Todo {
    string id=1;
    string title = 2;
    bool iscompleted = 3;
}

message TodoList {
    repeated Todo todo = 1;
}

之后我们需要在server.js中添加插入服务

server.addService(todoproto.TodoService.service,{
    list : (_,callback) =>{
        callback(null,todos)
    },
     insert : (call,callback) => {
            let todo = call.request;
            todo.id = uuid()
            todos.push(todo)

            callback(null,todo)
        },
})

现在,您需要创建一个名为insert_todo.js的文件,它使用客户端调用插入服务。

const client = require('./client')

let newTodo = {
    title : 'New checklist',
    iscompleted : false
 }

 client.insert(newTodo,(error,todo) => {
     if(!error){
         console.log('New Todo inserted successfully');

     }
     else{
         console.error(error);
     }
 })

之后,我们可以使用命令行运行该文件。

node server.js
node insert_todo.js

类似地,我们可以定义更新和删除服务调用并从 gRPC 客户端使用它

完整的源代码可以在这里找到:https://github.com/ganeshmani/grpc-node

鏂囩珷鏉ユ簮锛�https://dev.to/ganeshmani/what-is-grpc-how-to-implement-grpc-in-node-js-33p5
PREV
我如何将我的 Spotify 统计数据添加到我的 GitHub readme 中📜
NEXT
理解 JavaScript 中的生成器 - JavaScript 周刊