首页 > 其他分享 >远程过程调用协议RPC

远程过程调用协议RPC

时间:2023-07-03 10:33:38浏览次数:38  
标签:调用 RPC 存根 序列化 远程 服务端 客户端

RPC | RPC协议介绍及原理详解

原创 HughCoding 后端技术解忧铺 2023-06-11 12:26 发表于北京 收录于合集 #网络安全3个 #Spring技术框架系列22个 #JAVA核心技术系列45个 后来音乐:刘若英

图片

RPC框架

介绍

概念

  1. RPC(Remote Procedure Call Protocol) 远程过程调用协议。
  2. RPC是一种通过网络从远程计算机程序上请求服务,不需要了解底层网络技术的协议。
  3. RPC主要作用就是不同的服务间方法调用就像本地调用一样便捷。

常用RPC技术或框架

  1. 应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
  2. 远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
  3. 通信框架:MINA 和 Netty

主流的gRPC、Thrift、Dubbo

  1. gRPC:gRPC是Google开源软件,gRPC是基于HTTP2.0协议,而HTTP2.0是基于二进制的HTTP协议升级版本,底层使用Netty框架支持。
  2. Thrift:Thrift是Facebook开源项目,其是一个跨语言的服务开发框架。用户只需在进行二开即可,对底层的RPC通讯透明。
  3. Dubbo:Dubbo是阿里开源组件协议和序列化框架都可以插拔,依托Spring框架开发,远程接口是基于Java接口,适用于微服务架构。

为什么要有RPC?

  1. 服务化:微服务化,跨平台的服务之间远程调用;
  2. 分布式系统架构:分布式服务跨机器进行远程调用;
  3. 服务可重用:开发一个公共能力服务,供多个服务远程调用。
  4. 系统间交互调用:两台服务器A、B,服务器A上的应用a需要调用服务器B上的应用b提供的方法,而应用a和应用b不在一个内存空间,不能直接调用,此时,需要通过网络传输来表达需要调用的语义及传输调用的数据。

