Go语言工程实践入门(五)RPC框架 | 青训营

46 阅读3分钟

RPC 基本原理

RPC(Remote Procedure Call,远程过程调用)是一种通信协议,用于使一个进程(客户端)能够调用另一个运行在不同地址空间的进程(服务器)上的过程或函数,就像本地调用一样。

RPC 需要解决的问题是:函数映射、数据转换为字节流和网络传输三个方面。

RPC 的基本原理和一次完整的 RPC 过程如下图所示。

image.png

RPC协议的基本原理如下:

  1. 客户端调用:客户端应用程序发起一个本地调用,就像调用本地函数一样。客户端提供了要调用的过程的名称、参数和参数值等信息
  2. 参数编码:客户端的RPC运行时系统将调用的信息进行封装,并将参数编码成一个网络可传输的格式,例如将参数序列化为二进制数据
  3. 传输请求:通过网络传输将封装好的请求发送给服务器。
  4. 服务端接收:服务端的RPC运行时系统接收到请求后,进行解析和解码操作,还原出客户端传递的信息。
  5. 过程调用:服务端根据解析得到的信息,调用对应的过程或函数,并将结果返回给RPC运行时系统。
  6. 结果编码:服务端的RPC运行时系统将结果编码为可传输的网络格式。
  7. 传输响应:服务端将封装好的结果通过网络传输回客户端。
  8. 客户端接收:客户端的RPC运行时系统接收到响应后,进行解析和解码操作,还原出服务端返回的结果。
  9. 结果处理:客户端将结果交给应用程序使用或进行进一步处理

通过RPC协议,客户端和服务器之间可以进行透明的远程通信,对于客户端来说,不需要关心具体的网络细节,只需要像调用本地函数一样调用远程过程。这使得分布式系统的开发更加方便和高效。

常见的RPC框架包括 gRPCApache ThriftSpring Cloud等。它们提供了一套完整的 RPC 协议栈,并支持多种编程语言,使得远程调用变得更加简单和可靠。

RPC 分层设计

Apache Thrift为例的分层设计如下所示。

image.png

  1. 编解码层:包括代码生成和序列化及反序列化
    • 代码生成是指通过代码生成工具把IDL文件转换为不同语言对应的lib代码,里面封装了编解码逻辑
    • 编解码一般选择二进制编码,在选型的时候需要考虑兼容性(支持自动增加新的字段而不影响老服务)、通用性(跨平台、跨语言)、性能(需要考虑编码后数据大小和编码耗费时长)
  2. 协议层:协议是双方约定的编解码语义和格式,主要用于从二进制数据中解析出对应字段的数据
  3. 网络通信层:对序列化后的二进制编码数据进行网络传输