> 文章列表 > RPC学习

RPC学习

RPC学习

RPC

RPC的简述

rpc到底干了什么,rpc怎么干的

RPC 的全称是 Remote Procedure Call,即远程过程调用。简单解读字面上的意思,远程肯定是指要跨机器而非本机或者是同一机器不同进程之间调用,所以需要用到网络编程才能实现。

作用

  • 屏蔽远程调用跟本地调用的区别,让我们感觉就是调用项目内的方法;
  • == 隐藏底层网络通信的复杂性==,让我们更专注于业务逻辑。

rpc通信流程

网络传输的数据必须是二进制数据,但调用方请求的出入参数都是对象。对象是肯定没法直接在网络中传输的,需要提前把它转成可传输的二进制,并且要求转换算法是可逆的,这个过程我们一般叫做“序列化”。

根据协议格式,服务提供方就可以正确地从二进制数据中分割出不同的请求来,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象。这个过程叫作“反序列化”。

服务提供方再根据反序列化出来的请求对象找到对应的实现类,完成真正的方法调用,然后把执行结果序列化后,回写到对应的 TCP 通道里面。

RPC 协议

HTTP 协议跟 RPC 都属于应用层协议,但 HTTP 协议的数据包大小相对请求数据本身要很多,又需要加入很多无用的内容,比如换行符号、回车符等;还有一个更重要的原因是,HTTP 协议属于无状态协议,客户端无法对请求和响应进行关联,每次请求都需要重新建立连接,响应完成后再关闭连接。因此,对于要求高性能的 RPC 来说,HTTP 协议基本很难满足需求

协议头里面,我们除了会放协议长度、序列化方式,还会放一些像协议标示、消息 ID、消息类型这样的参数,而协议体一般只放请求接口方法、请求的业务参数值和一些扩展属性。

最好设计一个可扩展的协议
整体协议就变成了三部分内容:固定部分、协议头内容、协议体内容

RPC 框架在使用时要注意哪些问题

  • 对象构造得过于复杂
  • 对象过于庞大
  • 对象有复杂的继承关系

RPC框架在网络通信上更倾向于哪种网络IO模型

常见的网络io模型

常见的网络 IO 模型分为四种:同步阻塞 IO(BIO)、同步非阻塞 IO(NIO)、IO 多路复用和异步非阻塞 IO(AIO)

1.阻塞io
同步阻塞io,在linux中,默认情况下所有的socket都是blocking
首先,应用进程发起io --> 进程被阻塞 ,进入内核态 -->内核开始等待数据–>数据到来,从内核态拷贝到用户态内存–>io处理完毕,返回用户态–>解除阻塞状态

2.io多路复用是将io的轮询交给内核态操作

RPC 调用在大多数的情况下,是一个高并发调用的场景,考虑到系统内核的支持、编程语言的支持以及 IO 模型本身的特点,在 RPC 框架的实现中,在网络通信的处理上,我们会选择 IO 多路复用的方式.

零拷贝(Zero-copy)技术。

零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作,应用进程每一次的读写操作,都可以通过一种方式,让应用进程向用户空间写入或者读取数据,就如同直接向内核空间写入或者读取数据一样,再通过 DMA 将内核中的数据拷贝到网卡,或将网卡中的数据 copy 到内核

零拷贝有两种解决方式,分别是 mmap+write 方式和 sendfile 方式