什么是远程过程调用
我们经常需要设计一个分布式系统,并通过分布式系统,实现程序跨计算机运行。例如,为了建立一个大型的事务处理系统,需要一个专门服务器负责事务逻辑对象,另外专门设计一个服务器展示逻辑对象,诸如此类。所有这些服务器相互之间都需要通信(见图14-1)。
为了这样的一个模型能正常工作,一台计算机的代码需要访问另一台计算机。例如,位于服务器的程序需要在一个Web页面上显示一个订单列表,在这种情形下, 它需要访问业务对象服务器上的程序,通过它读取订单列表,业务对象服务器又要访问数据库服务器。当一台计算机上的程序调用另一台计算机的程序时,就称之为 一次远程过程调用(Remote Procedure Call,RPC)。
为了执行一个远程过程调用,需要掌握以下内容:
● 被调用的代码驻留在哪里?当需要执行某个代码时,首先需要知道该代码在哪里?
● 调用这些代码需要参数吗?如果需要,参数的类型是什么?例如,如果我们想调用一个远程过程执行两个数的加法运算,则必须要把这两个数传递给这个过程。
● 调用过程需要返回运算结果吗?如果需要,则返回值的类型是什么?例如,两个数相加的过程要返回第三个数,即它们的和。
图 14‑1
此外,我们还需要解决大量的网络问题,把需要从一台计算机传送给另一台计算机的数据进行打包,以及其他很多问题。正是由于这个原因,人们开发了许多RPC协议。
协议就是一组规则,有了这组规则,不同的应用程序甚至不同的计算机都可以相互通信。例如,Internet上的计算机就是用TCP(传输控制协议)和IP(网际协议)两个协议进行通信的,因为它们规定了Internet上的数据传输过程和计算机寻址方法。
这些协议规定如何为远程计算机提供地址,如何把需要传送给远程过程的数据打包,如何读取响应信号,如何启动远程调用,如何进行纠错处理,以及处理所有与多 个计算机之间通信有关的细节问题(这样的RPC协议通常都是建立在其他协议的基础上,例如,RPC协议规定在网络传输中必须使用TCP/IP协议)。
用Sockets API和TCP/IP协议调用服务器上的定制方法,程序员必须创建一种方式,让服务器分析数据流,以调用相应的方法。为了使这个过程更容易实现,一些公司 创建了RPC(远程过程调用,Remote Procedure Calls)协议,例如Open Software Foundation公司(OSF)创建的、仍很流行的DCE-RPC (Distributed Computing Environment - Remote Procedure Calls)协议,该公司后来变成Open Group(参阅www.opengroup.org站 点上的信息)。使用RPC可以用IDL(接口定义语言,Interface Definition Language)格式定义方法,服务器必须执行该方法,客户机也可以调用它。现在不再需要定义定制协议,分析请求代码,以调用方法了,这些工作都由一个 特定的程序来完成,该程序称为stub,由一个接口编译器生成。
RPC用于调用方法,这表示我们必须进行过程化编程。RPC技术推出得较晚,那时大多数开发商已经开始使用面向对象的方式编程了。为了在这些技术之间搭起桥梁,又开发出了几种技术,包括CORBA和DCOM。
1. CORBA
Object Management Group(OMG,www.omg.org) 在1991年开发出了CORBA(公用对象请求代理程序体系结构,Common Object Request Broker Architecture),把面向对象技术添加到网络编程中。许多销售商如Digital Equipment、HP、IBM和其他销售商都提供CORBA服务器。但因为OMG没有定义引用执行代码,只有一个规范,所以这些销售商的服务器都不能 交互操作。HP服务器需要一个HP客户机,IBM服务器需要一个IBM客户机等。
2. DCOM
在Windows NT 4中,Microsoft用面向对象的功能扩展了DCE-RPC协议。DCOM (Distributed COM)可以在网络上调用COM组件,并用于COM+应用程序。几年后,Microsoft操作系统需要使用DCOM,Microsoft就对其他带有 The Active Group的操作系统开放了该协议。DCOM可以用于Unix、VMS和IBM系统,但主要用于Microsoft环境,把它用于其他系统所做的努力并不 成功。哪个IBM大型机管理员愿意在自己的系统中加入一些Microsoft技术呢?
3. RMI
Sun公司对自己的Java技术采用了不同的方式。在纯粹的Java环境中,RMI (远程方法调用,Remote Method Invocation)协议可以用于远程调用对象。Sun公司添加了一些与CORBA和COM的桥梁技术,但它的主要目的是让人们使用只有Java的解决 方案。