深入浅出 RPC01 | 青训营

49 阅读3分钟

RPC 框架分层设计

01 基本概念

1.1 本地函数调用

以上步骤只是为了说明原理。事实上编译器经常会做优化,对于参数和返回值少的情况会直接将其存放在寄存器,而不需要压栈弹栈的过程,甚至都不需要调用call,而直接做inline操作

1.2 远程函数调用(RPC—Remote Procedure Calls )

1、函数映射

我们怎么告诉支付服务我们要调用付款这个函数,而不是退款或者充值呢? 在本地调用中,函数体是直接通过函数指针来指定的,我们调用哪个方法,编译器就自动帮我们调用它相应的函数指针。 但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。

所以函数都有自己的一个ID,在做 RPC的时候要附上这个 ID,还得有个 ID 和函数的对照关系表,通过 ID找到对应的函数并执行。

2、客户端怎么把参数值传给远程的函数呢?

在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。 但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。 这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。

3、 远程调用往往用在网络上,如何保证在网络上高效稳定地传输数据?

image-20230605125330090

1.3 RPC 概念模型

image-20230605130050531

1.4 一次 RPC 完整过程

相比本地函数调用,远程调用的话我们不知道对方有哪些方法,以及参数长什么样, 所以需要有一种方式来 描述 或者 声明 我有哪些方法,方法的参数都是什么样子的, 这样的话大家就能按照这个来调用,这个描述文件就是 IDL 文件。

刚才我们提到服务双方是通过约定的规范进行远程调用,双方都依赖同一份IDL文件, 需要通过工具来生成对应的生成文件,具体调用的时候用户代码需要 依赖 生成代码,所以可以把用户代码和生成代码看做一个整体。

编码只是解决了跨语言的数据交换格式,但是如何通讯呢?需要制定通讯协议,

以及数据如何传输?我的网络模型如何呢?那就是这里的 transfer 要做的事情。

image-20230605130234193

1.5RPC好处

单一职责,开发(采用不同的语言)、部署以及运维(上线独立)都是独立的

可扩展性强,例如压力过大的时候可以独立扩充资源,

底层基础服务可以复用,节省资源 某个模块发生故障,不会影响整体的可靠性

image-20230605132636450

1.6RPC带来的问题

image-20230605132914506

1.7 总结

1.本地函数调用和RPC 调用的区别:

RPC需要解决:函数映射、数据转成字节流、网络传输

2.RPC 的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server

3. 一次 PRC 的完整过程,并讲解了RPC的基本概念定义

4.RPC 带来好处的同时也带来了不少新的问题,将由 RPC 框架来解决