很多团队在微服务里用 gRPC 已经有一段时间了,但真落到生产环境,还是会有几个地方让人心里不太踏实。浏览器怎么调?线上出了问题怎么快速看一眼请求内容?是不是非得在前面挂一层 Envoy 才能把 gRPC-Web 跑起来?这些问题不算致命,但叠加在一起,就足以让一个团队开始认真考虑:有没有一种更“现代”的方式,既能保留 gRPC 的契约与性能优势,又能避开这些工程上的坑。Connect-RPC 就是在这种背景下被越来越多提及的方案。

gRPC 的痛,不是协议本身,而是工程落地
平心而论,gRPC 的二进制协议和 HTTP/2 多路复用设计在性能上并没有太大问题,真正的麻烦出在工程链路上。第一个绕不开的就是浏览器调用。浏览器对 HTTP/2 的实现并不完整,无法直接发起 gRPC 请求,于是有了 gRPC-Web,但它需要一个中间代理把 gRPC-Web 的请求转成标准 gRPC 调用。这相当于在原本已经很精细的通信链路上又加了一个组件,多了一层要维护、要监控、要排查的东西。
第二个痛点是调试。gRPC 的 protobuf 序列化结果是二进制 payload,想用 curl 或者浏览器开发者工具看一眼请求内容几乎不可能,必须借助 grpcurl 或者专门的 GUI 工具,而且还得服务端开启反射。线上排障时,这种“看不见”的感觉非常消耗耐心。
第三个是生态割裂。虽然 gRPC 的跨语言支持已经很成熟,但某些语言或框架(比如边缘计算环境、serverless 平台)对 HTTP/2 的支持并不友好,强行接入 gRPC 客户端库反而会引入额外的依赖和兼容性问题。这些场景下,团队往往会退回到 REST + JSON 的临时方案,导致协议层出现分裂。
Connect-RPC 到底改了什么
Connect-RPC 由 Buf 团队推出,本质上是一套轻量的 RPC 协议和实现,它同时兼容三种协议:自带的 Connect 协议、标准 gRPC 协议以及 gRPC-Web。最大的变化在于它把传输层从“仅 HTTP/2”放宽到了“HTTP/1.1 和 HTTP/2”,并且把请求/响应体默认设计为 JSON 或二进制 protobuf 均可。这意味着,一个服务启用 Connect-RPC 后,既可以用 gRPC 客户端继续调用,也可以直接用浏览器 fetch 或 curl 发起请求,不需要任何中间代理。
这种设计解开了两个关键锁:一是浏览器直连,二是标准 HTTP 工具可用。对于前端工程师来说,调用一个 RPC 接口和调用一个 REST 接口在代码层面没有本质区别,只是 URL 路径和请求体遵循了 protobuf 定义的约定。对于运维和排障,应用层可以直接用 HTTP 抓包工具看到明文 JSON 数据,调试成本大幅下降。
一张表看清 gRPC 与 Connect-RPC 的协议差异
下面这张表把几个关键维度的差异放在一起,更容易看出 Connect-RPC 到底在哪些地方做了取舍和增强。
| 特性 | gRPC | Connect-RPC |
|---|---|---|
| 传输协议 | 仅 HTTP/2 | HTTP/1.1 与 HTTP/2 |
| 浏览器支持 | 需 gRPC-Web + 代理 | 原生支持,无需代理 |
| 请求/响应格式 | 二进制 protobuf | JSON 或二进制 protobuf |
| 调试工具 | grpcurl 等专用工具 | curl、浏览器开发者工具 |
| 流式处理 | 双向流严格依赖 HTTP/2 | 支持流式,浏览器端可用 |
| 兼容性 | 仅 gRPC 协议 | 同时兼容 gRPC、gRPC-Web、Connect 协议 |
| 客户端代码生成 | 较大,依赖较重 | 更轻量,可选生成 |
从表里能看出来,Connect-RPC 并没有在性能上“碾压” gRPC,而是把工程适配性提升了一大截。对于大部分业务场景,这种提升带来的收益远比多协议兼容带来的微小开销更值得关注。
一个 curl 请求,就足够说明问题
最能体现 Connect-RPC 设计哲学的是,你可以直接用 curl 调用一个 protobuf 定义的服务,而不需要任何额外的代码生成或客户端依赖。假设我们有一个简单的 ElizaService,定义在 proto 文件中,方法 Say 接收一个 sentence 字符串,返回一个 sentence 字符串。用 Connect-RPC 部署后,调用方式如下:
curl --header "Content-Type: application/json" \
--data '{"sentence": "Hello"}' \
http://localhost:8080/connectrpc.eliza.v1.ElizaService/Say
服务器返回的也是 JSON 格式的响应,与普通 REST 接口几乎没有区别。这背后是 Connect 协议定义的简单映射规则:URL 路径由服务全名和方法名组成,请求体和响应体使用 JSON 序列化。如果你需要更高的性能,只需将 Content-Type 换成 application/proto,就可以发送二进制 protobuf。
这种灵活性改变了团队协作的方式。后端仍然可以用 protobuf 做严格的契约定义,前端却不需要关心如何生成 gRPC 客户端,甚至不需要引入任何额外的库。在项目早期或快速迭代期,这种低摩擦的调用方式能让整个团队保持很高的进度。
流式支持:不再绑定在 HTTP/2 上
gRPC 的流式调用非常依赖 HTTP/2 的帧机制,这也是为什么浏览器端一直无法原生支持流式 gRPC 的根本原因。Connect-RPC 对流式支持做了重新设计:服务端流、客户端流以及双向流都可以在 HTTP/1.1 上通过分块传输编码(chunked transfer encoding)实现,在 HTTP/2 上则使用原生流帧。这意味着,即使是浏览器发起的流式请求,也可以通过标准 fetch API 的 ReadableStream 来处理,不需要 WebSocket 或任何第三方库。
实际场景中,一个典型的应用是 AI 接口的流式输出。前端发起一个请求,服务端持续返回生成结果,浏览器端可以逐块读取并渲染。如果换成 gRPC 方案,要么在服务端前面加一层 WebSocket 网关,要么用 gRPC-Web 的有限流式支持,复杂度明显更高。Connect-RPC 把流式处理变得和 REST 流式接口一样自然,但又不丢失契约检查。
几个常见的理解误区
在讨论 Connect-RPC 时,有几个容易走偏的地方值得提一下。
- 误区一:Connect-RPC 完全抛弃了 gRPC。 实际上它兼容 gRPC 协议,已有的 gRPC 客户端可以零改动连接到 Connect-RPC 服务端,反之亦然。它是一种渐进式迁移方案,而不是重写一切。
- 误区二:Connect-RPC 只适合浏览器场景。 虽然它解决了浏览器调用的问题,但它在服务端之间的通信同样有效,特别是当你希望减少依赖或统一使用 HTTP/1.1 基础设施时。
- 误区三:Connect-RPC 性能不如 gRPC。 在纯二进制通信下,性能差异很小,JSON 编码确实会引入一些开销,但这个开销在绝大多数业务场景下并不显著,而工程便利性的提升远超这点代价。
还有一点值得注意,Connect-RPC 的生态由 Buf 驱动,Buf 本身就是 protobuf 工具链的重要玩家,这意味着它的代码生成、lint 和 breaking change 检测等周边工具与 Connect-RPC 集成度很高,不会出现“用了新协议,丢了旧工具链”的尴尬。
什么样的团队适合考虑 Connect-RPC
并不是所有团队都需要立刻切换到 Connect-RPC。如果你的系统已经深度绑定了 gRPC 生态,并且没有浏览器调用、调试困难或 HTTP/1.1 兼容的需求,那么维持现状是完全合理的。但如果你符合以下特征中的几条,Connect-RPC 就值得认真评估:
- 前端需要直接调用后端 RPC 服务,且不想引入额外的代理层。
- 团队希望用 curl 或标准 HTTP 工具快速调试接口,减少排障时间。
- 系统运行在部分需要 HTTP/1.1 的环境中,比如某些 serverless 平台或边缘网络。
- 你想逐步引入流式 RPC,但不想被 HTTP/2 的绑定限制。
- 你对 protobuf 契约有强烈需求,但希望客户端生成更轻量、更可定制。
在一个中型 SaaS 团队的实际迭代中,我曾经见过这样的演变:后端服务全部使用 gRPC,前端为了调用不得不引入 gRPC-Web 和 Envoy,后来又因为调试困难在网关层加了一层 REST 转换,整个链路变得冗长且脆弱。切换到 Connect-RPC 后,前端直接用 fetch 调用,后端保持 protobuf 契约不变,同时去掉了 Envoy 代理的依赖,运维负担明显降低。这种改变并不需要推翻重来,只是把通信协议层做了替换,风险可控。
到底要不要把 gRPC 替掉
Connect-RPC 并不是要“杀死” gRPC,它更适合被看作 gRPC 在工程化上的补完。你仍然可以用 protobuf 做 IDL,仍然有严格的契约和代码生成,仍然有高性能的二进制通信,但多了一条更轻量的路径,让浏览器、移动端和那些对 HTTP/2 不友好的环境也能顺畅接入。
对于新项目,如果从一开始就预期会有前端直连或多协议共存的场景,用 Connect-RPC 作为默认 RPC 层可以省去后期很多适配工作。对于老项目,可以先从某些跨域调用或者浏览器接口开始引入 Connect-RPC,逐步替换掉 gRPC-Web 代理那部分,体验一下它的实际效果。无论如何,选择的关键不是“哪个技术更先进”,而是“哪个技术能让团队的沟通和排查成本更低”。Connect-RPC 正是在这一点上,给出了一个比 gRPC 更贴合现代工程实践的答案。
原创文章,作者:fudengji,如若转载,请注明出处:https://fudengji.cn/article/393/