RPC需要解决的问题
对于本地函数调用,我们只需要将参数压入栈中,函数会从栈中将参数取出,然后再将返回值压栈返回。但是对于RPC的方式,客户端和服务端分别运行于不同的进程上。因此,对于远程调用,需要解决以下三个问题:
- 函数映射:分布在两个进程上的函数要正确联系起来
- 数据转换成字节流:因为不能通过内存传参,数据必须要转换为字节流传到服务端,再转换后读取
- 网络传输:要通过网络传输字节流,需保证可靠性、一致性等
RPC模型与调用过程
下图为课件中的RPC模型。
-
IDL(Interface Description Language)文件:通过一种中立的方式描述接口,包括描述生成的方法、方法需要的参数格式等,使得在不同平台上运行的对象和不同语言上编写的程序可以依照此规范互相通信。
-
生成代码:通过编译器工具把IDL文件转换成语言对应的静态库(图中GenCode)
-
编解码:从内存中表示到字节序列的转换称之为编码,反之为解码,也可称为序列化/反序列化 (图中的encoder和Decoder)
-
通信协议:规范数据在网络中的传输内容和格式,除必须的响应请求外,还会包含额外的元数据(图中的Protocol)
-
网络传输:网络通讯协议例如TCP/UDP及网络模型,对应图中transfer层
RPC的优点
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用更优
- 故障隔离,服务整体可靠性更高