这是我参与「第三届青训营 -后端场」笔记创作活动的第2篇笔记。
前言
首先要理解rpc框架为什么这么受欢迎。随着客户多样需求的增加,业务量也随之增加,因此单体应用会造成一系列影响效率,增加成本的问题,例如业务间代码重复,数据传输共享途径混乱。因此开发人员将各服务分开,并隔离持久性数据库,一般为mysql,可以简单简单理解为各个服务负责自己的部分。至此,微服务的架构模式流行起来,各服务之间的相互调用使用rpc框架和消息队列,保证了远程调用的有序性和数据的实时性。
RPC的相关概念
由于远程行调用不同于本地调用,调用方是不知道一个服务中的方法以及方法的参数的,因此IDL(Interface Description Language)文件描述接口,使得不同语言的程序可以通信,可以理解为一个约定规范。事实上,如果RPC框架不需要实现跨语言性,那么IDL就不是必须的。如果使用了IDL文件,我们还需要通过编译工具将其转化为对应语言的静态库。规范有了,接下来就是统一交互数据的格式进行通讯。序列化,也叫做编码,是指从对象到二进制数据的转化,而反序列化,也叫做解码,则反之。这里需要理解,序列化便捷了在网络中传输数据,反序列化则使得程序理解对象,方便后续处理。在进行通讯的过程中,需要通讯协议规范数据在网络中的传输内容和格式,主要是请求和响应数据,另外通信协议规定还规定了元数据怎么摆放的。网络传输则一般基于成熟的网络库走TCP/UDP。
RPC调用流程
这里借用一张网上的图详细讲解rpc调用过程。首先服务消费方(一般是客户端,client)调用服务,clientstub接收到调用后将消息编码,通过network找到所需要服务的地址发送消息到服务端。server stub将收到的消息解码,并根据解码后的结构调用本地的服务,本地服务执行并将结果返回给server stub。接下来就是在此通过network,将返回结果编码解码并最终送到服务消费方,至此一次远程行调用就完成啦。当然,rpc的工作就是将中间这些消息传递的细节封装起来,如此,用户好似认为是在本地直接调用方法,其实,我们对调用方法的数据做了复杂处理。