REST(Representational State Transfer)
原理与通信流程
REST 是一种基于 HTTP 协议的架构风格,强调资源(Resource)的表述和状态转移。它不是协议,而是一组设计约束。
核心特点:
- 无状态(Stateless):每个请求必须包含所有必要信息,服务器不保存客户端上下文。
- 统一接口(Uniform Interface):使用标准 HTTP 方法(GET、POST、PUT、DELETE 等)操作资源。
- 资源导向 :每个资源由 URI 唯一标识(如
/users/123)。 - 支持多种数据格式:通常使用 JSON 或 XML。
通信流程示例(客户端 → 服务端):
- 客户端构造 HTTP 请求(如
GET /api/users/123)。 - 请求通过网络发送到 REST 服务端(通常是 Web 服务器或 API 网关)。
- 服务端解析 URL 和方法,调用对应业务逻辑。
- 服务端返回 HTTP 响应(如
200 OK+ JSON 数据)。 - 客户端处理响应。
典型技术栈:HTTP/1.1 或 HTTP/2 + JSON/XML + TLS(HTTPS)
使用场景
✅ 适合场景:
- Web 前后端分离架构(前端调用后端 API)
- 移动 App 与后端服务通信
- 第三方开放 API(如 GitHub API、微信支付接口)
- 需要良好可读性、调试性和浏览器兼容性的场景
❌ 不适合场景:
- 高频、低延迟通信(如实时游戏、金融交易)
- 大量二进制数据传输(效率较低)
- 强类型契约要求高的微服务内部通信
- 发送 HTTP 请求 • 方法: GET/POST/PUT/DELETE • 协议: HTTP/1.1 或 HTTP/2 • 数据格式: JSON/XML • URL: /api/users/123 2. 处理业务逻辑 • 查询数据库 • 执行操作 是
- 返回 HTTP 响应 • 状态码: 200 OK / 404 / 500 • Body: JSON 数据 • 可选: Headers (Content-Type, Auth) 否
4xx / 5xx 错误
客户端(Web / Mobile / Browser)
REST 服务端\n(API Server)
处理完成?
服务端
返回错误响应
gRPC(Google Remote Procedure Call)
原理与通信流程
gRPC 是 Google 开源的高性能 RPC 框架,基于 HTTP/2 和 Protocol Buffers(Protobuf)。
核心特点:
- 基于 Protobuf 定义服务接口:强类型、跨语言(.proto 文件生成客户端/服务端代码)
- 使用 HTTP/2 作为传输层:支持多路复用、头部压缩、双向流
- 支持四种通信模式 :
- Unary(一元):普通请求-响应
- Server Streaming:服务端流式响应
- Client Streaming:客户端流式请求
- Bidirectional Streaming:双向流
- 二进制编码:比 JSON 更紧凑、解析更快
通信流程示例(Unary 调用):
- 定义
.proto文件,声明服务和消息类型。 - 使用 protoc 编译器生成客户端和服务端 stub 代码。
- 客户端调用本地 stub 方法(如同调用本地函数)。
- gRPC 框架将参数序列化为 Protobuf 二进制,通过 HTTP/2 发送到服务端。
- 服务端反序列化请求,执行业务逻辑,返回响应。
- 客户端收到响应并反序列化为对象。
底层依赖:HTTP/2 + TLS(通常)+ Protobuf
使用场景
✅ 适合场景:
- 微服务内部通信(高吞吐、低延迟)
- 跨语言服务调用(Go、Java、Python、C++ 等无缝集成)
- 实时流式数据处理(如 IoT 设备上报、直播弹幕)
- 对性能和带宽敏感的系统(如移动端弱网环境)
❌ 不适合场景:
- 需要浏览器直接调用(浏览器不原生支持 gRPC,需 gRPC-Web + 代理)
- 需要人类可读的 API 文档(Protobuf 不直观)
- 简单 CRUD 场景(开发成本高于 REST)
补充:可通过 gRPC-Gateway 将 gRPC 服务同时暴露为 RESTful API。
- 调用本地方法 • 自动生成代码 from .proto • 序列化为 Protobuf 二进制 2. 反序列化 Protobuf • 执行业务逻辑 • 支持四种模式: - Unary 一元 - Server Streaming - Client Streaming - Bidirectional Streaming Unary
- 返回 Protobuf 响应 • 通过 HTTP/2 多路复用 • 二进制高效传输 Streaming
持续推送多条消息
通过同一 HTTP/2 连接
客户端(gRPC Stub)
gRPC 服务端
(gRPC Server)
响应类型?
服务端
服务端流式发送
消息队列(Message Queue, MQ)
原理与通信流程
消息队列是一种异步通信机制,通过中间件(Broker)解耦生产者和消费者。
核心特点:
- 异步 & 解耦:生产者发送消息后无需等待消费者处理。
- 持久化:消息可落盘,防止丢失。
- 削峰填谷:缓冲突发流量,保护下游系统。
- 可靠投递:支持 ACK、重试、死信队列等机制。
- 一对多/广播:一个消息可被多个消费者消费(取决于模型)
常见模型:
- 点对点(Queue):一条消息只被一个消费者消费(如订单处理)
- 发布/订阅(Topic):一条消息被所有订阅者消费(如通知系统)
通信流程示例(生产者 → Broker → 消费者):
- 生产者将消息发送到 MQ(如 RabbitMQ、Kafka、RocketMQ)。
- MQ 存储消息(内存或磁盘),并根据路由规则分发。
- 消费者从 MQ 拉取(Pull)或 MQ 推送(Push)消息。
- 消费者处理消息,成功后发送 ACK 给 MQ。
- MQ 收到 ACK 后删除消息;若失败则重试或进入死信队列。
常见协议:AMQP(RabbitMQ)、自定义二进制协议(Kafka)、STOMP 等
使用场景
✅ 适合场景:
- 异步任务处理(如发送邮件、生成报表)
- 系统解耦(订单服务 → 库存服务 → 物流服务)
- 流量削峰(秒杀系统缓冲下单请求)
- 日志收集与分析(Kafka 常用于日志管道)
- 事件驱动架构(Event-Driven Architecture)
❌ 不适合场景:
- 需要同步响应的交互(如用户登录验证)
- 强一致性事务(需配合分布式事务方案)
- 简单点对点调用(引入 MQ 增加复杂度)
- 发送消息到 Broker • 协议: AMQP / Kafka 协议 • 数据格式: JSON / Protobuf / 自定义 • 目标: Queue 或 Topic 2. 持久化存储 • 内存 + 磁盘 • 支持 ACK / 重试 / 死信队列 3. 拉取(Pull) 或 推送(Push) 消息 同一条消息可被多个订阅者消费
(Pub/Sub 模式)
4. 处理成功 → 发送 ACK 处理失败 → 重试 或 进入死信队列
生产者(Producer)
消息中间件(Broker: RabbitMQ / Kafka / RocketMQ)
消费者组(Consumer Group)
消费者 A
消费者 B
对比总结
| 特性 | REST | gRPC | 消息队列(MQ) |
|---|---|---|---|
| 通信模式 | 同步请求-响应 | 同步或流式 | 异步 |
| 协议 | HTTP/1.1 或 HTTP/2 | HTTP/2 + Protobuf | AMQP、Kafka 协议等 |
| 数据格式 | JSON/XML(文本) | Protobuf(二进制) | 可自定义(JSON、Protobuf 等) |
| 性能 | 中等 | 高(低延迟、高压缩) | 高吞吐(尤其 Kafka) |
| 耦合度 | 紧耦合(需知道接口) | 中等(依赖 .proto) | 松耦合 |
| 实时性 | 实时 | 实时(支持流) | 延迟(毫秒~秒级) |
| 适用边界 | 外部 API、Web 前端 | 内部微服务、高性能场景 | 异步任务、事件驱动 |
| 浏览器支持 | 原生支持 | 需 gRPC-Web + 代理 | 通常不直接支持 |
如何选择?
- 对外提供 API? → 优先 REST(或 GraphQL)
- 微服务内部高性能通信? → 选 gRPC
- 需要异步、解耦、削峰? → 用消息队列
- 混合架构常见组合 :
- 前端 ↔ REST API Gateway ↔ gRPC 微服务集群
- 微服务间用 gRPC,关键事件发 MQ 做异步处理