一、什么是 RPC?

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

功能:

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

二、RPC 通信流程

发起调用请求的那一方叫做调用方,被调用的一方叫做服务提供方。RPC 一般默认采用 TCP 来传输。我们常用的 HTTP 协议也是建立在 TCP 之上的。

RPC 的通讯流程:序列化 --->  网络传输 ---> 反序列化

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

更上一层楼,其中简化 API,屏蔽掉 RPC 细节,让使用方只需要关注业务接口也是关键(可以参考AOP 技术)。

AOP 技术:采用动态代理的技术,通过字节码增强对方法进行拦截增强,以便于增加需要的额外处理逻辑。

RPC 的通讯就变成流程:动态代理 ---> 序列化 --->  网络传输 ---> 反序列化 ----> 执行  

RPC 是解决应用间通信的一种方式,而无论是在一个大型的分布式应用系统还是中小型系统中,应用架构最终都会从“单体”演进成“微服务化”,整个应用系统会被拆分为多个不同功能的应用,并将它们部署在不同的服务器中,而应用之间会通过 RPC 进行通信,可以说 RPC 对应的是整个分布式应用系统,就像是“经络”一样的存在

RPC 框架能够帮助我们解决系统拆分后的通信问题,并且能让我们像调用本地一样去调用远程方法。利用 RPC 我们不仅可以很方便地将应用架构从“单体”演进成“微服务化”,而且还能解决实际开发过程中的效率低下、系统耦合等问题,这样可以使得我们的系统架构整体清晰、健壮,应用可运维度增强。当然 RPC 不仅可以用来解决通信问题,它还被用在了很多其他场景,比如:发 MQ、分布式缓存、数据库等。

上面的图不能表达所有的情况,但是能说明 RPC 的框架。

一句话概括: RPC 是我们最“熟悉的陌生人”。

三、设计协议

这样整个协议就会拆分成两部分:协议头和协议体。

  1. 协议头:协议长度、序列化方式,还会放一些像协议标示、消息 ID、消息类型这样的参数。
  2. 协议体:接口方法、请求的业务参数值和一些扩展属性。

可以扩展的协议:

整体协议就变成了三部分内容:固定部分、协议头内容、协议体内容,前两部分我们还是可以统称为“协议头”

四、序列化

序列化就是将对象转换成二进制数据的过程,而反序列就是反过来将二进制转换为对象的过程。

常用的序列化

  • JDK 原生序列化
  • JSON
  • Hessian
  • Protobuf

如何选择序列化?

首先可能想到的是性能和效率,还有空间开销,也就是序列化之后的二进制数据的体积大小。序列化协议的通用性和兼容性,序列化后的字节数据体积越小,网络传输的数据量就越小,传输数据的速度也就越快。

RPC 框架的过程中,构造入参、返回值对象,注意的问题:

  • 对象要尽量简单,没有太多的依赖关系,属性不要太多,尽量高内聚;
  • 入参对象与返回值对象体积不要太大,更不要传太大的集合;
  • 尽量使用简单的、常用的、开发语言原生的对象,尤其是集合类;
  • 对象不要有复杂的继承关系,最好不要有父子类的情况。

五、网络通讯

网络 IO 模型:

  • 同步阻塞 IO(BIO)
  • 同步非阻塞 IO(NIO)
  • IO 多路复用
  • 异步非阻塞 IO(AIO)

最常用的就是同步阻塞 IO 和 IO 多路复用。

同步阻塞 IO:

应用进程发起 IO 系统调用后,应用进程被阻塞,转到内核空间处理。之后,内核开始等待数据,等待到数据之后,再将内核中的数据拷贝到用户内存中,整个 IO 处理完毕后返回进程。最后应用的进程解除阻塞状态,运行业务逻辑。这里我们可以看到,系统内核处理 IO 操作分为两个阶段——等待数据和拷贝数据。

IO 多路复用:

多路就是指多个通道,也就是多个网络连接的 IO,而复用就是指多个通道复用在一个复用器上。当用户进程调用了 select,那么整个进程会被阻塞。同时,内核会“监视”所有的 socket,当任何一个 socket 中的数据准备好了,select 就会返回。这个时候用户进程再调用 read 操作,将数据从内核中拷贝到用户进程。

什么是零拷贝?

所谓的零拷贝,就是取消用户空间与内核空间之间的数据拷贝操作。零拷贝有两种解决方式,分别是 mmap+write 方式和 sendfile 方式,mmap+write 方式的核心原理是通过虚拟内存来解决的。

五、动态代理

Spring AOP:

就是采用动态代理技术,通过对字节码进行增强,在方法调用的时候进行拦截,以便于在方法调用前后,增加我们需要的额外处理逻辑 。

参考:https://www.cnblogs.com/joy99/p/10941543.html

RPC 会自动给接口生成一个代理类,当我们在项目中注入接口的时候,运行过程中实际绑定的是这个接口生成的代理类。这样在接口方法被调用的时候,它实际上是被生成代理类拦截到了,这样我们就可以在生成的代理类里面,加入远程调用逻辑。

