protobuf 3和gRPC, google开发的在二进制和可读代码间快速映射的工具以及远程调用方式.
Protobuf 3 和 gRPC 是 Google 开发并开源的一对“黄金搭档”,它们共同构成了现代高性能微服务通信的基石。简单来说,Protobuf 3 负责高效地“打包”数据,而 gRPC 则负责快速地“运输”这些数据。
📦 什么是 Protobuf 3?
Protobuf 3(Protocol Buffers 3)是 Google 开发的一种轻量级、高效的结构化数据存储格式,可以把它理解成一种数据序列化工具。
它的核心工作流程是:
- 定义数据结构:你使用一种接口定义语言(IDL),在一个
.proto文本文件中定义你的数据结构(称为“消息”)。 - 生成代码:通过
protoc编译器,根据.proto文件自动生成多种编程语言(如 Go, Java, Python, C++ 等)的数据访问类。 - 序列化与反序列化:在你的代码中,使用生成的类来创建、填充数据对象,并将其序列化为紧凑的二进制格式进行传输或存储;接收方则能高效地将其反序列化回对象。
Protobuf 3 的核心优势
- 高性能:与 JSON 或 XML 等基于文本的格式相比,Protobuf 将数据序列化为二进制,因此消息体积更小(通常只有 JSON 的 1/3 到 1/2),解析和序列化速度也更快(可快 50% 以上)。
- 强类型与语言无关:通过
.proto文件定义一份明确的数据契约,可以生成各种语言的代码,确保了不同服务间数据交互的强类型安全和一致性。 - 易于演进:Protobuf 3 的设计哲学强调简单和向后兼容。它移除了
required字段,所有字段默认为optional,并提供了reserved关键字来保护已删除字段的编号,这使得在不破坏现有客户端的情况下对数据结构进行升级变得非常容易。 - 标准化 JSON 支持:Protobuf 3 提供了标准化的 JSON 映射,方便在需要人类可读或与 Web API 交互的场景下进行调试和通信。
🚀 什么是 gRPC?
gRPC 是一个现代、开源、高性能且通用的远程过程调用(RPC)框架。它让一个应用程序能够像调用本地函数一样,去调用另一个远程服务器上的函数,极大地简化了分布式系统间的通信复杂性。
gRPC 的核心特性包括:
- 基于 HTTP/2:gRPC 默认使用 HTTP/2 作为传输协议,这带来了多路复用(在单个连接上并行处理多个请求)、头部压缩、双向流等高级功能,显著提升了网络效率。
- 以 Protobuf 为默认数据格式:gRPC 使用 Protobuf 作为其默认的接口定义语言(IDL)和消息序列化机制,继承了其高性能、强类型的优点。
- 代码生成:通过
.proto文件定义服务接口(包括方法、参数和返回类型),gRPC 可以自动生成客户端和服务端的桩代码,开发者只需关注业务逻辑的实现,无需手动处理底层的网络通信、序列化等细节。
gRPC 的四种通信模式
gRPC 提供了灵活的通信模型,以满足不同场景的需求:
| 通信模式 | 描述 | 方法定义示例 |
|---|---|---|
| 一元 RPC (Unary RPC) | 最普通的调用模式,客户端发送一个请求,服务器返回一个响应。 | rpc SayHello(HelloRequest) returns (HelloReply); |
| 服务器流式 RPC (Server streaming RPC) | 客户端发送一个请求,服务器返回一个数据流(一系列消息)。 | rpc LotsOfReplies(HelloRequest) returns (stream HelloReply); |
| 客户端流式 RPC (Client streaming RPC) | 客户端发送一个数据流(一系列消息),服务器在处理完所有消息后返回一个响应。 | rpc LotsOfGreetings(stream HelloRequest) returns (HelloReply); |
| 双向流式 RPC (Bidirectional streaming RPC) | 客户端和服务器各自通过独立的流互相发送一系列消息,双方可以按任意顺序读写。 | rpc BidiHello(stream HelloRequest) returns (stream HelloReply); |
总而言之,Protobuf 3 和 gRPC 共同提供了一个完整的解决方案,用于构建高效、可靠且易于演进的分布式系统和微服务架构。













































































