RPC 的基本概念
RPC(Remote Procedure Call)是一种远程过程调用的通信协议,允许一个程序调用另一个程序或进程中的函数或方法,就像调用本地函数一样,而无需显式地处理网络通信细节。
在分布式系统中,不同的计算机或进程之间需要进行通信以协同完成任务。RPC提供了一种方便的方式来实现远程通信,能够像调用本地函数一样调用远程函数,而不必担心底层的网络通信细节。
RPC的概念模型
涉及了客户端(User)、客户端代理(User-Stub)、运行时库(RPC-Runtime)、服务器端代理(Server-Stub)以及服务器端(Server) 等角色和组件,它们协同工作以实现远程过程调用的功能。通过这种方式,可以像调用本地函数一样调用远程服务器上的函数,而不必关心底层的网络通信细节。
IDL(Interface Definition Language,接口定义语言)文件
是用于描述接口和数据结构的一种中间语言。它用于在分布式系统中定义接口和数据类型,以便不同的编程语言和平台可以相互通信和交换数据。
IDL 文件用于RPC(Remote Procedure Call)框架中,帮助客户端和服务器定义接口和通信协议。Thrift和Protocol Buffers(Protobuf)都是流行的IDL(Interface Definition Language)工具,用于定义数据结构和接口,以支持在不同平台和语言之间进行跨网络通信和数据序列化。这两种工具都可以构建高效的分布式系统,但它们在语法、特性和使用场景上有一些区别。
一个完整的RPC(Remote Procedure Call,远程过程调用)过程
涉及客户端和服务端之间的通信和交互,使得客户端能够调用远程服务的方法,就像调用本地方法一样。以下是一次完整的RPC过程的步骤:
- 定义接口: 首先,在服务端和客户端之间需要定义共享的接口。这可以使用IDL(Interface Definition Language)来定义,如Thrift的IDL文件。
- 代码生成: 使用IDL文件,使用代码生成器生成客户端和服务端的代码。这些代码包括数据结构、代理类和服务接口。
- 客户端调用: 客户端在调用远程服务方法之前,首先创建一个代理对象,用于与远程服务进行通信。 客户端通过代理对象调用远程服务的方法,就像调用本地方法一样。代理对象封装了底层的网络通信细节。
- 参数编码: 客户端调用远程方法时,传递的参数需要被编码为协议定义的格式。编码包括将参数转换为字节流,添加字段标识和长度信息等。
- 网络传输: 编码后的数据通过网络传输到服务端。客户端使用传输层将数据发送给服务端。
- 参数解码: 服务端接收到数据后,使用传输层将数据传递给协议层。 协议层对数据进行解码,将字节流转换为参数值,以便在服务端方法中使用。
- 服务端方法调用: 服务端收到解码后的参数值后,调用相应的服务方法。方法的执行和返回值与本地方法调用类似。
- 返回值编码: 服务端方法执行完成后,返回值也需要被编码为协议定义的格式。编码过程类似于参数编码。
- 网络传输: 编码后的返回值通过网络传输回客户端。
- 返回值解码: 客户端接收到数据后,使用传输层将数据传递给协议层。 协议层对数据进行解码,将字节流转换为返回值,以便在客户端获取结果。
- 客户端获取结果:客户端通过代理对象获取方法的返回值,继续执行后续逻辑。
总结
整个过程中,客户端和服务端的数据传输、编码和解码逻辑都由RPC框架处理。通过RPC,远程服务就像本地方法一样可以被调用,大大简化了分布式系统的开发。