使用场景

  1. 大型网站:内部涉及多个子系统,服务、接口较多。
  2. 注册发现机制:如Nacos、Dubbo等,一般都有注册中心,服务有多个实例,调用方调用的哪个实例无感知。
  3. 安全性`:不暴露资源。
  4. 服务化治理:微服务架构、分布式架构。

架构

架构图

图片RPC架构图

一次RPC调用流程

图片RPC调用流程
  1. 客户端(Client)通过本地调用的方式调用服务(以接口方式调用);
  2. 客户端存根(Client Stub)接收到调用请求后负责将方法、入参等信息进行组装序列化成能够进行网络传输的消息体(将消息体对象序列化为二进制流);
  3. 客户端存根(Client Stub)找到远程的服务地址,并且将消息通过网络发送给服务端(通过sockets发送消息);
  4. 服务端存根(Server Stub)收到消息后进行反序列化操作,即解码(将二进制流反序列化为消息对象);
  5. 服务端存根(Server Stub)通过解码结果调用本地的服务进行相关处理;
  6. 服务端(Server)本地服务业务处理;
  7. 服务端(Server)将处理结果返回给服务端存根;
  8. 服务端存根(Server Stub)序列化处理结果(将结果消息对象序列化为二进制流);
  9. 服务端存根(Server Stub)将序列化结果通过网络发送至客户端(通过sockets发送消息);
  10. 客户端存根(Server Stub)接收到消息,进行反序列化解码(将结果二进制流反序列化为消息对象);
  11. 客户端得到最终的结果。

核心功能

重要组成

  1. 客户端:Client,服务调用方。
  2. 客户端存根:Client Stub,存放服务端地址信息,将客户端的请求参数数据信息打包成网络消息,再通过网络传输发送给服务端。
  3. 服务端存根:Server Stub,接收客户端发送过来的请求消息并进行解包,然后再调用本地服务进行处理。
  4. 服务端:Server,服务的真正提供者。
  5. newtwork service:底层传输,tcp或http

 

功能实现

  功能实现主要分为服务寻址、序列化和反序列化、网络传输功能。

服务寻址功能

Call ID映射
  1. 本地:在本地方法调用中,函数体是直接通过函数指针来指定的,但是在远程调用中,由于两个进程的地址空间完全不一样,函数指针不起作用。
  2. 远程:RPC中所有函数或方法都有自己的一个ID,在所有进程中都唯一。客户端在做远程过程调用时,必须附上这个ID,即客户端会查一下表,找出相应的Call ID,然后传给服务端,服务端也会查表,来确定客户端需要调用的函数,然后执行相应函数的代码。
  3. Call ID映射表一般是一个哈希表。
技术示例

需要通过服务注册中心去查询对方服务有哪些实例。

  1. Nacos整合OpenFeign实现RPC调用。
  2. Spring Cloud集成Dubbo实现RPC调用。

序列化和反序列化功能

概述
  1. 序列化:将消息对象转换为二进制流。
  2. 反序列化:将二进制流转换为消息对象。
必要性
  1. 远程调用涉及到数据的传输,在本地调用中,只需要将数据压入栈中,然后让函数去栈中读取即可。
  2. 但远程的数据传输,由于客户端和服务端不在同一个服务器上,涉及不同的进程,不能通过内存传递参数,此时就需要将客户端先将请求参数转成字节流(编码),传递给服务端,服务端再将字节流转为自己可读取格式(解码),这就是序列化和反序列化的过程。反之,服务端返回值也逆向经历序列化和反序列化到客户端。
序列化的优势
  1. 将消息对象转为二进制字节流,便于网络传输。
  2. 可跨平台、跨语言。如Python编写的客户端请求序列化参数传输到Java编写的服务端进行反序列化。

网络传输功能

作用
  1. 客户端将Call ID和序列化后的参数字节流传输给服务端。
  2. 服务端将序列化后的调用结果回传给客户端。
协议

  主要有TCP、UDP、HTTP协议。

TCP协议
  1. 客户端和服务端建立Socket连接。
  2. 客户端通过Socket将需要调用的接口名称、方法名称及参数序列化后传递给服务端。
  3. 服务端反序列化后再利用反射调用对应的方法,将结果返回给客户端。
HTTP
  1. 客户端向服务端发送请求,如GET、POST、PUT、DELETE等请求。
  2. 服务端根据不同的请求参数和请求URL进行方法调用,返回JSON或者XML数据结果。
TCP和HTTP对比
  1. 基于TCP协议实现的RPC调用,由于是底层协议栈,更佳灵活的对协议字段进行定制,可减少网络开销,提高性能,实现更大的吞吐量和并发数。但,底层复杂,实现代价高。
  2. 基于HTTP协议实现的RPC调用,已封装实现序列化,但HTTP属于应用层协议,HTTP传输所占用的字节数比TCP更高,传输效率对比TCP较低。

RPC与Restful API对比

侧重不同

  1. RPC侧重于操作
  2. Restful侧重于资源

传输效率

  1. RPC效率更高,可自定义TCP协议,控制请求报文体积。
  2. Restful效率更低,基于HTTP协议。

复杂度

  1. RPC实现复杂,需关注服务寻址、序列化和反序列化及网络传输,调用流程繁琐。
  2. Restful实现简单,无需关注序列化和反序列化、网络传输,调用流程便捷。

使用场景

  1. RPC适用于公司内部服务调用,如部门之间不同平台的服务调用,性能消耗低,传输效率高,实现复杂一些。
  2. HTTP主要用于外部异构环境,浏览器接口调用、第三方接口调用等。

【每篇微语】能点醒一个人的从来不是说教,而是磨难!

 

HughCoding

赞赏二维码喜欢作者

收录于合集 #网络安全  3个 上一篇安全 | 聊一聊网络安全下一篇网络安全 | 密码基础知识介绍 阅读原文 阅读 1190   后端技术解忧铺 98篇原创内容  

标签:调用,RPC,存根,序列化,远程,服务端,客户端
From: https://www.cnblogs.com/cherishthepresent/p/17522121.html

相关文章

  • Oracle listener 远程投毒漏洞:
    问题说明:就是listener是否允许远程随意注册的意思解决方案:通过oracle自身的设置允许注册的机器(名字、或ip)来限制非法注册 解决:合理配置:listener.oraVALID_NODE_CHECKING_REGISTRATION_LISTENER=ONVALID_NODE_CHECKING_REGISTRATION_LISTENER_SCAN1=ONREGISTRATION_......
  • Linux|常用命令|SSH远程执行Shell
    #bash/python命令语法#ssh语法同bash/python不同,避免混淆bashscript.shparams4scriptpythonscript.pyparams4scriptbash-c""bash-c''python-c''python-c""一行和多行只是写法不同打包成函数和文件没有本质区别注意Shell会解释输入,转译字符、变量生效推......
  • 使用 ABAP 调用 Adobe Document Service 生成 PDF 文档
    我以前在SAP成都研究院BYDForm开发团队工作过5年,负责BYDBO输出成PDF的功能开发。AdobeDocumentService(ADS)是SAPNetWeaverASJava堆栈的一部分,提供了用于创建和处理PDF文件的功能。在ABAP系统中,可以通过调用ADS服务来生成和处理PDF文档。这种集成使得ABAP开发人员能......
  • ES 中文分词器ik及自定义远程词库
    ik分词器安装部署 下载地址:https://github.com/medcl/elasticsearch-analysis-ik注意es和ik分词器的版本匹配.这里下载7.9.3的ik分词器下载完毕之后去es的工作目录的plugins文件夹下新建ik文件夹,将下载下来的ik压缩包解压缩至ik文件夹下,重启e   词库介绍ik分词器主......
  • @Transactional失效——同一个类中方法调用导致,解决方案!
    同一个类中方法调用,导致@Transactional失效开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错......
  • 文章发布审核——同步调用与异步调用
    同步:就是在发出一个调用时,在没有得到结果之前,该调用就不返回(实时处理)异步:调用在发出之后,这个调用就直接返回了,没有返回结果(分时处理)发布文章——》异步调用——》审核文章异步线程的方式审核文章 SpringBoot集成异步线程调用:①:在自动审核的方法上加上@Async注解(标明要异步......
  • GO语言调用外部函数失败总结
    目录GO练习的项目结构Q1导入的是空路径Q2导入的路径不全Q3找不到路径A3Q4函数不可调用A4Q5报错UseasvalueA5GO练习的项目结构@:~/goProject/test.cn$tree.├──go.mod├──main.go└──model  └──mysql.go1directory,3filesQ1导入的是空路径......
  • 项目推到远程github上
    【1】进入到项目的文件夹中;【2】gitinit ;【3】gitadd.【4】gitcommit-m'basicJDBC+CRUD'【5】gitremoteaddoriginhttps://github.com/HanChun/Practice_Basic_CRUD-JDBC.git【6】gitpush-uoriginmaster姓名:hanchuntoken:主要出现问题的点:token的权限范围,......
  • Vim学习笔记2--录制宏,调用宏
    1.VIM编辑器--录制宏调用宏录制宏qa进入宏记录模式,a为宏名shift+w移到词首i.escshift+ei()escq退出宏记录调用宏@a使用宏名为a的宏@前加数字表示重复操作的次数 2.VIM编辑器--文本替换r替换:1,$s;a;b;gc(:1,$sa;b;gc)高级进阶用法:100,200s/1/2/gc含义:vim......
  • 【分布式技术专题】「分布式技术架构」实践见真知,手把手教你如何实现一个属于自己的RP
    RPC是什么RPC(RemoteProcedureCall,远程过程调用)是一种计算机通信协议,它允许一个程序调用另一个程序所在的远程计算机上的子程序(或函数)而不需要自己的代码去处理远程调用的细节。RPC的应用RPC技术应用广泛,特别是在分布式系统中。比如,在Web开发中,有时需要从后端服务器请求数据,此时......