其他分享
首页 > 其他分享> > 给我解释解释什么TMD叫RPC

给我解释解释什么TMD叫RPC

作者:互联网

说到 RPC 就会想到“微服务”,现在大多数的应用系统发展到一定规模后,都会“微服务化”,微服务可谓是越来越火。可以说现在很少有单体架构的服务了。

既然微服务热度提高了,那么应用对微服务之间的通信要求也会变得越来越高。而 RPC 就是微服务间通信的基础,通常我们都以为是微服务造就了 RPC,认为RPC 只存在于微服务通信中。

但是事实上,只要有涉及到网络通信,我们就可能用到 RPC。

RPC 框架把整个网络通信过程做了完整的封装,能够极大程度的方便程序员开发出高效的分布式架构应用。正是因为有了 RPC 框架的存在,使得网络通信的逻辑变得更简单,同时也让网络通信变得更加可靠安全。

RPC 能解决什么问题 ?

要学习一门新的技术,我们首先要明白这项技术有什么优势,能够在现有的架构上进一步解决什么问题。是否它带来得收益比这项技术本身的成本更高?那么我们下面来看看 RPC 框架的出现主要能解决什么问题。

在以前没有 RPC 的时候开发人员是怎么做的呢?

下面是一个网络互连的七层模型和五层模型对应关系,一般我们进行程序开发都是在应用层面进行的,如果没有 RPC 框架,那么开发人员就要自己编写应用层下面的 :传输层、网络层、数据链路层以及物理层的一些对应处理逻辑。
OSI七层模型
可想而知,如果让一个开发程序员去过多的关注一些底层实现原理,是一件成本很高的事情,一般企业都是以业务为主的。

RPC 框架的出现很好的解决了这一系列的问题,封装了完整了网络传输处理逻辑,不仅更高效,而且更安全。

RPC 的全称是 Remote Procedure Call,即远程过程调用。

简单解读字面上的意思就是能够屏蔽掉网络编程中的细节,实现调用远程方法就跟调用本地方法一样体验,开发人员无需关注与业务无关的事情。

RPC 的主要做用体现在下面两个方面:

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

除此之外,RPC 框架的引入,还能为项目带来别的收益:

RPC 通信流程

理解了 RPC 解决了什么问题,以及什么是 RPC,那么我们进一步来学习一下 RPC 框架的流程。

首先,RPC 作为远程过程调用,那么就必然有一个调用方(Comsumer),和一个被调用方(Provider)。另外“远程”强调了这个调用过程发生在网络传输中,RPC 常用于业务系统之间的数据交互,需要保证它的可靠性,所以 RPC 一般都是基于 TCP 来传输的。

而数据在网络中都是以二进制的形式传输的,但是我们在编写程序代码的时候都是通过对象进行数据交互的。这些对象肯定是没有办法直接在网络中传输的,要先经过一次特殊的编码形式,(可以暂且这么理解),然后转换成二进制再进行传输,同时这编码转换形式还要求是可逆的,当数据传输到被调用方服务的时候,需要能够反编码解析出原来的数据结构对象,进一步完成服务调用。这个特殊的编解码就叫做“序列化与反序列化”。

但是在这里有一个疑问了:经过序列化后的数据都变成了二进制,那么 RPC 框架怎么知道这些二进制数据从哪里来,到哪里去呢?

在这里需要我们先约定好数据格式的内容,我们管这个约定好的格式内容叫做“协议”,一般协议分成两个部分:数据头消息体

数据头里面一般放的是:协议标识、数据大小、请求类型、序列化类型等信息;
消息体里面主要是请求的业务参数信息和扩展属性等。

根据协议格式,服务提供方在收到二进制数据的时候,就能够正确地从二进制数据中分割出不同的请求来,同时根据请求类型和序列化类型,把二进制的消息体逆向还原成请求对象。

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

现在我们再进一步思考一下:是否上面的流程就已经能够组成一个完成的 RPC 了?

其实还不够,一个成熟的框架一定要满足简单易用的条件,最好能做到开箱即用。

那么现阶段的还是需要开发人员自己去写代码构造请求、调用序列化、进行网络传输等等,还是比较复杂,不够友好。

那么是否能够更进一步简化整个调用过程呢?怎样才能做到跟调用本地方法一样简单粗暴呢?

熟悉系统设计的小伙伴们都知道:面向接口编程能够更大程度的解耦,降低模块之间的依赖性。那么我们拓展思考一下,服务调用方只要依赖业务接口去进行服务调用,而服务提供方则针对业务接口进行编码实现。在调用方和被调用方之间是如何跨网络实现的,这完全是 RPC 框架帮我们做到的。

那么问题来了:这个过程怎么实现呢?

Spring 给了我们很好的启示,AOP 技术的核心是采用动态代理,通过字节码增强对方法进行拦截增强,以便于增加需要的额处理逻辑。

下面是一个简单的 RPC 框架处理流程:
RPC 处理流程

总结

RPC 框架能够帮助我们解决系统拆分后的通信问题,并且能够让我们像调用本地一样去调用远程方法。

本次我们主要讲了为什么要学习 RPC ,RPC 的主要解决了什么问题,以及 RPC 的通信原理。本质上,RPC 就是提供了一种透明机制,让使用者不必显式的区分本地调用和远程调用。

虽然 RPC 能够使得远程调用更方便,但是毕竟还是涉及到网络通信,所以跟本地方法还是有很多区别的,这些区别我们放在下一篇文章中再来仔细讨论吧。

欢迎搜索关注柴柴爱Coding微信公众号,这里有 免费的学习资源、全方位的进阶路线、各岗位面试资源、程序设计源码 一只会Coding的柴柴等你哦~

标签:解释,调用,服务,框架,二进制,RPC,TMD,序列化
来源: https://blog.csdn.net/wuruofeng1314/article/details/123172304