彻底理清 HTTP、gRPC、Protobuf、JSON 四者关系(分层+组合+解耦)
·
很多同学在学习微服务、网络通信时,经常搞不清:HTTP、gRPC、Protobuf、JSON 到底是什么关系?谁依赖谁?能不能拆开用?本文用最清晰的分层结构 + 组合方式 + 解耦说明,一次性讲透。
核心结论先行:它们处在不同抽象层,但经常组合使用;彼此并非强绑定,可以灵活搭配。
一、清晰分层:四者不在同一层级
从架构分层角度,它们的定位完全不同:
| 层级 | 概念 | 说明 |
|---|---|---|
| 传输层协议 | HTTP(HTTP/1.1、HTTP/2) | 应用层协议,负责客户端与服务端如何传输数据。 |
| RPC 框架 | gRPC | 基于 HTTP/2 的远程调用框架,定义服务接口、调用方式、流式交互。 |
| 数据序列化格式 | Protobuf、JSON | 结构化数据编解码格式。Protobuf 二进制,JSON 文本。 |
二、典型组合:实际开发中最常用的搭配
1. gRPC + Protobuf + HTTP/2(标准组合)
- gRPC 默认使用 Protobuf 作为消息格式,基于 HTTP/2 传输
- 优点:高效、二进制、强契约、双向流、多路复用
- 适用:内部微服务通信、高性能调用
2. RESTful API + JSON + HTTP(最常见)
- HTTP/1.1 或 HTTP/2 传输,JSON 做数据载体
- 优点:简单、易调试、浏览器原生支持、生态极广
- 适用:对外接口、前后端分离、开放 API
3. 混合架构:gRPC-Gateway(内外兼顾)
- 同一套 .proto 同时生成两套接口
- 内部:gRPC + Protobuf(高性能)
- 外部:HTTP + JSON(易用兼容)
三、关键认知:它们完全可以解耦使用
很多人误区:Protobuf 必须配 gRPC、JSON 必须配 HTTP。完全错误!
1. Protobuf 不一定和 gRPC 绑定
- 可单独作为序列化格式
- HTTP 接口可以直接返回 Protobuf 二进制
- 消息队列(Kafka/RocketMQ)也常用 Protobuf 存储消息
2. gRPC 不强制使用 Protobuf
- gRPC 支持可插拔编解码器
- 理论上可以用 JSON、FlatBuffers 等
- 但工业界几乎 100% 使用 Protobuf
3. JSON 可脱离 HTTP 使用
- WebSocket 传输 JSON
- 消息队列存 JSON
- 本地文件/配置也用 JSON
四、一张图彻底看懂层级关系
┌─────────────────────────────────────────────────┐
│ 数据格式 │
│ ┌─────────────┐ ┌─────────────┐ │
│ │ Protobuf │ │ JSON │ │
│ │ (二进制,强类型) │ │ (文本,自描述) │ │
│ └─────────────┘ └─────────────┘ │
└─────────────────────────────────────────────────┘
│ │
│ 通常搭配 │ 通常搭配
▼ ▼
┌─────────────────┐ ┌─────────────────┐
│ gRPC 框架 │ │ RESTful 风格 │
│ (基于HTTP/2) │ │ (HTTP/1.1或2) │
└─────────────────┘ └─────────────────┘
│ │
└──────────┬──────────────┘
▼
┌───────────────┐
│ HTTP 协议 │
│ (传输层之上) │
└───────────────┘
五、面试/选型:一句话终极总结
- gRPC = HTTP/2 传输 + Protobuf 编码 + RPC 框架
- RESTful API = HTTP 传输 + JSON 编码 + 资源风格
- Protobuf 和 JSON 是独立数据格式,可与任意传输层组合
- 选型关键:性能、变更频率、调用方生态、调试成本
更多推荐




所有评论(0)