RPC远程协议之原理分析
在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,RPC远程协议扮演关键作用。实际上,在日常工作中,我们也多多少少使用过RPC协议方案,对于初级的程序员来说,RPC显得很神秘,而经验丰富些的程序员虽可使用,但对其工作原理理解的并不是很深刻,往往会误用,这里就我理解来详细介绍下。
l RPC是什么
l RPC工作流程
l RPC实现内容
l RPC结构分析
一、RPC是什么
RPC(Remote Procedure Call),是一种远程过程调用的协议方案,其本身是一种借助于网络来实现不同机子或应用之间跨进程通信的,不是一个实现框架,即并非是一个拿来即用的框架。目前,比较主流使用的RPC开源框架有谷歌的gRPC,Facebook的Thrift,阿里的Dubbo,开源SpringCloud,以及Spring的RMI等均基于RPC协议方案实现了远程过程功能的使用,虽实现方式不同,但原理却大同小异。接下来,介绍下RPC的工作流,RPC实现需要做的事情,以及几种常见RPC框架的主要异同点对比。
二、RPC工作流程
RPC是基于典型的C/S模式的远程调用方案,分为客户端(Caller)和服务端(Callee)。Caller负责调用远程的服务,而Callee则负责提供服务功能,并暴露给使用者Caller,这在现今的微服务架构中很常见,而RPC基本概念化工作流如下:
1、Client发起远程调用时,是通过Client-stub实现的;
2、Client-stub接受Client调用通知后,负责将调用的接口、方法及参数,按照约定的协议规范进行编码存根;
3、本地RPCRuntime负责远程传输在Client-stub中编码的数据包;
4、远程RPCRuntime接收到消息请求后,将其传递给Server-stub,由其负责解码处理,然后发起本地调用,完成具体服务功能并返回结果给Client。
从上面流程看,认为RPC的实现比较简单,其实不然。在整个RPC概念过程中,有很多事情要做,比如:是否跨语言支持,网络传输的性能与协议,数据包编解码以及异常恢复处理等,不简单了吧!具体请往下俯瞰。
三、RPC实现内容
通过上面的介绍,我们应该知道RPC是什么,以及它的工作流程是怎样的,那么有人问RPC是一个协议方案,该如何设计昵?答案在下面揭晓,我们需要实现下面几点内容:
1、两端的Stub生成策略,是手动还是自动生成,前者较麻烦,后者可借助使用生成工具生成,如:Thrift本身提供的工具;
2、是否支持跨语言平台,也就是不同语言的无缝兼容,一般都是通过IDL来声明接口文件实现跨语言;
3、网络传输协议格式约定,可采用消息头和消息体的方式,一般采用消息头存放元数据,消息体存放消息内容;
4、网络传输采用的协议类型,主流的RPC框架采用了Socket较多,而也有基于HTTP协议的RPC框架,如:谷歌的gRPC采用HTTP2.0;
5、在高并发时,两端交互时是否支持异步/同步多线程的通信机制;
6、异常处理要注意:本地执行一定会执行,但远程调用则不一定执行,可能因为网络问题未能送达到服务方。另外,本地调用只会抛出接口声明异常,而远程调用还会抛出RPC框架异常,同时本地和与远程调用的性能消耗可能差距较大,这取决于RPC固有消耗所占比重。
正如上面,既然有这么多工作要做,那么全部交给开发人员来完成,则需要若干天时间成本,即使跑通流程,也未必稳定,所以实际使用时,我们会借助于强大的开源框架来实现,正如在本章开头部分所描述的内容。
四、RPC结构分析
上面比较粗略地介绍了RPC的工作流程,接下来对RPC协议方案的结构进行拆分,更加清楚了解RPC的工作原理细节,这样在接触主流的RPC开源框架时,更加游刃有余,具体如下所示:
RPC服务方通过RpcServer导出(export)远程接口方法,供客户端通过RpcClient引入(import)该远程接口方法。这样客户端就可以调用引入的远程API了,然后调用该接口方法,跟调用远程接口方法一样,RPC框架提供接口的代理实现,实际的调用委托给了RpcProxy,而该代理封装调用信息并将调用转交给RpcInvoker实际执行调用。在客户端的RpcInvoker通过RpcConnector维持与服务端RpcChannel,并使用RpcChannel进行协议编码(encode),并将编码后的请求消息借助通道发送给服务方。
RPC服务端接收器RpcAcceptor接收客户端的调用请求,同时使用RpcProtocol进行协议解码(decode)。解码后的调用信息交给RpcProcessor来控制调用逻辑,最后将调用信息传递给RpcInvoker实际执行调用并返回结果给客户端。
好了,到这里我已经介绍了RPC的基本概念,工作流程,在设计RPC时需要做的几件事,以及RPC的结构实现分析。那么,在后续的文章中,会继续介绍RPC的常用开源框架的使用及分析。
原文:https://blog.csdn.net/why_2012_gogo/article/details/79425338
RPC远程协议之原理分析的更多相关文章
- RPC远程协议之Thrift入门
在上一篇文章<RPC远程协议之原理分析>中,我介绍了RPC的工作原理及欲实现RPC框架功能应该做哪些事情,因为要做的事情太多,完全由开发人员研发实现,不是很现实,所以市面上出现了诸多RPC ...
- Android 学习笔记之WebService实现远程调用+内部原理分析...
PS:终于可以抽出时间写写博客了,忙着学校的三周破实训外加替考...三周了,没怎么学习...哎... 学习内容: 1.WebService 实现远程方法的调用 什么是WebService... ...
- 深入理解HTTP协议及原理分析
1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...
- 深入理解HTTP协议及原理分析之缓存(3种缓存机制)
3.2 缓存的实现原理 3.2.1什么是Web缓存 WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果 ...
- http协议及原理分析 1
1:200与304的区别 浏览器第一次加载成功返回200状态,并会在浏览器的缓存中记录下 max-age 这个值.第二次发起服务器的访问时 会先看缓存中有没有要加载的资源 如果有 再去看有没有超出 m ...
- Java 远程通讯技术及原理分析
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...
- Java远程通讯技术及原理分析
在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...
- SPI协议及工作原理分析
说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...
- OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法
OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...
随机推荐
- 使用TensorRT集成推理inference
使用TensorRT集成推理inference 使用TensorRT集成进行推理测试. 使用ResNet50模型对每个GPU进行推理,并对其它模型进行性能比较,最后与其它服务器进行比较测试. ResN ...
- TensorRT Analysis Report分析报告
TensorRT Analysis Report 一.介绍 TensorRT是一个高性能的深度学习推理(Inference)优化器,可以为深度学习应用提供低延迟.高吞吐率的部署推理.TensorRT可 ...
- 自然语言推理:微调BERT
自然语言推理:微调BERT Natural Language Inference: Fine-Tuning BERT SNLI数据集上的自然语言推理任务设计了一个基于注意力的体系结构.现在通过微调BE ...
- springcloud-config配置异常Cannot clone or checkout repository 和 Authentication is required but no CredentialsProvider has been registered解决过程
Cannot clone or checkout repository, 出现这个异常,通过检查是因为自己本地没有配置 ssh,所以配置了, https://blog.csdn.net/zy_2818 ...
- 【VBS】获取文件夹大小
文件截图: 运行结果: 第一步:编写脚本 GetFloderSize.vbs 1 '获得文件夹的大小 by 王牌飞行员(https://www.cnblogs.com/KMould/p/1233481 ...
- 如何基于 String 实现同步锁?
如何基于String实现同步锁? 在某些时候,我们可能想基于字符串做一些事情,比如:针对同一用户的并发同步操作,使用锁字符串的方式实现比较合理. 因为只有在相同字符串的情况下,并发操作才是不被允许的. ...
- 如何基于MindSpore实现万亿级参数模型算法?
摘要:近来,增大模型规模成为了提升模型性能的主要手段.特别是NLP领域的自监督预训练语言模型,规模越来越大,从GPT3的1750亿参数,到Switch Transformer的16000亿参数,又是一 ...
- xshell远程连接另一台电脑的数据库,启动图形失败
1.用xshell远程连接数据库10.62.207.152,且用oracle用户直接登陆 2.执行:netca 报错: Oracle Null Service Configuration: Error ...
- Go语言十六进制转十进制
Go语言十六进制转十进制 代码Demo import ( "fmt" "strconv" "testing" ) func Test_1(t ...
- python画图库及函数,绘制图片从文件提取出来的数据集转化为int,不然作为坐标轴的时候因为是字符串而无法排序
转化int: