ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

给我解释解释什么TMD叫RPC

2022-02-27 22:59:45  阅读:186  来源: 互联网

标签:解释 调用 服务 框架 二进制 RPC TMD 序列化


说到 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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有