很多同学在学习微服务、网络通信时,经常搞不清: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 必须配 gRPCJSON 必须配 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 是独立数据格式,可与任意传输层组合
  • 选型关键:性能、变更频率、调用方生态、调试成本
Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