REST/gRPC/队列通信模式对比

REST(Representational State Transfer)

原理与通信流程

REST 是一种基于 HTTP 协议的架构风格,强调资源(Resource)的表述和状态转移。它不是协议,而是一组设计约束。

核心特点:
  • 无状态(Stateless):每个请求必须包含所有必要信息,服务器不保存客户端上下文。
  • 统一接口(Uniform Interface):使用标准 HTTP 方法(GET、POST、PUT、DELETE 等)操作资源。
  • 资源导向 :每个资源由 URI 唯一标识(如 /users/123)。
  • 支持多种数据格式:通常使用 JSON 或 XML。
通信流程示例(客户端 → 服务端):
  1. 客户端构造 HTTP 请求(如 GET /api/users/123)。
  2. 请求通过网络发送到 REST 服务端(通常是 Web 服务器或 API 网关)。
  3. 服务端解析 URL 和方法,调用对应业务逻辑。
  4. 服务端返回 HTTP 响应(如 200 OK + JSON 数据)。
  5. 客户端处理响应。

典型技术栈:HTTP/1.1 或 HTTP/2 + JSON/XML + TLS(HTTPS)

使用场景

适合场景

  • Web 前后端分离架构(前端调用后端 API)
  • 移动 App 与后端服务通信
  • 第三方开放 API(如 GitHub API、微信支付接口)
  • 需要良好可读性、调试性和浏览器兼容性的场景

不适合场景

  • 高频、低延迟通信(如实时游戏、金融交易)
  • 大量二进制数据传输(效率较低)
  • 强类型契约要求高的微服务内部通信
  1. 发送 HTTP 请求 • 方法: GET/POST/PUT/DELETE • 协议: HTTP/1.1 或 HTTP/2 • 数据格式: JSON/XML • URL: /api/users/123 2. 处理业务逻辑 • 查询数据库 • 执行操作 是
  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/2Protocol Buffers(Protobuf)

核心特点:
  • 基于 Protobuf 定义服务接口:强类型、跨语言(.proto 文件生成客户端/服务端代码)
  • 使用 HTTP/2 作为传输层:支持多路复用、头部压缩、双向流
  • 支持四种通信模式
    • Unary(一元):普通请求-响应
    • Server Streaming:服务端流式响应
    • Client Streaming:客户端流式请求
    • Bidirectional Streaming:双向流
  • 二进制编码:比 JSON 更紧凑、解析更快
通信流程示例(Unary 调用):
  1. 定义 .proto 文件,声明服务和消息类型。
  2. 使用 protoc 编译器生成客户端和服务端 stub 代码。
  3. 客户端调用本地 stub 方法(如同调用本地函数)。
  4. gRPC 框架将参数序列化为 Protobuf 二进制,通过 HTTP/2 发送到服务端。
  5. 服务端反序列化请求,执行业务逻辑,返回响应。
  6. 客户端收到响应并反序列化为对象。

底层依赖:HTTP/2 + TLS(通常)+ Protobuf

使用场景

适合场景

  • 微服务内部通信(高吞吐、低延迟)
  • 跨语言服务调用(Go、Java、Python、C++ 等无缝集成)
  • 实时流式数据处理(如 IoT 设备上报、直播弹幕)
  • 对性能和带宽敏感的系统(如移动端弱网环境)

不适合场景

  • 需要浏览器直接调用(浏览器不原生支持 gRPC,需 gRPC-Web + 代理)
  • 需要人类可读的 API 文档(Protobuf 不直观)
  • 简单 CRUD 场景(开发成本高于 REST)

补充:可通过 gRPC-Gateway 将 gRPC 服务同时暴露为 RESTful API。

  1. 调用本地方法 • 自动生成代码 from .proto • 序列化为 Protobuf 二进制 2. 反序列化 Protobuf • 执行业务逻辑 • 支持四种模式: - Unary 一元 - Server Streaming - Client Streaming - Bidirectional Streaming Unary
  2. 返回 Protobuf 响应 • 通过 HTTP/2 多路复用 • 二进制高效传输 Streaming
    持续推送多条消息

通过同一 HTTP/2 连接
客户端(gRPC Stub)
gRPC 服务端

(gRPC Server)
响应类型?
服务端
服务端流式发送

消息队列(Message Queue, MQ)

原理与通信流程

消息队列是一种异步通信机制,通过中间件(Broker)解耦生产者和消费者。

核心特点:
  • 异步 & 解耦:生产者发送消息后无需等待消费者处理。
  • 持久化:消息可落盘,防止丢失。
  • 削峰填谷:缓冲突发流量,保护下游系统。
  • 可靠投递:支持 ACK、重试、死信队列等机制。
  • 一对多/广播:一个消息可被多个消费者消费(取决于模型)
常见模型:
  • 点对点(Queue):一条消息只被一个消费者消费(如订单处理)
  • 发布/订阅(Topic):一条消息被所有订阅者消费(如通知系统)
通信流程示例(生产者 → Broker → 消费者):
  1. 生产者将消息发送到 MQ(如 RabbitMQ、Kafka、RocketMQ)。
  2. MQ 存储消息(内存或磁盘),并根据路由规则分发。
  3. 消费者从 MQ 拉取(Pull)或 MQ 推送(Push)消息。
  4. 消费者处理消息,成功后发送 ACK 给 MQ。
  5. MQ 收到 ACK 后删除消息;若失败则重试或进入死信队列。

常见协议:AMQP(RabbitMQ)、自定义二进制协议(Kafka)、STOMP 等

使用场景

适合场景

  • 异步任务处理(如发送邮件、生成报表)
  • 系统解耦(订单服务 → 库存服务 → 物流服务)
  • 流量削峰(秒杀系统缓冲下单请求)
  • 日志收集与分析(Kafka 常用于日志管道)
  • 事件驱动架构(Event-Driven Architecture)

不适合场景

  • 需要同步响应的交互(如用户登录验证)
  • 强一致性事务(需配合分布式事务方案)
  • 简单点对点调用(引入 MQ 增加复杂度)
  1. 发送消息到 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 做异步处理
相关推荐
墨白曦煜16 小时前
Seata AT 模式:应用层回滚 vs 引擎层回滚
wpf
@淡 定2 天前
分布式事务解决方案
分布式·wpf
棉晗榜2 天前
WPF将程序集里面嵌入的资源文件下载到本机磁盘中,将项目中的文件下载到桌面
开发语言·wpf
△曉風殘月〆2 天前
WPF MVVM实战系列教程(一、Prism框架介绍)
wpf·mvvm·prism
Aevget2 天前
DevExpress WPF中文教程:Data Grid - 如何绑定到有限制的自定义服务(三)?
wpf·界面控件·devexpress·ui开发·.net 10
△曉風殘月〆2 天前
WPF MVVM实战系列教程(二、使用Visual Studio 创建Prism项目)
wpf·mvvm·prism
bugcome_com5 天前
WPF 核心布局控件全解析:从 Grid 到 UniformGrid 的实战应用
c#·wpf
观无5 天前
WPF-Datagrid控件的无缝滚动
wpf