在计算机科学中,远程过程调用RPC是一种进程间的通讯,允许一个计算机程序向另外一个地址空间(通常是共享网络中的另一台计算机)申请服务(使得特定程序在另一台计算机上执行),而无需程序员明确写明该远程调用的实现细节。也就是说,本质上程序员只要写出同样的代码,不管该特定程序是在本地还是在远程。当申请服务的计算机程序使用了面向对象的编程原则时,RPC被称为远程调用或远程方法调用。
许多不同的技术(通常不兼容)可以用来实现RPC。
历史起源
在早期的ARPANET文档中,将网络操作当作远程调用的想法,至少可以追朔到20世纪80年代。
该词的提出归功于Bruce Jay Nelson。RPC第一次商务上的应用之一是Xerox在1981年以“Courier"的名字提出的。RPC在Unix下的第一次普遍实现是Sun's RPC(现在称为ONC RPC),被用作网络文件系统NFS的基础。
消息传递
一个RPC是由客户端发起的,该客户端发送请求消息到一个已知的远程服务器,利用提供的参数来执行指定的应用程序。远程服务器给客户端发送回一个响应,同时应用程序继续其进程。在不同的实现中,有许多变化和微小的差异,从而导致各种不同的(不兼容的)RPC协议。当服务器正在处理调用,客户端被阻塞(客户端在服务器恢复执行前直到完成处理调用一直在等待),除非客户端发送给服务器的是一个异步请求,比如XHTTP调用。
远程调用和本地调用之间一个重要的差别在于远程调用会因为不可预期的网络问题而失败。而且,调用者通常必须在不知道远程程序是否真正被调用前处理这些错误。幂等程序(经多次调用而不产生副作用)很容易处理,但编写代码来调用远程程序常常受限于细心编写的底层子系统,这个过程仍然会碰到足够多的困难。
一次RPC过程的事件顺序
1. 客户端调用客户端根stub。该调用是本地调用,将参数用正常的方式压到堆中;
2. 客户端stub将参数打包成消息,执行系统调用来发送消息。消息的打包称为编组marshalling;
3. 客户端的本地操作系统从本地向服务器发送消息;
4. 服务器端的本地操作系统将收到的包传送到服务器的根stub;
5. 最后,服务器的根调用服务器端程序。服务器端的响应遵循同样的步骤,只不过方向相反。
标准接触机制
为了让不同的客户端访问服务器,建立了许多标准化的RPC系统。其中大多数使用接口描述语言(IDL,Interface Description Laguage)以让不同的平台调用RPC。IDL文件可用来产生代码以连接客户端和服务器。其中最常用的工具就是RPCGEN。
备注:
1. 由于使用 RPC 的程序不必了解支持通信的网络协议的情况,因此 RPC 提高了程序的互操作性。
2. 在 RPC 中,发出请求的程序是客户程序,而提供服务的程序是服务器。
3. RPC 的主要目的是为组件提供一种相互通信的方式,使这些组件之间能够相互发出请求并传递这些请求的结果。
原文地址:http://en.wikipedia.org/wiki/Remote_procedure_call