在近几年工作中发现,功能服务化或微服务化越来越流行,逐渐成为实现中大型分布式系统架构的主要方式,而在分布式系统中的不同节点应用间的通信中,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. https://www.jianshu.com/writer#/notebooks/164311/notes/88906048/preview

    什么是 webassembly 在 2019 年 12 月之前,如果你要编写一个web页面,那一定离不开 html.css.js 这三个好兄弟.在 2019 年 12 月之后 W3C 宣布 webas ...

  2. JUC 并发编程--01,线程,进程,经典卖票案例, juc的写法

    进程: 就是一个程序, 里面包含多个线程, 比如一个QQ程序 线程: 进程中最小的调度单元, 比如 QQ中的自动保存功能 并发: 多个线程操作同一资源, 抢夺一个cpu的执行片段, 快速交替 并行: ...

  3. 编译原理-NFA转化成DFA

    1.假定NFA    M=<S,∑,f,S0,F>    对M的状态转换图进行以下改造: ①引进新的初态结点X和终态结点Y,    X,Y∈S,    从X到S0中的任意结点连一条ε箭弧, ...

  4. 错误档案1:Eclipse自动生成swing窗体代码报错

    目录 前言 错误信息 解决方法 结论 前言 大家好呀,我是 白墨,一个热爱学习与划水的矛盾体. 昨天为了图方便,使用MyEclipse中的swing功能画界面,画完以后发现无法运行,查看源代码发现全报 ...

  5. Java 并发基础知识

    一.什么是线程和进程? 进程: 是程序的一次执行过程,是系统运行程序的基本单元(就比如打开某个应用,就是开启了一个进程),因此进程是动态的.系统运行一个程序即是一个程序从创建.运行到消亡的过程. 在 ...

  6. 【VBA】excel自动换名字打印

    源码: Sub m() For i = 1 To 100 ActiveSheet.PrintOut copies:=1 Cells(1, 1) = Sheets(2).Cells(i, 1) Next ...

  7. 你,确定了解Java的String字符串?

    本文将描述JDK6中String.intern()是如何实现的,以及在JDK7和JDK8中对字符串池化技术做了哪些改变. String池化介绍 String池化就是把一些值相同,但是标识符不同的字符串 ...

  8. Redis压测

    测试命令 ​ 这条命令redis自带 redis-benchmark [option] [option value] redis 性能测试工具可选参数如下所示: 序号 选项 描述 默认值 1 -h 指 ...

  9. 温故而知新--day5

    温故而知新--day5 ip地址 IP是英文Internet Protocol的缩写,意思是"网络之间互连的协议",也就是为计算机网络相互连接进行通信而设计的协议.当多个设备要进行 ...

  10. CMD批处理(5)——自动以管理员身份运行批处理脚本

    在日常运维工作中,为方便对windows用户进行系统安装或配置等,使用Windows自带的批处理(bat文件)是一种最为简单快速的方法. 批处理脚本不会默认已管理员身份运行,一般情况下,我会将脚本命名 ...