在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,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远程协议之原理分析的更多相关文章

  1. RPC远程协议之Thrift入门

    在上一篇文章<RPC远程协议之原理分析>中,我介绍了RPC的工作原理及欲实现RPC框架功能应该做哪些事情,因为要做的事情太多,完全由开发人员研发实现,不是很现实,所以市面上出现了诸多RPC ...

  2. Android 学习笔记之WebService实现远程调用+内部原理分析...

    PS:终于可以抽出时间写写博客了,忙着学校的三周破实训外加替考...三周了,没怎么学习...哎... 学习内容: 1.WebService 实现远程方法的调用   什么是WebService...   ...

  3. 深入理解HTTP协议及原理分析

    1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...

  4. 深入理解HTTP协议及原理分析之缓存(3种缓存机制)

    3.2 缓存的实现原理 3.2.1什么是Web缓存 WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果 ...

  5. http协议及原理分析 1

    1:200与304的区别 浏览器第一次加载成功返回200状态,并会在浏览器的缓存中记录下 max-age 这个值.第二次发起服务器的访问时 会先看缓存中有没有要加载的资源 如果有 再去看有没有超出 m ...

  6. Java 远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  7. Java远程通讯技术及原理分析

    在分布式服务框架中,一个最基础的问题就是远程服务是怎么通讯的,在Java领域中有很多可实现远程通讯的技术,例如:RMI.MINA.ESB.Burlap.Hessian.SOAP.EJB和JMS等,这些 ...

  8. SPI协议及工作原理分析

    说明.文章摘自:SPI协议及其工作原理分析 http://blog.csdn.net/skyflying2012/article/details/11710801 一.概述. SPI, Serial ...

  9. OAuth认证协议原理分析及同步消息到Twitter和Facebook使用方法

    OAuth有什么用?为什么要使用OAuth? twitter或豆瓣用户一定会发现,有时候,在别的网站,点登录后转到 twitter登录,之后转回原网站,你会发现你已经登录此网站了,这种网站就是这个效果 ...

随机推荐

  1. 解决maven依赖冲突问题

    解决maven依赖冲突问题 1.idea 安装maven helper插件 2.打开pom.xml文件 底部多出一个Dependency Analyzer选项 点开这个选项 找到冲突,点击右键,选择E ...

  2. Docker_Swarm集群系统

    Docker_Swarm集群系统 一.Docker Swarm 介绍 实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernete ...

  3. 图分析Rapids cuGraph

    图分析Rapids cuGraph 英伟达(Nvidia)建立的新的开源库可能是推进分析和使图形数据库更快的秘密要素. 在Nvidia GPU上进行并行处理. Nvidia很久以前就不再只是" ...

  4. MIT Graph实践概述

    MIT Graph实践概述 Features功能 •   iCloud Support •   Multi Local & Cloud Graphs •   Thread Safe •   S ...

  5. CodeGen标记循环

    CodeGen标记循环 标记循环是一个模板文件构造,它允许您迭代CodeGen拥有的标记信息的集合.为了使用标记循环,必须基于至少定义了一个字段标记的存储库结构生成代码.              标 ...

  6. 编译器设计-RunTime运行时环境

    编译器设计-RunTime运行时环境 Compiler Design - Run-Time Environment 作为源代码的程序仅仅是文本(代码.语句等)的集合,要使其活动,它需要在目标计算机上执 ...

  7. Java基础_循环嵌套_打印乘法口诀、菱形,各种图形,计算二元一次和三元一次方程组_7

    循环嵌套 打印乘法口诀 for(int j=1;j<=9;j++){ for(int i=1;i<=j;i++){ System.out.print(i+"*"+j+& ...

  8. robotframework常用关键字

    robotframework关键字 可以将关键字看作是处理数据的方法.robotframework的关键字和测试数据组成了测试用例. robotframework关键字包括系统关键字和用户关键字.用户 ...

  9. NX二次开发】Block UI 选择特征

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  10. 佛祖保佑永无BUG 神兽护体 代码注释(各种版本)

    佛祖保佑 永无BUG /* _ooOoo_ o8888888o 88" . "88 (| -_- |) O\ = /O ____/`---'\____ .' \\| |// `. ...