Protobuf - 简介

在介绍 Protocol Buffer 之前,让我们先简单了解一下序列化的背景,这就是 Protocol Buffer 的作用。

什么是序列化和反序列化?

序列化是将对象(任何语言)转换为字节并将其存储在持久内存系统中的过程。此内存系统可以是磁盘上的文件、消息队列或数据库。对象序列化的主要目的是我们可以重用数据并在相同或不同的机器上重新创建对象。在反序列化中,我们将存储的字节转换回对象。

为什么我们需要序列化和反序列化?

虽然还有其他一些用例,但最基本和最重要的用例是它提供了一种通过网络将对象数据传输到不同服务/机器等的方法,然后重新创建对象以供进一步使用。通过 API、数据库或消息队列传输对象数据需要将对象转换为字节,以便通过网络发送。这就是序列化变得重要的地方。

在微服务架构中,应用程序被分解为小型服务,这些服务通过消息队列和 API 相互通信。所有这些通信都发生在网络上,需要频繁将对象转换为字节并转换回对象。因此,在分布式环境中,序列化和反序列化变得非常关键。

为什么选择 Google Protobuf?

Google Protobuf 将对象序列化和反序列化为可通过网络传输的字节。但还有一些其他库和机制也可以传输数据。

那么,Google Protobuf 有什么特别之处呢?以下是它的一些重要功能 −

  • 独立于语言 −多种语言都有 protobuf 库,其中比较著名的有 Java、Python、Go 等。因此,Java 对象可以从 Java 程序序列化为字节,也可以反序列化为 Python 对象。

  • 高效的数据压缩 − 在微服务环境中,由于网络上会发生多次通信,因此我们发送的数据尽可能简洁至关重要。我们需要避免任何多余的信息,以确保数据快速传输。Google Protobuf 将此作为重点领域之一。

  • 高效的序列化和反序列化 − 在微服务环境中,由于网络上会发生多次通信,因此序列化和反序列化的速度至关重要。Google Protobuf 确保尽可能快地序列化和反序列化数据。

  • 易于使用 − Protobuf 库自动生成序列化代码(我们将在接下来的章节中看到),具有版本控制方案,以确保数据创建者和数据用户可以拥有不同版本的序列化定义等。

Protobuf 与其他(XML/JSON/Java 序列化)

让我们看看其他通过网络传输数据的方式与 Protobuf 相比如何。

功能 Protobuf JSON XML
与语言无关
序列化数据大小 三者中最小 小于 XML 三者中最高
人类可读性 否,因为它使用单独的编码模式 是,因为它使用基于文本的格式 是,因为它使用基于文本的格式
序列化速度 三者中速度最快 比 XML 快 三者中最慢三
数据类型支持 比其他两个更丰富。支持复杂的数据类型,如 Any、one of 等。 支持基本数据类型 支持基本数据类型
支持不断发展的架构