远程过程调用RPC

在滴滴实习中用到RPC,然后面试腾讯时,被问到相关原理,遂整理一下,以防再遇到此类问题。

PRC常用框架很多,有gPRC、Thrift、Dubbo等,优点是:

    1、可以够跨多种开发工具及平台,比如说企业已有的系统开发完毕或者子系统已经部署交付了,它提供了RPC接口,新的子系统要集成,使用业界通用的RPC接口就可以集成了,你不可能要求原来的开发商再来修改一遍接口,否则的话就变成了信息孤岛。
    2、能够跨多个服务器,这个在其他计算机上很容易透过80端口的RPC来访问各个服务器。其他如TCP消息来访问,尽管高效但不方便而且还要穿透防火墙,尤其不方便网页集成。

由于他的诸多优势,在分布式的场景下经常会被用到,在微服务架构中,每个服务实例负责某一单一领域的业务实现,不同服务实例之间需要进行频繁的交互来共同实现业务。服务实例之间常用轻量级的远程调用方式进行通讯,比如RPC和HTTP。

对于RPC和HTTP二者而言,HTTP是应用层协议,而RPC网络协议相对灵活且可以定制,并且提供更加贴近本地方法调用的远程过程调用形式,所以一般来说往往使用RPC通信。

RPC(Remote Procedure Call)的缩写,是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。只是一套协议,基于这套协议规范来实现的框架都可以称之为RPC框架。

RPC一般采用客户端/服务端(C/S)模式,请求方是客户端,而服务的提供方是服务端。

RPC调用示意图
RPC调用示意图

调用过程:

(1)客户端进程以正常的方式调用客户端存根
(2)客户端存根生成一个消息,然后调用本地操作系统的网络通信模块,存根进入阻塞状态
(3)客户端操作系统将网络消息发送给远程操作系统
(4)远程操作系统将网络消息交给服务端存根
(5)服务器存根将参数提取出来,而后调用服务端程序
(6)服务端程序执行相应的操作,操作完成后将结果返回给服务端存根。
(7)服务端存根将结果打包成一个消息,而后调用本地操作系统
(8)服务端操作系统江含有结果的消息发送给客户端操作系统
(9)客户端操作系统将含有结果的消息交给客户端的存根,存根从阻塞状态恢复,进入运行状态
(10)客户存根将结果从消息中提取出来,返回给调用它的客户端进程

上述步骤对客户存根发出的本地调用转换成对服务器进程的本地调用,而客户端和服务端都不会意识到中间步骤的存在,这也是RPC的优势之一。

注:此时就会涉及到堆和栈分别存储的什么东西,这块要思考的这个存根究竟是个什么?他存了什么?个人感觉存储了栈,存放调用函数的名称,参数,回传结果等。

另外,堆和栈有什么区别,他们究竟分别存放什么呢?

栈由操作系统自动分配释放 ,用于存放函数返回地址、相关参数、局部变量和寄存器内容等,其操作方式类似于数据结构中的栈。
程序在运行时首先入栈的是主函数下一条语句的地址,即扩展指针寄存器的内容(EIP),然后是当前栈帧的底部地址,即扩展基址指针寄存器内容(EBP),再然后是被调函数的实参等,
一般情况下是按照从右向左的顺序入栈,之后是被调函数的局部变量,注意静态变量是存放在数据段或者BSS段,是不入栈的。出栈的顺序正好相反,最终栈顶指向主函数下一条语句的地址,主程序又从该地址开始执行。

堆:堆由开发人员分配和释放, 若开发人员不释放,程序结束时由 OS 回收,分配方式类似于链表。堆中存储的数据若未释放,则其生命周期等同于程序的生命周期。
堆上内存空间的分配过程:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。另外,对于大多数系统,会在这块内存空间中的首地址处记录本次分配的大小,这样,代码中的delete语句才能正确地释放本内存空间。由于找到的堆节点的大小不一定正好等于申请的大小,系统会自动地将多余的那部分重新放入空闲链表。

实现一个好的RPC过程,主要需要关注:参数传递,通信协议制定,出错和超时处理

参数传递:

1、传递值参数
2、RPC一般不支持直接引用传递(传递参数的引用时需要把参数的副本发过去)
3、数据格式的统一问题,可使用(ProtoBuf,Json,XML)这个看具体的选择

通信协议制定

1、协议设计:考虑避免无效字段、通信功能特性的支持(CRC校验等)、如何升级
2、私有协议的编解码
3、命令定义和命令处理器
4、命令协议
5、通信模式

在服务端注册实现原理分析

1、服务方法注册,包括注册接口,通过反射处理将方法取出,并存到map中
2、处理网络调用,主要是监听端口、读取数据包、解码请求、调用反射处理后的方法,将返回值编码,返回客户端。

客户端发送RPC请求原理分析

1、同步调用和异步调用
2、请求参数编码
3、接收服务端响应

客户端请求过程

posted @ 2021-03-14 00:17  布尔先生  阅读(373)  评论(0编辑  收藏  举报