RPC 框架分层设计
01 基本概念
1.1 本地函数调用
以上步骤只是为了说明原理。事实上编译器经常会做优化,对于参数和返回值少的情况会直接将其存放在寄存器,而不需要压栈弹栈的过程,甚至都不需要调用call,而直接做inline操作
1.2 远程函数调用(RPC—Remote Procedure Calls )
1、函数映射
我们怎么告诉支付服务我们要调用付款这个函数,而不是退款或者充值呢? 在本地调用中,函数体是直接通过函数指针来指定的,我们调用哪个方法,编译器就自动帮我们调用它相应的函数指针。 但是在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的。
所以函数都有自己的一个ID,在做 RPC的时候要附上这个 ID,还得有个 ID 和函数的对照关系表,通过 ID找到对应的函数并执行。
2、客户端怎么把参数值传给远程的函数呢?
在本地调用中,我们只需要把参数压到栈里,然后让函数自己去栈里读就行。 但是在远程过程调用时,客户端跟服务端是不同的进程,不能通过内存来传递参数。 这时候就需要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
3、 远程调用往往用在网络上,如何保证在网络上高效稳定地传输数据?
1.3 RPC 概念模型
1.4 一次 RPC 完整过程
相比本地函数调用,远程调用的话我们不知道对方有哪些方法,以及参数长什么样, 所以需要有一种方式来 描述 或者 声明 我有哪些方法,方法的参数都是什么样子的, 这样的话大家就能按照这个来调用,这个描述文件就是 IDL 文件。
刚才我们提到服务双方是通过约定的规范进行远程调用,双方都依赖同一份IDL文件, 需要通过工具来生成对应的生成文件,具体调用的时候用户代码需要 依赖 生成代码,所以可以把用户代码和生成代码看做一个整体。
编码只是解决了跨语言的数据交换格式,但是如何通讯呢?需要制定通讯协议,
以及数据如何传输?我的网络模型如何呢?那就是这里的 transfer 要做的事情。
1.5RPC好处
单一职责,开发(采用不同的语言)、部署以及运维(上线独立)都是独立的
可扩展性强,例如压力过大的时候可以独立扩充资源,
底层基础服务可以复用,节省资源 某个模块发生故障,不会影响整体的可靠性
1.6RPC带来的问题
1.7 总结
1.本地函数调用和RPC 调用的区别:
RPC需要解决:函数映射、数据转成字节流、网络传输
2.RPC 的概念模型:User、User-Stub、RPC-Runtime、Server-Stub、Server
3. 一次 PRC 的完整过程,并讲解了RPC的基本概念定义
4.RPC 带来好处的同时也带来了不少新的问题,将由 RPC 框架来解决