RPC原理

转载 2015年07月10日 20:15:38

RPC原理

RPC原理,之前花了那么多时间只是画了一个rpc状态图,现在回想花了时间,却做了一件没有什么用的事情。好多时候,都是花了功夫,却没什么用,不过也只有做了才知道有没有用。

RPC概念

RPC 的全称是 Remote Procedure Call, 是一种进程间通信方式。
常见的进程间通信方式有信号、管道、套接口。RPC允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的,本质上编写的调用代码基本相同。

Remote Procedure Calling,远程过程调用的缩写,并不是“远程进程调用”——Remote Process Calling。RPC总的来说是一个Client/Server的结构,提供服务的一方称为Server,消费服务的一方称为Client 。

RPC的功能

RPC 的主要功能目标是让构建分布式计算(应用)更容易,在提供强大的远程调用能力时不损失本地调用的语义简洁性。
词汇很专业。
我理解的RPC功能:可以远程调用其他机器上的程序执行,且对于调用的client端是透明的,client端区分不出来是本地过程调用还是远程过程调用。

远程过程调用和本地过程调用

下图是本地过程调用,所有的过程都在本地服务器上,依次调用即可
本地过程调用
下图则是远程过程调用,需要在Client和Server中交互
远程过程调用
区别:

(1)网络传输的开销,和编程的额外复杂性 ;
(2)本地过程调用中,过程在同一块物理内存中,因此就可以传递指针了。而远程过程调用则不能,因为远程过程与调用者运行在完全不同的地址空间中 ;
(3)远程过程不能共享调用者的环境,所以它就无法直接访问调用者的I/O和操作系统API ;

简单来说,就是远程过程调用会比本地过程调用复杂。除了性能的额外开销之外,编程也复杂得多 。

至少可以想到,交互双方需要能够封装数据结构,理解协议,处理连接等等,确实是很麻烦的。可能一个很简单的调用,却需要做很多的编程工作。所以,为了简化RPC调用的编程,就提出了一个RPC的标准模型。

RPC的调用

RPC 调用分以下同步调用和异步调用两种:
同步调用:客户方等待调用执行完成并返回结果。
异步调用:客户方调用后不用等待执行结果返回,但依然可以通过回调通知等方式获取返回结果。 若客户方不关心调用返回结果,则变成单向异步调用,单向调用不用返回结果。
异步和同步的区分在于是否等待服务端执行完成并返回结果。

RPC框架及其细化

RPC程序包括5个部分:
1. User
2. User-stub
3. RPCRuntime
4. Server-stub
5. Server
这 5 个部分的关系如下图所示:

5个部分

这里 user 就是 client 端,当 user 想发起一个远程调用时,它实际是通过本地调用 user-stub。user-stub 负责将调用的接口、方法和参数通过约定的协议规范进行编码并通过本地的 RPCRuntime 实例传输到远端的实例。远端 RPCRuntime 实例收到请求后交给 server-stub 进行解码后发起本地端调用,调用结果再返回给 user 端。

我的理解:user是client端的代码,user-stub是指client端的编码函数,编码函数将参数等信息编码,RPCRuntime指发送和传输RPC packet,server端的RPCRutime收到RPC packet,server-stub是server端的解码函数,server端进行处理,将处理结果再进行编码发送给client端,同样的过程。

上图是RPC的大框架,进一步细化它应该由哪些组件构成,如下图所示:
RPC框架细化图

RPC 服务方通过 RpcServer 去导出(export)远程接口方法,而客户方通过 RpcClient 去引入(import)远程接口方法。 客户方像调用本地方法一样去调用远程接口方法,RPC 框架提供接口的代理实现,实际的调用将委托给代理 RpcProxy 。 代理封装调用信息并将调用转交给 RpcInvoker 去实际执行。 在客户端的 RpcInvoker 通过连接器 RpcConnector 去维持与服务端的通道 RpcChannel, 并使用 RpcProtocol 执行协议编码(encode)并将编码后的请求消息通过通道发送给服务方。

RPC 服务端接收器 RpcAcceptor 接收客户端的调用请求,同样使用 RpcProtocol 执行协议解码(decode)。 解码后的调用信息传递给 RpcProcessor 去控制处理调用过程,最后再委托调用给 RpcInvoker 去实际执行并返回调用结果。

RPC各个组件的职责
1. RpcServer
负责导出(export)远程接口
2. RpcClient
负责导入(import)远程接口的代理实现
3. RpcProxy
远程接口的代理实现
4. RpcInvoker
客户方实现:负责编码调用信息和发送调用请求到服务方并等待调用结果返回
服务方实现:负责调用服务端接口的具体实现并返回调用结果
5. RpcProtocol
负责协议编/解码
6. RpcConnector
负责维持客户方和服务方的连接通道和发送数据到服务方
7. RpcAcceptor
负责接收客户方请求并返回请求结果
8. RpcProcessor
负责在服务方控制调用过程,包括管理调用线程池、超时时间等
9. RpcChannel
数据传输通道

参考博客:

[1] http://blog.csdn.net/mindfloating/article/details/39473807深入浅出RPC 浅出篇

[2] http://blog.csdn.net/mindfloating/article/details/39474123深入浅出RPC 深入篇

[3] http://kyfxbl.iteye.com/blog/1745550浅显易懂

[4] http://www.cnblogs.com/metoy/p/4321311.html

相关文章推荐

rpc原理的简单实现

  • 2013年05月30日 22:25
  • 4KB
  • 下载

android RPC原理总结及源码

  • 2013年06月15日 09:35
  • 1.79MB
  • 下载

一个高性能RPC框架原理剖析

业务与底层网络通信分离 Server大部分主要分为两层: 网络接收层:负责监听端口,负责收包,编码,解码工作,负责将响应包回传给客户端。业务处理层:负责接收网络接收层完整的包,如果是RPC...

RPC框架原理剖析(含实例)

关于RPC的原型模拟和实例演练
  • lulu147
  • lulu147
  • 2016年12月22日 15:21
  • 1455

GWT RPC 原理浅析二

前一篇介绍了RPC大体的流程,核心方法是RemoteServiceServlet类中的processPost方法 Java代码   public final void pro...

opennebula源码分析 -- XML-RPC 原理分析

在分析opennebula源码时,发现opennebula利用XML-RPC机制完成client端与server端的交互,由于对XML-RPC机制不太熟悉,读opennebula代码的时候心里总觉得有...

rpc简介、原理、实例-缘于difx

简介 RPC(Remote Procedure Call,远程过程调用)是建立在Socket之上的,出于一种类比的愿望,在一台机器上运行的主程序,可以调用另一台机器上准备好的子程序,就像LPC(...

Hbase 源码分析四 - Get 流程及rpc原理

Hbase 源码分析4 - Get 流程及rpc原理 分析版本为hbase 0.94 附上趋势团队画的图: rpc角色表: HBase通信信道 HBase的通信接口 ...

Android源码解析RPC系列(一)---Binder原理

看了几天的Binder,决定有必要写一篇博客,记录一下学习成果,Binder是Android中比较综合的一块知识了,目前的理解只限于JAVA层。首先Binder是干嘛用的?不用说,跨进程通信全靠它,操...

分布式架构核心RPC原理

在应用的迭代演进过程中,随着系统访问量提高,业务复杂度提高,代码复杂度提高,应用逐渐从单体式架构向面向服务的分布式架构转变。RPC(Remote Procedure Call Protocol远程过程...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:RPC原理
举报原因:
原因补充:

(最多只允许输入30个字)