gRPC 用于 JavaScript (Node.js):库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

gRPC 用于 JavaScript (Node.js):库与示例



gRPC 是一个由 Google 开发的高性能远程过程调用(RPC)框架。它使用 Protocol Buffers (protobuf) 进行数据序列化,并采用 HTTP/2 作为传输协议。在 Node.js 生态系统中,gRPC 支持双向流传输,可帮助您构建快速可靠的微服务。本文将介绍主要库、安装步骤,并编写一个可运行的服务器与客户端示例。



Node.js 中 gRPC 的主要库



在 Node.js 环境中使用 gRPC 需要以下几个关键包:



  • @grpc/grpc-js — 纯 JavaScript 实现的 gRPC。无需原生依赖(C++),安装更简便。推荐用于大多数现代项目。
  • @grpc/proto-loader — .proto 文件加载器。将 protobuf 定义转换为 JavaScript 对象,供 @grpc/grpc-js 使用。
  • protobufjs — 用于处理 protobuf 的替代库。支持静态和动态代码生成。
  • grpc-tools — 命令行工具,用于从 .proto 文件生成 JavaScript 代码(动态加载的替代方案)。


本教程将使用 @grpc/grpc-js 和 @grpc/proto-loader 组合——这是一种现代且稳定的方法。



安装依赖



创建一个新项目并安装所需包:



mkdir grpc-node-examplecd grpc-node-examplenpm init -ynpm install @grpc/grpc-js @grpc/proto-loader


通过 .proto 文件定义服务



创建 hello.proto 文件,描述服务与消息:



syntax = "proto3";

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

message HelloRequest { string name = 1;}

message HelloReply { string message = 1;}


这里我们定义了两个方法:简单的一元调用 SayHello 和服务器端流式调用 SayHelloStream。



在 Node.js 中实现 gRPC 服务器



创建 server.js 文件:



const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const PROTO_PATH = './hello.proto';

// 加载 proto 文件定义const packageDefinition = protoLoader.loadSync(PROTO_PATH, { keepCase: true, longs: String, enums: String, defaults: true, oneofs: true});

const helloProto = grpc.loadPackageDefinition(packageDefinition).helloworld;

// 实现服务方法function sayHello(call, callback) { const name = call.request.name; console.log(`收到请求: ${name}`); callback(null, { message: `你好, ${name}!` });}

function sayHelloStream(call) { const name = call.request.name; console.log(`正在为 ${name} 进行流式传输`);

// 发送多个响应 for (let i = 0; i < 5; i++) { call.write({ message: `你好 ${name} - 消息 ${i + 1}` }); } call.end();}

// 启动服务器function main() { const server = new grpc.Server(); server.addService(helloProto.Greeter.service, { sayHello: sayHello, sayHelloStream: sayHelloStream });

server.bindAsync('0.0.0.0:50051', grpc.ServerCredentials.createInsecure(), () => { console.log('gRPC 服务器运行在端口 50051'); server.start(); });}

main();


在 Node.js 中实现 gRPC 客户端



创建 client.js 文件:



const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const PROTO_PATH = './hello.proto';

const packageDefini

推荐