动态代理可以从这样三个角度去考虑:

  • 生成的字节码越小,运行所占资源就越小。
  • 以每次调用接口方法的时候,都执行生成的代理类,这时生成的代理类的执行效率就需要很高效。
  • 选择一个使用起来很方便的代理类框架:API 设计是否好理解、社区活跃度、还有就是依赖复杂度等等。

RPC 开发系列一:RPC 基本介绍相关推荐

  1. openresty开发系列10--openresty的简单介绍及安装

    openresty开发系列10--openresty的简单介绍及安装 一.Nginx优点 十几年前,互联网没有这么火,软件外包开发,信息化建设,帮助企业做无纸化办公,收银系统,工厂erp,c/s架构偏 ...

  2. ABP开发框架前后端开发系列——框架的总体介绍

    ABP开发框架前后端开发系列--框架的总体介绍 ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架. ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领 ...

  3. Liferay7开发系列(一)介绍 liferay版本:7.1.2

    Liferay portal介绍 它提供了一个强大的平台,可以快速构建您的网站,并为所有客户(无论是台式机.移动设备或两者之间的任何设备)提供服务:它提供了您在网站上运行所需的所有标准应用程序:它为新 ...

  4. 树莓派开发系列教程1——树莓派介绍

    1.树莓派是什么?         Raspberry Pi(中文名为"树莓派",简写为RPi,或者RasPi/RPi)是为学生计算机编程教育而设计,只有信用卡 大小的卡片式电脑, ...

  5. 淘宝API开发系列--商家的绑定2

    在上篇<淘宝API开发系列--开篇概述>介绍了下淘宝API平台的一些基本知识,由于一直有事情忙,就没有及时跟进随笔的更新,本篇继续讨论淘宝API的开发知识,主要介绍商家的绑定操作.上篇我们 ...

  6. Solidworks二次开发系列入门1

    Solidworks二次开发系列入门1 基本介绍 基本介绍 SolidWorks二次开发其实就是使用API函数对SolidWorks设计中一些重复繁琐的工作让计算机代替完成,起到辅助设计的作用. So ...

  7. 远程过程调用失败_Java开发大型互联网RPC远程调用服务实现之问题处理方案

    引言 RPC(Remote Procedure Call Protocol)--远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议.RPC协议假定某些传输协议 ...

  8. Go官方库RPC开发指南

    Go官方提供了一个RPC库: net/rpc.包rpc提供了通过网络访问一个对象的方法的能力.服务器需要注册对象, 通过对象的类型名暴露这个服务.注册后这个对象的输出方法就可以远程调用,这个库封装了底 ...

  9. openresty开发系列13--lua基础语法2常用数据类型介绍

    openresty开发系列13--lua基础语法2常用数据类型介绍 一)boolean(布尔) 布尔类型,可选值 true/false: Lua 中 nil 和 false 为"假" ...

  10. openresty开发系列12--lua介绍及常用数据类型简介

    openresty开发系列12--lua介绍及常用数据类型简介 lua介绍   1993 年在巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de ...

最新文章

  1. maven私有库搭建
  2. C#学习之三层架构实例
  3. 二分搜索 POJ 3273 Monthly Expense
  4. 万网mysql中文乱码_Linux下MySQL出现乱码的解决方法-阿里云开发者社区
  5. 2008,人力资源软件是否还依然
  6. 在html中怎样使用%3c符号,5个JavaScript和9个JQuery经典面试题
  7. 基于WebSocket的web聊天室
  8. 图像迁移风格保存模型_图像风格迁移原理
  9. 深度解析京东个性化推荐系统演进史
  10. 《区块链 Web3.0程序该跑在哪里?》 国盛证券
  11. 机器学习——算法介绍-4
  12. 网恋中在拿谁的情感玩游戏
  13. 语音邮件 voice mail 概述
  14. MAYA oceanShader/海洋(纹理)
  15. java判断白天黑夜,获取Java中的所有夜晚时间
  16. 安兔兔电脑ssd测试软件,不服跑个分?安兔兔推出了一款固态硬盘测速软件
  17. HAL库学习之串口通信
  18. 如何使用powertoys全盘搜索文件
  19. 苹果4是android吗,呵呵!原来苹果手机有这么多缺点,你想换安卓吗?
  20. 数据压缩作业2.1 多媒体文件分析——TGA文件

热门文章

  1. [转载]项目风险管理七种武器-长生剑
  2. 机器学习之十大经典算法(九)EM算法
  3. python输入名字配对情侣网名_名字匹配度情侣,打出自己的名字和对象的名字
  4. 生日悖论分析python_Python数据分析养成记4——预测泰坦尼克号生存概率
  5. Benzoic acid,4-(((diphenylamino)carbonyl)oxy)-3-nitro,2-硝基-4-羧基苯基-N,N-氨基甲酸二苯酯,2-Ncdc
  6. 计算机课小组主题作业,小组作业软件工程课程设计(选作).doc
  7. 《星际穿越》关于时间与空间的思考
  8. 宋九九:怎么做好网站搜索引擎优化,企业网站如何seo优化?
  9. springboot JWT Token 自动续期的解决方案
  10. Python从入门到数据分析第一篇—Python简介- Python介绍与初探