gRPC - 简介

在介绍 gRPC 之前,让我们先简单了解一下远程过程调用,这就是 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 已经有一个库和插件可以自动生成过程代码(我们将在接下来的章节中看到)。对于简单的用例,它可以用作本地函数调用。

使用 JSON 的 gRPC 与 REST

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

功能 gRPC 使用 JSON/XML 的 HTTP
与语言无关
HTTP 版本 HTTP/2 HTTP 1.1
指定域架构 .proto 文件 (Google Protocol Buffer)
序列化数据大小 最小 高(XML 更高)
人类可读性 否,因为它使用单独的编码schema 是的,因为它使用基于文本的格式
序列化速度 最快 较慢(XML 最慢)
数据类型支持 更丰富。支持复杂的数据类型,如 Any、one of 等。 支持基本数据类型
支持不断发展的 schema