1. 设计理念
RESTful API
基于 HTTP 协议,遵循资源导向的设计原则(URL 表示资源,HTTP 方法表示操作)
强调接口的统一、无状态和幂等性
通常使用 JSON/XML 作为数据交换格式
RPC 框架(如 gRPC、Dubbo)
基于远程过程调用思想,隐藏网络通信细节,使远程调用近似本地调用
强调服务间的强契约(通过 IDL 定义接口)
通常使用二进制协议(如 Protobuf、Thrift)
2. 通信协议
RESTful API
依赖 HTTP/1.1 或 HTTP/2 协议
支持多种传输格式(JSON、XML、HTML 等)
基于文本的协议,可读性强
RPC 框架
自定义高效协议(如 gRPC 的 HTTP/2+Protobuf)
通常使用二进制协议,序列化 / 反序列化效率高
支持流式传输和双向通信
3. 接口定义
RESTful API
接口定义相对灵活,缺乏强制的契约约束
通常通过文档(如 OpenAPI/Swagger)描述接口
版本兼容性管理较为复杂
RPC 框架
通过 IDL(Interface Definition Language)强制定义接口
代码生成工具自动生成客户端和服务端代码
版本兼容性通过 IDL 演进规则保证
4. 性能特性
维度RESTful APIRPC 框架序列化效率较低(JSON/XML 解析开销)较高(二进制协议 + Protobuf)网络开销较大(HTTP 头部冗余)较小(二进制协议 + 多路复用)长连接支持需手动实现(如 WebSocket 升级)原生支持(如 gRPC 的 HTTP/2 长连接)流式传输支持有限(如 chunked 编码)原生支持双向流式通信
各自的优缺点
RESTful API 的优缺点
优点:
广泛兼容性
基于标准 HTTP 协议,几乎所有编程语言和平台都支持
易于集成到现有系统(如 Web 应用、移动应用)
简单易用
学习曲线平缓,开发成本低
接口直观,符合人类认知习惯
良好的可发现性
通过 URL 和 HTTP 方法即可推断接口功能
支持 HATEOAS(超媒体驱动)架构
灵活的格式支持
支持多种数据格式(JSON、XML、HTML 等)
适合前后端分离的 Web 应用
缺点:
性能瓶颈
文本协议(JSON/XML)解析开销大
HTTP/1.1 的队头阻塞问题(HTTP/2 有所改善)
缺乏强类型约束
接口定义松散,容易导致集成问题
依赖文档维护,难以保证一致性
复杂场景支持不足
长连接、双向通信实现复杂
事务性操作支持较弱
RPC 框架(以 gRPC 为例)的优缺点
优点:
高性能
Protobuf 序列化效率远高于 JSON/XML
HTTP/2 协议支持多路复用和二进制分帧
强类型约束
通过.proto 文件严格定义接口
代码生成工具保证客户端和服务端一致性
丰富的特性支持
原生支持四种调用模式:单请求 / 响应、客户端流、服务端流、双向流
内置拦截器机制(如认证、日志、重试)
跨语言支持
支持多种语言(Java、Go、Python、C# 等)
生态成熟,工具链完善
缺点:
较高的学习曲线
需要理解 IDL、代码生成流程
调试相对复杂(二进制协议可读性差)
兼容性问题
客户端和服务端需严格遵循 IDL 定义
版本升级需遵循 Protobuf 演进规则
生态局限性
在 Web 前端场景中支持较弱(需额外适配)
依赖特定的服务发现和负载均衡机制
适用场景对比
场景RESTful APIRPC 框架(如 gRPC)对外公开 API首选(标准 HTTP 协议)不适用(需额外适配网关)微服务内部通信简单场景适用复杂场景首选(高性能、强契约)跨语言调用广泛支持需语言特定实现(但生态逐渐完善)实时数据传输需依赖 WebSocket 等扩展原生支持流式通信前后端分离的 Web 应用主流选择需额外适配(如通过 gRPC-Web)资源导向的操作天然契合需人为映射资源到方法
总结与选型建议
选择 RESTful API:
当需要构建面向外部的、跨组织的 API 时
当系统需要与大量异构系统集成时
当开发快速迭代的 Web 应用时
选择 RPC 框架(如 gRPC):
当构建高性能、低延迟的微服务架构时
当服务间通信频繁且数据量大时
当需要强类型约束和严格接口定义时
当使用同构语言栈(如 Java/Go 混合)时
实际项目中也可考虑混合使用两种模式,例如:对外提供 REST API 网关,内部服务间使用 RPC 通信。
发表评论
登录后才能发表评论
登录账号