这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天
深入浅出RPC框架
关于RPC(RPC-Remote Procedure Calls 远程函数调用)框架,在之前的课程中已经学习过部分内容,主要的思想就是将本地函数转换为远程的函数来进行调用,例如字节跳动的kitex框架。总的来说,RPC采用分布式的结构,将不同的服务分到各个不同的服务器,业务更加细化的同时结构也更加复杂。
RPC基本概念
函数调用
要将函数从本地调用转换为远程调用,我们需要解决以下问题:
- 函数映射问题
本地调用时,我们调用函数直接使用函数名加参数即可,编译器会自动帮助我们寻找相应的函数指针,但是远程调用时我们无法使用函数指针,因为两个进程的地址空间是完全不同的。
- 输入参数问题
如何把函数的参数值传递给服务端,本地调用中,参数压到栈中,然后让函数自己读取,在远程过程调用中,客户端服务器端是不同的进程,不能通过内存来传递参数。需要客户端把参数转换成字节流,传给服务器端,服务器端再把字节流转换成能读取的格式进行处理。
- 网络传输问题
使用什么样的传输协议进行数据的传输
概念模型
RPC概念模型分为五个部分:User, User-stub RPCRuntime, Server-stub, Server,User输入参数进行调用,User-stub进行打包,数据通过RPCRuntime发送,经由网络进行传输,抵达服务端机器进行解包和调用。
完整的RPC过程
一次完整的RPC过程有以下部分组成:
- 通过IDL文件描述接口,如Thrift, Protobuf等
- 通过编译器将IDL文件转换成静态库
- 将内存数据编码为字节序列
- 通信协议传输请求和响应
- 传输层走TCP/UDP协议