gRPC - 简介
在深入了解 gRPC 之前,让我们简要了解一下远程过程调用 (RPC),这是 gRPC 的工作原理。
什么是远程过程调用?
远程过程调用看起来像是普通的/本地函数调用,但不同之处在于远程函数调用的执行通常发生在不同的机器上。但是,对于编写代码的开发者来说,函数调用和远程调用之间的区别很小。这些调用通常遵循客户端-服务器模型,其中执行调用的机器充当服务器。
为什么我们需要远程过程调用?
远程过程调用提供了一种在另一台机器上执行代码的方法。在大型复杂的产品中,单台机器无法承载产品正常运行所需的所有代码,因此远程过程调用至关重要。
在微服务架构中,应用程序被分解成小的服务,这些服务通过消息队列和 API 相互通信。所有这些通信都通过网络进行,不同的机器/节点根据它们承载的服务提供不同的功能。因此,在分布式环境中工作时,创建远程过程调用就成为一个关键方面。
为什么选择 gRPC?
Google 远程过程调用 (gRPC) 提供了一个执行远程过程调用的框架。但是,还有一些其他的库和机制可以在远程机器上执行代码。那么,是什么让 gRPC 与众不同呢?让我们来看看。
语言无关性 - gRPC 在内部使用 Google Protocol Buffer。因此,可以使用多种语言,例如 Java、Python、Go、Dart 等。Java 客户端可以进行过程调用,而使用 Python 的服务器可以做出响应,从而有效地实现语言无关性。
高效的数据压缩 - 在微服务环境中,由于多个通信通过网络进行,因此我们发送的数据越简洁越好。我们需要避免任何冗余数据,以确保数据的快速传输。由于 gRPC 在内部使用 Google Protocol Buffer,因此它具有此优势。
高效的序列化和反序列化 - 在微服务环境中,由于多个通信通过网络进行,因此我们尽可能快速地序列化和反序列化数据至关重要。由于 gRPC 在内部使用 Google Protocol Buffer,因此它确保了数据的快速序列化和反序列化。
简单易用 - gRPC 已经拥有一个库和插件,可以自动生成过程代码(我们将在接下来的章节中看到)。对于简单的用例,它可以像本地函数调用一样使用。
gRPC 与使用 JSON 的 REST 的比较
让我们看看其他通过网络传输数据的方式与 Protobuf 相比如何。
特性 | gRPC | 使用 JSON/XML 的 HTTP |
---|---|---|
语言无关性 | 是 | 是 |
HTTP 版本 | HTTP/2 | HTTP 1.1 |
指定域模式 | .proto 文件(Google Protocol Buffer) | 无 |
序列化数据大小 | 最小 | 高(XML 更高) |
人类可读 | 否,因为它使用单独的编码模式 | 是,因为它使用基于文本的格式 |
序列化速度 | 最快 | 较慢(XML 最慢) |
数据类型支持 | 更丰富。支持复杂数据类型,如 Any、oneof 等。 | 支持基本数据类型 |
支持演进模式 | 是 | 否 |