1.1.4 分布式计算的对象互调技术
互联网上的应用程序是基于 TCP/IP 来进行通信的,但这只是为不同计算机上的软件对象建立了互联的“通道”,它们之间还需要统一的“交流语言”才能实现彼此的沟通。
跨计算机的分布式应用在软件组件层次上遵守的某种特定软件标准,是实现异构平台和程序之间互操作性的保证。这种允许运行于一台计算机上的程序调用另一台计算机上的子程序的协议被称为RPC(Remote Procedure Call,远程过程调用)。
分布式应用的出发点是实现不同计算机上相同或不同操作系统的软件对象能够互相调用,而编写这样的软件组件。目前已经有三个主要的标准,它们是:
■ 微软的DCOM(Distributed COM,分布式组件对象模型);
■ OMG(Object Management Group,对象管理组织)的CORBA(Common Object Request Broker Architecture,公共对象请求代理架构);
■ SOAP(Simple Object Access Protocol,简单对象访问协议)。
微软的DCOM规范了COM对象与远程计算机上另一个COM对象的交互过程,它规定了COM对象的创建和通信机制,虽然这一规范本身不依赖任何特定语言和平台,但和大部分微软的产品一样,目前只在Windows平台中得到了实现,是微软的私家标准。
CORBA 由对象请求代理(ORB)、对象服务、公共设施、域接口和应用接口等几个部分组成。其核心部分是ORB,ORB提供了一种机制让对象可以透明地发出请求和接收响应。
尽管CORBA可以在不同的平台上执行,DCOM可以在微软的平台上运行,但是基于CORBA和DCOM的解决方案必须依赖于同构的应用程序,双方无法互相通信。更糟糕的是,这两种标准都是基于RPC协议的一种二进制标准(其中CORBA基于IIOP,DCOM基于ORPC协议)。在Internet编程环境中,它们无法通过防火墙和代理服务器的“绞杀”,只能适用于局域网环境中。
由于DCOM和CORBA无法在Internet环境中稳定实现,促使了SOAP协议的出现, SOAP 采用了 HTTP 和 XML 这两个已经得到了广泛使用的协议:HTTP 用于实现 SOAP的RPC风格的传输,XML则是它的编码格式。
尽管 SOAP 的 HTTP 并不是最有效的传输方式,而且还要在客户端和服务器端进行XML解析,使用的时间较其他协议更多,但HTTP的稳定性和XML的纯文本特性使得它不再受防火墙的阻挡,能够在Internet环境中得到广泛的应用,如图1-8所示。
现在一提到SOAP这个名词,就似乎与Web服务紧密相连,但SOAP出现时间早于Web服务。由于SOAP只是现存技术的组合,并无任何新的技术,而HTTP和基于文本的XML数据更是能被所有平台接收,因此SOAP具有天生的互操作性和跨平台性。
SOAP目前已经得到了广泛的应用,在ArcGIS Server 9.2中,ESRI就为操作GIS服务器端的对象提供了一套SOAP API,以方便用户与服务器端的对象进行交互。由于所有的ArcGIS Server对象都实现了IRequestHandler接口,而这一接口能够响应SOAP请求,因此与SOAP交互的能力是与生俱来的,开发人员可以通过SOAP直接与服务器对象交互而无须通过Web服务。
图1-8 两种不同架构的PRC遇到防火墙
小知识:XML-RPC
如果将Web看作是一个巨大的分布式编程环境,显然,在分布式环境中的远程调用RPC一般都应该基于 HTTP进行传输。除了曾经介绍的 SOAP以外,另一种常见的基于 HTTP的 RPC方式,即XML-RPC。
XML-RPC是使用 HTTP 作为传输协议和使用 XML 作为编码方式的远程过程调用的。其设计力求简单,并同时允许传输、处理和返回复杂数据结构。虽然与SOAP一样,也是一种基于HTTP的POST式请求,但不同的是它没有复杂的XML结构,下面是一个XML-RPC的典型请求:
POST /RPC2 HTTP/1.0 User-Agent: Frontier/5.1.2 (WinNT) Host: betty.userland.com Content-Type: text/xml Content-length: 181 <?xml version="1.0"?> <methodCall> <methodName>examples.getStateName</methodName> <params> <param> <value><i4>41</i4></value> </param> </params> </methodCall>
目前,许多 blog 程序的本地写作软件,如 Windows Live Writer 都可以使用 blog 提供的XML-RPC API与blog进行数据交换。