这是我参与「第五届青训营」伴学笔记创作活动的第7天。今天学的是RPC框架相关知识。
RPC是指远程函数调用。它与本地函数调用的区别是需要函数映射,将数据转换成字节流和网络传输。在本地调用中,函数体是直接通过函数指针来指定的,我们调用哪个方法,编译器就自动帮我们调用它相应的函数指针。但是在RPC中,这是不行的,因为两个进程的地址空间是完全不一样的。这样,远程调用函数要有个ID,在做RPC的时候要附上这个ID,还得有个ID和函数的对照关系表,通过ID找到对应的函数并执行。这就是函数映射。将数据转化成字节流是因为在本地调用中,只需要把参数压到栈里,然后让函数自己去栈里读就能获得参数值。但是在RPC中,客户端跟服务端是不同的进程,不能通过内存来传递参数。这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。客户端和服务器端间传输数据需要还需要考虑网络传输。
RPC的流程是:服务消费方(client)调用以本地调用方式调用服务;client stub接收到调用后负责将方法、参数等组装成能够进行网络传输的消息体;client stub找到服务地址,并将消息发送到服务端;server stub收到消息后进行解码;server stub根据解码结果调用本地的服务;本地服务执行并将结果返回给server stub;server stub将返回结果打包成消息并发送至消费方;client stub接收到消息,并进行解码; 服务消费方得到最终结果。
RPC的分层从上到下分别是最顶层用户自己编写的业务逻辑代码;下层通过代码生成工具把IDL文件转换成不同语言对应的lib代码,里面封装了编解码逻辑;下层框架的编解码层;下层框架的协议层;最底层框架的网络通信层。其中,IDL是通过—种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。