← 中文资源

简体中文版本

gRPC

gRPC 是基于 HTTP/2 与 Protocol Buffers 的高性能 RPC 框架,提供代码生成、流式调用、截止时间和类型化错误。

阅读英文原文

工作原理

服务在 .proto 文件中声明,编译器为目标语言生成客户端和服务端代码。调用方用类型化对象调用方法,而不必手写 URL、解析 JSON。gRPC 运行在 HTTP/2 上,提供多路复用流、流量控制和头部压缩。

service Orders {
  rpc GetOrder(GetOrderRequest) returns (Order);
  rpc WatchOrders(WatchRequest) returns (stream OrderEvent);
}

调用形态有四种:一元、服务端流、客户端流和双向流。截止时间从调用方传播到被调用方,失败使用 UNAVAILABLE、DEADLINE_EXCEEDED、INVALID_ARGUMENT 等状态码。

何时使用与取舍

gRPC 适合由不同团队维护、使用不同语言编写的后端服务调用,也适合大数据集、遥测或事件流的传输。当 schema registry 和代码生成已经治理契约时,它同样合适。面向浏览器的公开 API 通常更适合 REST 或 GraphQL,因为工具链、缓存和调试更简单。

二进制负载紧凑,但不易人工查看,grpcurl 和服务端反射可缓解。生成代码很方便,却让发布与 schema 变更耦合,因此需要兼容规则和注册中心。代理和负载均衡器必须理解 HTTP/2 trailer 与长连接。重试不会自动发生,而且必须尊重幂等性。

示例与误解

从 JSON 迁移的团队常以为 gRPC 能直接解决延迟问题。实际上,连接复用和截止时间纪律比编码方式贡献更大:每次请求新建连接的一元调用,可能比预热过的 REST 客户端更慢。相关概念:REST 与 RPC、连接池、超时预算。