本节摘要:RESTful 成为 Web API 主流,靠的是可伸缩性、可演进性与低耦合三笔长期回报。但它不是万能解——严格 REST 要付出超媒体与内容协商的实现成本,追求实时推送、类型强约束或复杂图查询的场景,RPC、gRPC、GraphQL 反而更划算。本节给出选型时先看哪三个问题,再亮出对照取舍。
阅读完本节,你应当能够:
每种风格都靠三条确定性回报攒人气。REST 的三条,和它的约束体系一一对应:
顺手可提的是"生态红利":因为普及,几乎每种语言都有现成的 REST 客户端与服务端框架,人才好找,工具链全,踩过的坑多。这条看着软,工程落地时往往最快变成现实收益。它的底层逻辑不难懂——REST 是默认选项,所以脚手架、文档生成、监控告警、契约校验这些周边工具都默认先支持它,招来的工程师几乎不用额外培训就能上手维护。反过来想,一个刚成立的小团队真去上 gRPC 或 GraphQL,光是让全员统一熟悉 IDL、调通网关、配好查询解析,就要先交一大笔"学习税"。这笔税不是不能付,而是要在确定高频红利能覆盖它时才值得付。
任何契约都有它的隐形成本,REST 不例外。
把这三笔成本再看得细一点,要点是"不是每笔订单都付全款"。单次调用效率的损耗,对"一个页面一次拉回整张图书列表"这种读多写少的用法几乎无感,缓存一上还倒赚;但对"每毫秒都在互调的撮合轮询",文本解析的每一点开销都会被放大。所以判 REST 值不值,不能只看风格本身,要看它的损耗在你这套业务里占不占主导。可伸缩性在 CRUD 读多场景红利最大,实时推送场景红利最弱;可演进性在"要长期维护、接口会变"的场景才值钱,一次性脚本调用就无所谓。投入和回报对不上号,这才是 REST 看起来"不够快"的真正原因。
⚠️ 常见坑:为一个"内部几台服务之间高频互调"的场景硬上严格 REST,谈资源设计谈半天,最后发现吞吐差了、延迟高了。这时该承认:这是 RPC 的地盘。
把主要竞争对手拉上同一张表,取舍就清晰了:
| 选型 | 强项 | 相对弱势 | 典型场景 |
|---|---|---|---|
| REST | 简单、可演进、生态全、可缓存 | 单次效率一般、实时差 | 对外公开 API、跨团队契约 |
| 传统 RPC / gRPC | 单次调用快、二进制紧凑、强类型 | 契约紧绑、缓存难、可演进弱 | 内部服务间高频互调 |
| GraphQL | 客户端按需取字段、组合查询 | 缓存复杂、学习曲线陡、服务端解析压力 | 客户端字段需求多变的场景 |
具体展开三条:
💡 关键直觉:三者不是敌是邻。很多体系是"内部 gRPC 高速路 + 对外 REST 敞门厅"的组合,一句话:REST 管门面,gRPC 管里子。
与其背结论,不如把判断权握在自己手里,选型时依次问三句:
按这三问过一遍,大部分接口都能快速落位,REST 会把其中"对外、低频变化、可缓存、需演进"的一类接走——这正是它最该有的角色。
拿一家把图书零售搬到线上的书店举例,把三问走一遍。使用者是两类:面向外部购物 App 的公开接口,和内部订单撮合服务之间的几处高频调用。第一问就对上了:公开那批必然要 REST,因为要接的客户端千变万化、还得长期维护;内部那几处撮合调用,方法签名稳定、每秒几十次的轮询,就专给 gRPC。第二问:公开的图书详情是典型的读多写少,天然能吃满缓存红利;内部撮合是低延迟敏感,gRPC 二进制更省。第三问:购物 App 常要"书的详情+库存+作者其他作品"这种字段组合,早期曾想用 GraphQL 一把抓,后来评估查询权重不高,决定先用 REST 的嵌套资源,真顶不住再升级。最终落位:门面 REST,里子 gRPC,各守各的确定性回报。这条拆分路径,任何团队都能照着复用。
选好了方向,"载体"就该登场了。下一节我们把 HTTP 协议这套语法彻底过一遍,它是后续所有契约条款的落笔媒介。