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