RESTful API 和 RPC 是分布式系统中两种主流的通信架构风格,它们在设计理念、实现方式和适用场景上存在显著差异。
核心区别解析
1. 抽象层面与操作语义
- RPC (Remote Procedure Call):抽象为远程方法调用。开发者定义接口,客户端调用这些接口就像调用本地函数一样(例如
client.getUser(123))。操作语义由自定义的方法名决定,适合表达复杂的动作或命令。 - RESTful API:抽象为对资源的操作。服务器暴露资源的 URI(如
/users/123),客户端通过标准的 HTTP 方法(GET, POST, PUT, DELETE)来操作资源。操作语义由 HTTP 方法和资源 URI 共同决定,强调无状态和统一接口。
2. 数据格式与性能
- RPC:通常使用二进制格式(如 Protocol Buffers, Thrift)进行序列化,报文体积更小,传输效率更高,天然支持强类型和代码生成,适合对性能要求极致的场景。
- RESTful API:通常使用文本格式(如 JSON, XML)进行序列化,基于 HTTP 协议,报文头相对较大,但在通用性和可读性上更具优势。随着 HTTP/2 的普及,两者在性能上的差距已显著缩小。
3. 适用场景与选型建议
- 选择 RPC 当:
- 需要极致性能和低延迟,常用于内部微服务之间的通信。
- 通信双方环境可控(使用相同语言或框架),需要强类型接口和代码生成带来的开发效率。
- 操作偏向复杂的业务逻辑或命令,而非简单的 CRUD。
- 选择 RESTful API 当:
- 构建公开 API或 Web 应用接口,需要最大程度的通用性和互操作性(任何语言、设备均可通过 HTTP 调用)。
- 需要利用 HTTP 基础设施特性,如缓存、代理、防火墙和监控。
- 资源模型清晰,操作主要是增删改查(CRUD)。
现代实践趋势
当前技术架构中,两者往往混合使用:内部微服务间采用高性能的 RPC 框架(如 gRPC,基于 HTTP/2 + Protobuf)进行通信,而对外公开的 API 则提供 RESTful 接口以兼容广泛的客户端。gRPC 的崛起使得 RPC 也能获得一定的 HTTP 生态兼容性,但 RESTful 因其简单性和通用性,仍是构建公开 Web API 的事实标准。
结合以上讨论的RESTful API和RPC的技术对比背景,提供以下技术选型决策清单,覆盖核心判断维度和落地参考:
一、先明确核心业务属性
- 通信双方位置:内部微服务之间调用 → 优先选RPC;对外公开给第三方/浏览器的接口 → 优先选RESTful API
- 性能要求阈值:单QPS过万、延迟要求低于10ms → 选RPC;常规业务接口延迟容忍度在100ms以上 → 选RESTful API
- 团队技术栈:团队熟悉Protobuf/IDL定义、有RPC框架运维经验 → 选RPC;团队以Web开发为主、熟悉HTTP协议 → 选RESTful API
二、分场景直接选型参考
表格
| 业务场景 | 推荐技术 | 核心收益 |
|---|---|---|
| 电商内部订单/库存微服务交互 | gRPC/Dubbo | 高性能低延迟,强契约避免参数错误 |
| 移动端APP后端对外接口 | RESTful API | 通用兼容,天然支持HTTP缓存降低服务器压力 |
| 物联网设备上报数据接口 | RESTful API | 设备无需额外SDK,直接通过HTTP即可上报 |
| 复杂业务系统内部多模块调用 | RPC | 支持自定义方法,适配复杂业务动作无需强行抽象资源 |
| 开放平台对外API | RESTful API | 任何语言的客户端都可直接调用,接入门槛极低 |
三、混合架构落地建议
绝大多数中大型项目都可以采用“内外分层”的混合方案:
- 内部微服务集群之间统一使用RPC通信,保障内部调用的性能和开发效率
- 最外层网关统一对外暴露RESTful API,做协议转换,兼顾外部客户端的通用性需求
- 仅对性能要求极高的核心链路(如支付扣减),可对外也提供RPC专属接入通道,仅开放给核心合作方使用
下面是一份直接落地的RESTful API和RPC接口设计规范模板,覆盖核心设计要点,可直接适配团队开发场景。
接口设计规范模板
接口设计规范模板
一、RESTful API设计规范
- 基础路径规范
- 接口统一以
/api或/v[版本号]/api作为入口,全产品仅保留一个API入口 - 路径命名使用连字符分隔小写单词,如
/api/task-groups,禁止使用驼峰命名 - 路径中仅使用资源复数名词,动作由HTTP方法承载,如
GET /api/users,禁止出现/get-users这类带动词的路径
- HTTP方法与状态码约定
| HTTP方法 | 对应操作 | 示例路径 | 标准状态码 |
| --- | --- | --- | --- |
| GET | 获取资源 |/api/users//api/users/1001| 200(成功)、404(资源不存在) |
| POST | 创建资源 |/api/users| 201(同步创建成功)、202(异步任务已接收) |
| PUT | 全量更新资源 |/api/users/1001| 200(更新成功)、400(参数错误) |
| PATCH | 差量更新资源 |/api/users/1001| 200(更新成功)、403(操作无权限) |
| DELETE | 删除资源 |/api/users/1001| 204(删除成功)、500(服务器内部错误) | - 响应体统一结构
- 不分页数据:
{code:20000,status:200,message:"请求成功",data:{...}} - 分页数据:
{code:20000,status:200,message:"请求成功",data:{items:[...],total:100}} - 无状态设计:所有请求自带完整依赖信息,服务端不存储会话状态,保障弹性扩容能力
二、RPC设计规范
- IDL定义规范
- 统一使用Protobuf作为接口定义语言,包名按业务模块划分,如
package com.company.user.service - 服务名以
Service结尾,方法名采用大驼峰命名,如UserService/GetUserInfo - 消息字段使用小写下划线命名,每个字段分配唯一不重复的序号,预留扩展字段位
- 传输与异常约定
- 序列化统一使用Protobuf二进制格式,基于HTTP/2协议传输,保障高性能低延迟
- 响应统一携带业务状态码,0代表调用成功,非0值对应具体业务错误,附带错误描述信息
- 接口版本号通过服务名后缀区分,如
UserServiceV2,避免新旧版本接口互相影响
- 开发约束规则
- 禁止在接口方法名中使用通用泛化词汇,必须精准表达业务动作,如
CreateUser而非OperateData - 单个接口请求体大小控制在2MB以内,超出阈值的大文件传输单独走文件服务接口
- 所有RPC接口必须配置超时时间和重试策略,幂等接口可配置最多3次重试,非幂等接口禁止重试
三、通用配套规范
- 两类接口都必须配套生成完整文档,使用Swagger/Postman等工具统一维护
- 敏感参数(如密码、密钥)禁止明文传输,统一通过HTTPS/TLS加密通道传递
- 两类接口都需配套统一的监控埋点,采集调用耗时、成功率、异常数等核心指标

842

被折叠的 条评论
为什么被折叠?



