关闭

RPC原理

标签: rpc
351人阅读 评论(0) 收藏 举报
分类:

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

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:64612次
    • 积分:1736
    • 等级:
    • 排名:千里之外
    • 原创:112篇
    • 转载:25篇
    • 译文:0篇
    • 评论:11条