RPC学习及项目进度 - 1.什么是RPC

本文项目更新地址:点我点我>w<

好久不更新 主播不是似了 是没活了 基本上这几个月都是嗯造基础学习 现在开始猛猛更新 也没人看!(x

RPC的全称是Remote Procedure Call,即远程过程调用,是一种计算机通信协议。它允许程序在不同计算机之间进行通信和交互,就像本地调用一样。简单解读字面上的意思,远程是指要跨机器而非本机,所以需要用到网络编程才能实现。

为什么要用RPC

RPC的作用就是体现在这样两个方面:

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

笔者认为在微服务和大规模分布式服务中 相较于使用HttpClient手搓调用通用可见的方式,RPC显得更效率,更简单。

RPC通信流程

发起调用请求的那一方叫做调用方,被调用的一方叫做服务提供方。

为了实现这个目标,就需要在RPC框架里面对整个通信细节进行封装。RPC是一个远程调用,是需要通过网络来传输数据,并且RPC常用于业务系统之间的数据交互,需要保证其可靠性,所以RPC一般默认采用TCP来传输。常用的HTTP协议也是建立在TCP之上的。

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

那我们来思考一下 如果我收到了一大串二进制数据 我该如何去分析这些是什么东西呢?

那么协议就出现了。把数据格式的约定内容叫做“协议”。大多数的协议会分成两部分,分别是数据头和消息体。数据头一般用于身份识别,包括协议标识、数据大小、请求类型、序列化类型等信息;消息体主要是请求的业务参数信息和扩展属性等。

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

服务提供方再根据反序列化出来的请求对象找到对应的实现类,完成真正的方法调用,然后把执行结果序列化后,回写到对应的TCP通道里面。调用方获取到应答的数据包后,再反序列化成应答对象,这样调用方就完成了一次RPC调用。但是上述流程比较复杂,整体不太友好。

所以可以采用动态代理的技术简化上述流程,通过字节码增强对方法进行拦截增强,以便于增加需要的额外处理逻辑。

RPC的设计由Client,Client stub,Network ,Server stub,Server构成。 其中Client就是用来调用服务的,Cient stub是用来把调用的方法和参数序列化的(因为要在网络中传输,必须要把对象转变成字节),Network用来传输这些信息到Server stub, Server stub用来把这些信息反序列化的,Server就是服务的提供者,最终调用的就是Server提供的方法。(Dubbo-浅谈RPC)

在调用方的程序里面,RPC框架根据调用的服务接口提前生成动态代理实现类,并通过依赖注入等技术注入到声明了该接口的相关业务逻辑里面。该代理实现类会拦截所有的方法调用,在提供的方法处理逻辑里面完成一整套的远程调用,并把远程调用结果返回给调用方,这样调用方在调用远程方法的时候就获得了像调用本地接口一样的体验。

RPC工作原理