Protocol Buffers - 简介



在我们深入了解 Protocol Buffer 之前,让我们先简单回顾一下序列化,这是 Protocol Buffer 所做的事情。

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

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

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

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

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

为什么选择 Google Protocol Buffers?

Google Protocol Buffers 执行将对象序列化和反序列化为字节的过程,这些字节可以通过网络传输。但也有一些其他库和机制可以传输数据。

那么,是什么让 Google Protocol Buffers 如此特别呢?以下是它的一些重要特性:

  • 语言无关 - 多种语言都具有 Protocol Buffers 库,其中一些著名的语言包括 Java、Python、Go 等。因此,Java 对象可以由 Java 程序序列化为字节,并可以反序列化为 Python 对象。

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

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

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

Protocol Buffers 与其他方案比较 (XML/JSON/Java 序列化)

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

特性 Protocol Buffers JSON XML
语言无关性
序列化数据大小 三者中最少 小于 XML 三者中最大
人类可读性 否,因为它使用单独的编码方案 是,因为它使用基于文本的格式 是,因为它使用基于文本的格式
序列化速度 三者中最快的 比 XML 快 三者中最慢的
数据类型支持 比其他两个更丰富。支持复杂的数据类型,如 Any、oneof 等。 支持基本数据类型 支持基本数据类型
支持演化架构
广告