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 | 是 | 否 |