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

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

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

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

RPC 能解决什么问题 ?

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

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

下面是一个网络互连的七层模型和五层模型对应关系,一般我们进行程序开发都是在应用层面进行的,如果没有 RPC 框架,那么开发人员就要自己编写应用层下面的 :传输层、网络层、数据链路层以及物理层的一些对应处理逻辑。

可想而知,如果让一个开发程序员去过多的关注一些底层实现原理,是一件成本很高的事情,一般企业都是以业务为主的。

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

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

给我解释解释什么TMD叫RPC相关推荐

  1. 快过年了,来,来,来!给七大姑八大姨好好解释解释【啥是DBA 】

    摘要:快过年了,我突然有点芳~又得给七大姑八大姨好好解释解释[啥是DBA] "二狗子,你在城里干啥子的哟?" "二姨,我是做数据库运维的,DBA" " ...

  2. 你给我解释解释,为什么TMD非得选择SpringCloud alibaba作为微服务开发框架?

    什么是微服务 提到微服务不得不提Martin Fowler在2014年3月25日发表的文章 Microservices,里面给出了微服务的定义.后续国内所有关于微服务的介绍都是基于这篇文章的翻译,或加 ...

  3. 回归分析结果表格怎么填_spss回归分析结果图,帮忙看一下,麻烦详细地解释解释...

    优质回答 回答者:jayjay R平方就是拟合优度指标,代表了回归平方和(方差分析表中的0.244)占总平方和(方差分析表中的0.256)的比例,也称为决定系数.你的R平方值为0.951,表示X可以解 ...

  4. 一周爆肝上线百万高并发系统!你给我解释解释什么叫牛逼?

    作者:木子鱼皮 链接:https://www.nowcoder.com/discuss/368998 本文是个人(腾讯广告全栈毕业生)从零开始一周紧急上线百万高并发系统的相关经验.思路及感悟,在此记录 ...

  5. 给老板解释解释,为什么要用SpringCloud alibaba作为微服务开发框架???

    什么是微服务 提到微服务不得不提Martin Fowler在2014年3月25日发表的文章 Microservices,里面给出了微服务的定义.后续国内所有关于微服务的介绍都是基于这篇文章的翻译,或加 ...

  6. 一周上线百万高并发系统!你给我解释解释什么叫牛逼?

    本文是个人(腾讯广告全栈毕业生)从零开始一周紧急上线百万高并发系统的相关经验.思路及感悟,在此记录分享. 后续持续更新,欢迎先

  7. Vue2.0+vuex+H5实现音乐播放及歌曲切换功能的方法及原理解释

    最近在用mint-ui重写一个vue.js音乐App项目,做到播放器模块,感觉挺有意思,记录一下播放器歌曲播放及歌曲切换功能实现方法及原理. 先上一张运行效果图(歌词尚未抓取.播放进度条及时间尚未开发 ...

  8. 区块如何防篡改_区块链数据不可篡改的详细解释

    区块链数据不可篡改的详细解释 背景介绍 本人新人一枚,学习区块链的过程中,在网上看到了很多讨论区块链区块数据不可篡改的文章,以比特币为例哈,主要存在2种解释: 解释1:由于哈希指针的存在,假设存在某节 ...

  9. 计算机一级解释,独家秘笈计算机一级错题解释.ppt

    文档介绍: 第一套4.在windows中,错误的新建文件夹的操作是(C)A.在"我的电脑"的某驱动器或用户文件夹窗口中,单击"文件"菜单中的"新建&q ...

最新文章

  1. Android TrafficStats类的使用
  2. 关于final局部变量引用的研究
  3. 前端的面试之旅(一)
  4. Alpine Linux 中的 apk 命令讲解
  5. 【git】【eclipse】记住密码/密码保存在哪里?
  6. Linux下内存问题检测神器 valgrind
  7. mysql redis 中间件_Docker快速搭建Mysql社区版,Redis,MongoDb、MQ等等中间件。
  8. airplay2协议是什么_什么是AirPlay?
  9. UiPath实践经验总结(二)
  10. 【MYSQL快速入门】常用函数:文本函数
  11. 【应用回归分析】一元简单线性回归显著性检验,t检验和F检验统计量抽样分布推导
  12. 笔记-5:mysql数据更新
  13. 京东API、获得JD商品详情API调取数据部分代码展示
  14. 第三方支付公司怎么收取手续费
  15. 如何在PPT中对文字进行错位排版
  16. 微信支付-浅谈普通商户和子商户的开发区别
  17. 关于ping以及TTL的分析
  18. 用centos搭建一个简单的求生之路2服务器(用于好友联机降低延迟,不包含插件)
  19. c# 如何抓微信把柄_C#手把手教你玩微信自动化
  20. Angr 从入门到放弃(二)

热门文章

  1. C语言根据输入年份和月份来判断该月的天数?(switch)
  2. linux 查看pid 程序,linux 查看pid
  3. 大数据| 数据可视化学习-高德地图可视化工具
  4. 特征向量矩阵,特征值矩阵,矩阵的对角化分解
  5. 准Z源光伏并网系统MATLAB仿真模型,采用了三次谐波注入法SPWM调制
  6. 验证服务器端口telnet,telnet命令测试服务器端口是否通的办法
  7. chatGPT的谷歌浏览器Monica插件的使用
  8. 小白初入江湖,发发感想。多多关照。
  9. 鸿蒙之境怎么解锁,影之刃3明眸皓齿之境怎么开 解锁副本步骤详解
  10. 基于Pytorch的机器学习Regression问题实例(附源码)