RPC 简介

在常规编程中,将常用逻辑封装在函数中通常很有用,这样它就可以在多个地方重用。 随着网络和分布式系统的兴起,有必要通过网络访问一组通用操作,以便经过验证的客户端可以调用它们。这通常称为 Remote Procedure Call (RPC) 。 在第4章,数据序列化,反序列化和解析中,当服务器从原点返回给定点的距离时,我们看到了一个简单的例子。真实世界RPC定义了许多应用层协议,这些协议要复杂得多。 最受欢迎的RPC实现之一是 gRPC ,它最初由 Google 引入,后来转移到开源模型。 gRPC 提供高性能的 RPC over Internet 规模网络,并广泛用于许多项目,包括 Kubernetes 。

在深入研究 gRPC 之前,让我们看看协议缓冲区,一个相关的工具。 它是一组在应用程序之间构建语言和平台中立交换结构化数据的机制。它定义了自己的 接口定义语言 Interface Definition Language (IDL) 来描述数据格式,以及一个编译器,它可以采用该格式并生成代码以进行转换。 IDL 还允许定义抽象服务:输入和输出消息格式,编译器可以使用它来生成给定语言的存根。我们将在后续示例中看到数据格式定义的示例。 编译器具有插件,可以生成大量语言的输出代码,包括 Rust 。在我们的示例中,我们将在构建脚本中使用此类插件来自动生成Rust模块。现在,gRPC使用协议缓冲区来定义基础数据和消息。消息在 TCP/IP 之上通过 HTTP/2 进行交换。这种通信模式在实践中通常更快,因为它可以更好地利用现有连接,并且因为 HTTP/2 支持双向异步连接。作为一个自以为是的系统,gRPC 对我们代表我们在上一节中讨论过的考虑做出了很多假设。大多数这些默认值(如 TCP 上的 HTTP/2 )都被选中,因为它们支持 gRPC 提供的高级功能(如双向流)。 其他一些默认设置(如使用protobuf)可以交换为另一种消息格式实现。