RPC框架的入门|青训营笔记
这是我参与「第四届青训营」笔记创作活动的第5篇笔记
基本概念
本地函数调用
压栈
远程函数调用
-
函数映射
本地调用中,调用函数通过函数指针来制定
在远程调用中,函数指针不可行,因为两个进程的地址空间是完全不一样的
所以引入函数ID,ID和函数存在对照关系表,通过查表调用函数 在本机的函数调用中,函数体是直接通过函数指针来指定的,当函数调用时,编译器会自动调用相应的函数指针。
-
数据转换成字节流
本地调用中,传参只需要把参数压到栈中,函数自行去栈里读数据
远程调用中,客户端跟服务端是不同的进程,不能通过内存来传递参数
所以客户端需要把参数先转成一个字节流,传给服务端后,再将字节流转化为需要的格式
网络传输的数据必须是二进制数据,但是调用方的请求的出入参数都是对象,对象是不能直接在网络中传输的,必须提前把它转换成可传输的二进制数据,这个过程就叫做“序列化”。
服务端必须要做到的是能够正确的从网络传输过来的二进制数据中分割出不同的请求,同时根据请求类型和序列化类型,把二进制的数据还原为请求对象,这个过程叫做“反序列化”。
在RPC调用中,对输入参数对象与返回值对象进行序列化和反序列化是一个必须的过程。
callID映射
但是在远程调用中,因为是跨服务器的,两个进程的地址空间是完全不一样的。所以,在RPC中,所有的函数都必须有一个自己的ID,这个ID在所有的进程中都是唯一确定的。
客户端在远程调用时,需要带上这个ID。同时我们需要在客户端和服务端分别维护一个{ 函数 <-> Call ID}的映射表。 两端的表可以不需要完全相同,但是相同函数对应的Call ID必须相同。
当客户端需要远程调用的时候,就需要查一下此表,查询出对应的Call ID , 传输至服务端,服务端也查询映射表,来确定客户端需要调用的函数,最终执行相应的函数代码。