category
Technology
Tags
RPC
Collection
CreateTime
Jul 20, 2023 04:37 AM
UpdateTime
Jan 2, 2025 03:44 AM
Published
Published
资料介绍RPCgRPCProtocol Buffers四种API对比推荐场景实现gRPC-web protobuf-tsConnect-Web错误单元测试工具grpcurlgrpcui常见问题为什么在Web客户端、服务端很少见gRPC的使用ERROR [ExceptionsHandler] 1 CANCELLED: Call cancelledVite use grpc-web Errorpostman( ServerReflection API )macos install protoc-gen-grpc-webNestJS 需要创建微服务才可以访问 createMicroservice服务器反射
介绍
RPC
本地过程调用是进程内执行某些代码的函数调用,远程过程调用使一台机器能够调用另一台机器上的某些代码。
gRPC
是谷歌2016年创建的开源远程过程调用框架,是对RPC基础设施的重写。
Protocol Buffers
Protocol Buffers 是一种语言中立、平台中立、可扩展的序列化结构化数据的方式,用于通信协议、数据存储等,最初由 Google 设计。
四种API
- Unary RPC 一元(无流)
- Server Streaming RPC 服务器到客户端流式传输
- Client Streaming 客户端到服务器流式传输
- Bi-directional Streaming 双向流传输

对比
优点
- 支持强类型模式定义(有点类似Typescript),更严格的规范、proto文件可以从端到端生成消息和客户端代码。
- 高性能,比JSON快5倍
- Protocol Buffers 是一种非常高效的二进制编码格式,体积更小
- gRPC构建在 HTTP/2之上,可以提供大规模的高性能基础
- 安全性,二进制编码格式不可读
- gRPC Streaming:gRPC 本身支持长期实时连接,通常称为
streams. 流对于聊天、观察或块数据传输等情况很有用
- 跨平台和跨语言:gRPC支持多种编程语言和平台
- gRPC 允许客户端指定他们愿意等待 RPC 完成的时间。截止时间被发送到服务器,服务器可以决定如果超过截止时间要采取什么操作。例如,服务器可能会在超时时取消正在进行的 gRPC/HTTP/数据库请求。
缺点
- 传输的数据的结构需要在 proto 文件中定义,需要维护 .proto 或 .json 描述符文件,每次参数的变更都需要维护此文件(gRPC提供了代码自动生成工具,可以自动生成客户端和服务端的代码,省去了手动编写代码的过程)
- 浏览器支持有限,需要使用gtRPC-web/protobuf-ts,Envoy、Nginx代理(具体参考下面实现部分)
- 不可读的,内置的JSON转换可以提供方法,可以在调试时设置。
- gRPC 使用每个消息的大小限制来管理传入和传出消息。 默认情况下,gRPC 将传入消息限制为
4 MB
- 用例少
推荐场景
- 微服务:gRPC 专为低延迟和高吞吐量通信而设计。gRPC 非常适合效率至关重要的轻量级微服务。
- 点对点实时通信:gRPC 对双向流具有出色的支持。gRPC 服务可以实时推送消息,无需轮询。
- 多语言环境:gRPC 工具支持所有流行的开发语言,使 gRPC 成为多语言环境的不错选择。
- 网络受限环境:gRPC 消息使用 Protobuf(一种轻量级消息格式)进行序列化。gRPC 消息始终小于等效的 JSON 消息。
- 进程间通信 (IPC)使用 gRPC 进行进程间通信:IPC 传输(例如 Unix 域套接字和命名管道)可与 gRPC 一起使用,以便在同一计算机上的应用程序之间进行通信
在以下场景中,建议使用其他框架而不是 gRPC:
- 浏览器可访问的 API:浏览器不完全支持 gRPC。gRPC-Web 可以提供浏览器支持,但它有局限性并引入了服务器代理。
- 广播实时通信SignalR:gRPC 支持通过流式传输进行实时通信,但不存在将消息广播到注册连接的概念。例如,在聊天室场景中,新的聊天消息应发送到聊天室中的所有客户端,每个 gRPC 调用都需要单独将新的聊天消息流式传输到客户端。
对于这种情况来说是一个有用的框架。SignalR 具有持久连接的概念和对广播消息的内置支持。
实现
gRPC-web
实现踩坑很多坑,最后在Vite下无法获取参数,找到protobuf-ts解决方法
gRPC 在前端運作最大的問題,就是前端對於 gRPC 所使用的 protocol 不是那麼完好的支援,現在主流瀏覽器使用
HTTP1.1,而 gRPC 使用的是更加高效的HTTP2。Google 提供的解決方案是利用一個 proxy 架設在後端,將前端所有的 HTTP1.1 流量轉換成 HTTP2。
brew install protobuf brew install protoc-gen-grpc-web
protoc -I protos \ --js_out=import_style=commonjs:grpc-client/src/protos \ --grpc-web_out=import_style=commonjs+dts,mode=grpcweb:grpc-client/src/protos \ hero.proto
Uncaught ReferenceError: exports is not defined
grpc-web not working in a Vite+Typescript app
GRPC-Vite-TS-Svelte
Aymeric-Henry • Updated Jan 8, 2025
protobuf-ts
pn exec protoc --ts_out grpc-client/src/protos --proto_path protos protos/hero.proto
Connect-Web
错误
Connect 是一系列用于构建浏览器和与 gRPC 兼容的 HTTP API 的库:您编写一个简短的Protocol Buffer架构并实现您的应用程序逻辑,Connect 生成代码来处理编组、路由、压缩和内容类型协商。它还以任何受支持的语言生成惯用的、类型安全的客户端
- Connect 服务器和客户端支持三种协议:gRPC、gRPC-Web 和 Connect 自己的协议。
- Connect 是我们对生产级 RPC 的愿景。它简单、可靠且不引人注目
单元测试
工具
grpcurl
grpcurl
fullstorydev • Updated Mar 10, 2026
grpcurl localhost:3001 describe
grpcui
grpcui
fullstorydev • Updated Mar 10, 2026
grpcui -plaintext localhost:3001
常见问题
为什么在Web客户端、服务端很少见gRPC的使用
gRPC 依赖与对HTTP/2 较低级别的访问,目前没有浏览器提供支持gRPC客户端所需的网络请求控制级别。可以在代理的帮助下从浏览器进行gRPC的调用,称为gPRC-web,但是此功能与gRPC不完全兼容。
ERROR [ExceptionsHandler] 1 CANCELLED: Call cancelled
Cancelling a client stream throws CANCELLED: Cancelled on client
Vite use grpc-web Error
postman( ServerReflection API )


macos install protoc-gen-grpc-web
protoc-gen-js: program not found or is not executable Please specify a program using absolute path or make sure the program is available in your PATH system variable --js_out: protoc-gen-js: Plugin failed with status code 1.
brew install protobuf@3 brew link --overwrite protobuf@3
NestJS 需要创建微服务才可以访问 createMicroservice
使用nestjs搭建grpc服务,只能createMicroservice,postman才能访问。可以创建client+rpc service,但是只能从http访问,grpc访问则不成功。
服务器反射
Support reflection



