03 RPC框架 | 青训营笔记

77 阅读3分钟

RPC是什么

RPC代表远程过程调用(Remote Procedure Call),它是一种计算机通信协议,用于在分布式系统中使不同计算机上的程序能够相互调用。RPC允许程序开发人员编写像调用本地函数一样调用远程服务器上的函数,隐藏了底层的网络通信细节。

RPC的工作流程

  1. IDL(Interface description language)文件
    • IDL通过一种中立的方式来描述接口,使得在不同平台上运行的对象和不同语言编写的程序可以相互通信
  2. 生成代码
    • 通过编译器工具把IDL文件转换成语言对应的静态库
  3. 编解码
    • 从内存中表示到字节序列的转换成为编码,反之成为解码,也常叫做序列化和反序列化
  4. 通信协议
    • 通信协议规范了数据在网络中的传输内容和格式。除了必须的请求/响应数据外,通常还会包含额外的元数据
  5. 网络传输
    • 通常基于成熟的网络库走TCP/UDP传输

RPC的好处

  1. 单一职责,有利于分工协作和运维开发
  2. 可扩展性强,资源使用率更优
  3. 故障隔离,服务的整体可靠性更高

RPC框架的分层设计——以Apache Thrift为例

  • IDL(接口定义语言)层: 在顶层,Thrift使用一种独立于编程语言的接口定义语言(IDL)来定义跨平台和跨语言的接口规范。IDL定义了数据类型、结构、异常和函数等,描述了客户端和服务器之间的通信接口。

  • 代码生成层: Thrift的代码生成器接收IDL文件作为输入,并根据所选的目标语言生成相应的代码。代码生成层负责将IDL定义的接口转化为特定语言的类、结构和函数等代码,以便在客户端和服务器端使用。

  • 传输层: 传输层处理底层的数据传输和通信协议。Thrift支持多种传输协议,如基于TCP的传输、HTTP传输、以及非阻塞的传输等。这一层负责将数据打包、发送和接收,以及处理网络相关的细节。

  • 协议层: 协议层定义了数据的编码和解码规则,以便在客户端和服务器之间进行有效的数据交换。Thrift支持多种序列化协议,如二进制协议、压缩的二进制协议、JSON协议和可读文本协议等。协议层负责将数据按照所选协议进行序列化和反序列化。

  • 传输服务层: 传输服务层提供了底层传输和网络处理的具体实现。它可以使用底层的I/O库或操作系统提供的套接字接口,负责在网络上发送和接收数据。

通过这种分层设计,Apache Thrift实现了跨平台和跨语言的通信能力。开发人员可以使用统一的IDL来定义接口规范,然后根据目标语言生成所需的代码。Thrift提供了灵活的传输和序列化协议选择,使得开发人员可以根据具体需求选择合适的协议。同时,Thrift的分层设计也使得它具有良好的可扩展性,可以方便地添加新的传输协议和序列化协议。