这是我参与「第五届青训营 」伴学笔记创作活动的第 7 天
一、RPC 框架基本概念
1.本地函数调用
-
步骤:
1.将参数值压栈
2.通过函数指针找到调用的函数,进入函数取出参数
3.执行函数内的操作
4.将返回值压栈,从调用的函数返回
5.从栈中取出返回值
-
以上步骤只是为了说明原理。事实上编译器经常会做优化,对于参数和返回值少的情况会直将其存放在寄存器,而不需要压栈弹栈的过程,甚至都不需要调用 call,而直接做 inIine 操作。
2.远程函数调用 (RPC - Remote Procedure CaIIs)
-
RPC 需要解决的问题:
1.函数映射:
在远程调用中,函数指针是不行的,因为两个进程的地址空间是完全不一样的:所有函数都有自己的一个 ID,在做 RPC 的时候要附上这个 ID,还得有个 ID 和函数的对照关系表,通过 ID 找到对应的函数并执行。
2.数据转换成字节流
在本地调用中,我们只要把参数压到栈里,然后让函数自己去栈里读就行。但是在远程过程调用时,客户跟服务端是不同的进程,不能通过内存来传递参数。这时候就要客户端把参数先转成一个字节流,传给服务端后,再把字节流转成自己能读取的格式。
3.网络传输
3.RPC 概念模型
1984 年 Nelson 发表了论文《lmplementing Remote Procedure CaIIs》其中提出了 RPC 的过程由 5 个模型组成:User、User-Stub、RPC-Runtime、Server-Stub、Server
4.一次 RPC 的完整过程
-
IDL (lnterface descri ption language) 文件
相比本地函数调用,远程调用的话我们不知到对方有哪些方法,以及参数长什么样,所以需要有一种方式来描述或者说声明我有哪些方法,方法的参数都是什么样子的,这样的话大家就能按照这个来调用,这个描述文件就是 IDL 文件 。
IDL 通过一种中立的方式来描述接口,使得在不同平台上运行的对象和用不同语言编写的程序可以相互通信。
-
生成代码
服务双方是通过约定的规范进行远程调用,双方都依赖同一份 IDL 文件,需要通过编译器工具把 IDL 文件转换成语言对应的静态库,具体调用的时候用户代码需要依赖生成代码,所以可以把用户代码和生成代码看做一个整体。
-
编解码
从内存中表示到字节序列的转换称为编码,反之为解码,也常叫做序列化和反序列化。
-
通信协议
规范了数据在网络中的传输内容和格式。除必须的请求和响应数据外,通常还会包含额外的元数据。
5.RPC 的好处
- 单一职责,有利于分工协作和运维开发
- 可扩展性强,资源使用率更优
- 故障隔离,服务的整体可性更高
6.RPC 带来的问题
- 服务宕机,对方应该如何处理?
- 在调用过程中发生网络异常,如何保证消息的可达性?
- 请求量突增导致服务无法及时处理,有哪些应对措施?
RPC 带来好处的同时也带来了不少新的问题 , 将由 RPC 框架来解决
二、RPC 分层设计
主要核心分三层: