RPC框架 | 青训营笔记

65 阅读2分钟

RPC框架 | 青训营笔记

这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天 ✌

1. RPC (Remote Procedure Calls)

RPC需要解决的问题:

  • (1)函数映射:本地调用直接采用函数指针调用,而远程函数处于不同的地址空间,无法实现指针调用
  • (2)数据转换成字节流:客户端的数据不能直接以参数形式在栈内共享,而需要转化成字节流在网络中传输
  • (3)网络传输:保证数据的高效稳定传输

RPC的概念模型: 在RPC调用中,本地的User(Client端)发起一个远程调用时,先本地调用User-stub,User-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPC-Runtime 实例传输到远端的实例。 远端 RPCRuntime 实例收到请求后交给 Server-stub 进行解码后发起向本地端 Server 的调用,调用结果再返回给 User 端。

  • User
  • User-Stub
  • RPC-Runtime
  • Server-Stub
  • Server

各模型之间的关系:

一次RPC完整过程: 通过IDL(Interface Description Language)文件描述接口 -> 编译器将IDL文件转换成目标语言对应的静态库 -> 数据序列化/反序列化 -> 基于通信协议规范传输内容和格式 -> 基于网络库进行TCP/UDP传输。

由此设计的RPC分层架构:业务逻辑代码层、编解码逻辑层(由IDL生成的lib代码)、编解码层、协议层、网络通信层

2. RPC的分层设计

编解码层中的数据格式:特定语言的格式(将内存对象编码为字节序列,eg:java.io.Serializable)、文本格式(json,xml,csv等)、二进制编码(Protobuf,BinaryProtocol)

协议层:协议构造/解析,涉及数据包、编解码方式、消息体的构造等

网络通信层(Sockets API):传统的五层计算机网络模型,通常采用网络库封装底层Socket API,支持TCP/UDP/UDS协议,进行异常处理,在应用层实现buffer减少copy