gRPC在JavaScript中的应用:何时使用以及它如何加速您的项目

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

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

开始课程

为什么REST已经力不从心,而gRPC登上了舞台?



想象一下:您正在编写一个Node.js微服务,它每秒与十几个其他服务交换数据。REST API速度缓慢,JSON序列化消耗CPU,而用于复杂RPC调用的WebSocket则变成了一个糟糕的拼凑方案。听起来熟悉吗?



认识一下——JavaScript中的gRPC。这不仅仅是一个时髦的缩写,而是Google为其内部需求创建并随后开源的真正工具。今天我们将分析何时在JS项目中使用gRPC,以及何时最好坚持使用传统的REST。剧透:gRPC不是银弹,但在正确的人手中,它能创造奇迹。



用简单的话来说,什么是gRPC



gRPC是一个远程过程调用(RPC)框架。您在.proto文件中定义服务及其方法,然后生成任何支持语言(包括JavaScript)的客户端和服务器代码。其基础是Protocol Buffers(protobuf)——一种二进制序列化格式,其速度比JSON快数倍。



gRPC的关键特性:

  • 二进制协议——数据以紧凑的二进制格式传输,而非文本JSON
  • HTTP/2——多路复用、头部压缩、服务器推送
  • 强类型——服务契约在proto文件中定义,不存在“某个字段可能来也可能不来”的情况
  • 四种工作模式:一元(请求-响应)、服务器流式、客户端流式、双向流式


何时在JavaScript中使用gRPC:5个铁定场景



1. 高负载微服务架构

如果您的Node.js微服务之间每秒通信数百次,与REST相比,gRPC可提供5到10倍的性能提升。由于二进制协议,有效负载大小减小,而HTTP/2允许不必为每个请求打开新连接。



// proto/order.protosyntax = "proto3";

service OrderService { rpc CreateOrder (OrderRequest) returns (OrderResponse); rpc ListOrders (ListRequest) returns (stream OrderResponse);}

message OrderRequest { string user_id = 1; repeated string item_ids = 2;}

message OrderResponse { string order_id = 1; string status = 2; double total = 3;}

message ListRequest { string user_id = 1; int32 limit = 2;}


2. 实时数据流

您需要实时传输股票报价、服务器日志或聊天更新吗?带轮询的REST已经过时了。gRPC中的双向流允许客户端和服务器通过单个连接同时双向交换消息。



// Node.js客户端:订阅报价流const grpc = require('@grpc/grpc-js');const protoLoader = require('@grpc/proto-loader');

const packageDef = protoLoader.loadSync('proto/stock.proto');const stockProto = grpc.loadPackageDefinition(packageDef).stock;

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

// 请求流const call = client.SubscribePrices({ symbol: 'AAPL' });

call.on('data', (priceUpdate) => { console.log(`新价格 ${priceUpdate.symbol}: $${priceUpdate.price}`);});

call.on('end', () => { console.log('流已结束');});


3. 流量受限的移动应用

每个千字节都很宝贵,而REST API的JSON响应却臃肿不堪。与JSON相比,Protobuf可将数据压缩30-70%。这对于使用React Native或Flutter的移动客户端至关重要,其中gRPC-web被用作代理。



4. 多语言架构

您的后端是Go,ML服务是Python,而前端是JavaScript(通过gRPC-web)?gRPC生成客户

博客

书籍推荐