RPC远程过程调用实例剖析
Paddy102
本文比较详细地介绍了远程过程调用(RPC)的OSF标准在Microsoft VC++中的实现原理, 以及如何使用它们来开发应用程序. 阅读本文你将了解RPC的基本原理, 并将看到如何开发使用RPC进行异种机网络分布式处理的客户机应用程序和服务器应用程序.
Para 1. RPC工作原理
RPC是把传统本地过程调用的概念加以扩充后引入分布式环境的一种形式. RPC的形式和行为与传统本地过程调用极为相似, 差别仅在于被调用的procedure(过程)实际运行在与调用者的场点不同的场点上(如图1). 也正是由于这一差别, 我们得通过编写程序来实现两场地之间的连接和信息沟通.
RPC机制的实质是实现OSI七层模型中的会话层功能. 它在两个试图进行通信的场点之间建立一条逻辑信道(即会话连接), 并利用这个信道交换信息, 不用时就释放连接. 下面我们就来看看RPC的通信模型(如下图2):
Client端:
1) 发送远程过程调用的消息(以消息包形式)给远程的server端;
2) 等待, 直到收到server端对该请求的回复;
3) 一旦接收到来自server端的返回执行结果, 就继续执行后面的程序.
Server端:
1) 倾听状态, 等待client端发送过程调用消息;
2) 一旦接收到过程调用消息, server就抽取参数并分析它, 然后执行所请求的过程;
3) 将执行结果以消息包形式回送给client.
至于RPC的具体实现, 我们可以借助下图3来理解:
其中stub是一组RPC机制的操作原语, 这些原语构成了RPC的实现细节, 它可以独立于client、server编程. 下面我们来解说图3的执行过程:
1) 调用者调用本地stub中的一个过程(开始远程过程调用请求).
2) 这个stub过程把有关的参数组装成一个消息包或一组消息包, 形成一条消息. 运行此执行过程的远程场点的IP地址和执行该过程的进程ID号也包含在这条消息中.
3) 将这条消息发送给对应的RPC runtime(RPC运行库)子程序, 由这个子程序将消息发送到远程场点.
4) 在接收到这条消息时, server端的RPC runtime子程序引用与被调用者对应的stub中的一个子程序, 并让它来处理消息.
5) 与被调用者对应的stub中的这个子程序撤卸消息, 解析出相关参数, 并用本地调用方式执行所指定的过程.
6) 返回调用结果, 调用者对应的stub子程序执行return语句返回到用户, 整个RPC过程结束.
实际上, 从上面这个执行过程中, 我们可以看到RPC的实现主要有两个问题需要解决. 一个是在远程过程调用时, 如何定位远程场点; 另外一个就是相关的两个场点必须能协同工作, 所有这些工作对用户都是透明的, 依次执行.
通常在实际编程中, 程序设计者主要负责设计计算过程并实现计算过程体, 而对应的stub由系统生成. 后面我们就要说到Microsoft的RPC实现机制,看看它是如何产生stub的。
Para2. 如何设计好的RPC
对调用双方来说, 传递RPC参数包括辅助处理本地数据表示和网络数据表示的相互转换. 此外, 输入输出参数需要一些存储分配. 同时, RPC中的等待时间也不能忽略.
所以, 一般来说, 应该尽可能降低调用次数. 例如,如果要对一个大数组的每个元素都执行计算, 我们就可以一次调用处理一整行或者整个数组, 而不用每次调用传递一个元素. 这样可以降低有RPC引入的额外开销.
Para3. 应用程序的组件
为了在client和server端使用RPC, 当然少不了client进程和server进程. 另外还有一个名称服务进程, 这个稍后再说.
开发过程大致是这样的:
1) 任何RPC调用都使用一个定义在IDL(interface definition language, 接口定义语言)文件中的接口, 然后MIDL(Microsoft IDL)编译器对IDL文件进行编译, 编译之后会自动生成一个.h文件, 同时生成一个 client stub 和一个server stub. 关于这个你可以在dos下运行midl.exe/?得到更详细的信息.
2) Client端应用程序使用client stub调用RPC runtime以实现网络上的调用. 接下来RPC运行时使用一组DLL中的一个来实现被使用的特定网络协议.
3) Server端也与RPC runtime连接. 不过server端应用程序使用一些其它的函数来将自己作为一个特殊接口的服务器进行注册(向谁注册?), 并开始侦听接口的请求.
未完待续......
本文地址:http://com.8s8s.com/it/it832.htm