日期:2012-03-13  浏览次数:20437 次





总结:
(本文假设读者对COM和XML技术已经很熟悉。)
SOAP(Simple Object Access Protocal) 技术有助于实现大量异构程序和平台之间的互操作性,从而使存在的应用能够被广泛的用户所访问。SOAP是把成熟的基于HTTP的WEB技术与XML的灵活性和可扩展性组合在了一起。
这篇文章带你全面回顾对象远程进程调用(ORPC)技术的历程,以帮助你理解SOAP技术的基础,以及它克服存在技术(如CORBA和DCOM)的许多缺陷的方法。随后讲述详细的SOAP编码规则,并把焦点放在SOAP是怎样映射到存在的ORPC概念上的。
引言:
当我在1984年开始把计算作为我的职业的时候,大多数程序员并不关心网络协议。但是在九十年代网络变得无所不在,现在如果有谁使用计算机却不使用某种形式网络连接是很难以想象的。今天,一般的程序员对建立可扩展的分布式应用表现出更大的兴趣,而不再只是关注于用MFC实现个性化的可浮动半透明非矩形的Coolbars了。
程序员通常喜欢用编程模型来思考问题,而很少考虑网络协议。尽管这样做通常是很好的,但在这篇文章中我将讨论的SOAP是一个没有明显的编程模型的网络协议。这并不意味着SOAP的体系结构从根本上会改变你编程的方式。相反,SOAP的一个主要目标是使存在的应用能被更广泛的用户所使用。为了实现这个目的,没有任何SOAP API或SOAP 对象请求代理(SOAP ORB),SOAP是假设你将使用尽可能多的存在的技术。几个主要的CORBA厂商已经承诺在他们的ORB产品中支持SOAP协议。微软也承诺在将来的COM版本中支持SOAP。DevelopMentor已经开发了参考实现,它使得在任何平台上的任何Java或Perl程序员都可以使用SOAP。
在SOAP后面的指导理念是“它是第一个没有发明任何新技术的技术”。SOAP采用了已经广泛使用的两个协议:HTTP和XML。HTTP用于实现SOAP的RPC风格的传输,而XML是它的编码模式。采用几行代码和一个XML解析器,HTTP服务器(如MS的IIS或Apache)立刻成为了SOAP的ORBs。 因为目前超过一半的Web服务器采用IIS或Apache, SOAP将会从这两个产品的广泛而可靠的使用中获取利益。这并不意味着所有的SOAP请求必须通过Web服务器来路由,传统的Web 服务器只是分派SOAP请求的一种方式。因此Web服务如IIS或Apache对建立SOAP使能的应用是充分的,但决不是必要的。
正如这篇文章将要描述的,SOAP简单地用XML来编码HTTP的传输内容。SOAP最常用的应用是作为一个RPC协议。为了理解SOAP怎样工作,有必要简要回顾一下RPC协议的历史。
RPCs的历史
建立分布式应用的两个主要通信模型是消息传送(经常与队列组合在一起)和请求/响应。消息传递系统允许通信任何一方在任何时间发送消息。请求/响应协议把通信模式限制在请求/响应的双方。基于消息的应用强烈地意识到它们正在与外部的并行进程进行通信,并且需要一个显式的设计风格。基于请求/响应的应用更象一个单进程的应用,因为发送请求的应用或多或少被阻塞直至收到来自另一个进程的响应。这使得请求/响应通信自然地适合于RPC应用。
尽管消息通信和请求/响应各有他们的优点,他们都是可以用对方来实现的。消息系统可以用较底层的请求/响应协议来建立。如微软的Message Queue Server (MSMQ)内部采用了DCE RPC来建立大多数的控制逻辑。RPC系统也可以采用较底层的消息系统来建立。MSMQ提供的关联 ID正是为了这个目的。不管评价如何,大多数的应用仍趋向于使用RPC协议,因为它们广泛的使用,它们更简单的设计,以及更自然的到传统的编程技术的映射。
在八十年代,两个主要的RPC协议是Sun RPC 和DCE RPC。最流行的Sun RPC应用是大多数UNIX系统所使用的Network File System (NFS)。最流行的DCE RPC应用则是Windows NT?,它采用DCE RPC 协议来实现许多系统服务。这两个协议被证明适用于很大范围的应用。但是,在八十年代末期,面向对象技术的风靡使软件界沉迷于在面向对象语言和基于RPC的通信之间建立一个纽带。
在九十年代产生的对象RPC (ORPC) 协议正是试图把面向对象和网络协议联系起来。ORPC 和 RPC 协议的主要不同是ORPC代码化了从通信终端到语言级对象的映射。在每个ORPC请求的头中都有一个cookie,服务器端的程序能用它来定位在服务器进程中的目标对象。通常这个cookie只是一个对数组的索引,但其它技术也经常被使用,如用符号名作为Hash表的键。

图1 ORPC请求与响应
图1表示一个典型的ORPC请求和响应。有几个请求头组件被服务器端的处理程序用于分发调用。对象端点ID被用于定位在服务器进程中目标对象。接口标识符和方法标识符用于决定在目标对象中哪一个方法被调用。传输体用于传递请求中的[in]和[in,out]参数的值(在响应中是[out]和[in,out])。要注意的是任选的协议扩展可以出现在头文件和传输体之间。这是在协议设计中的惯例,因为它允许新的服务搭载在ORPC的请求和服务上。大多数ORPC系统用这个区域传递附加的上下文信息(如事务信息和因果关系标识符)。
目前两个主要的OPRC协议是DCOM 和 CORBA的 Internet Inter-ORB Protocol (IIOP) 或更一般的General Inter-ORB Protocol (GIOP)。DCOM和IIOP/GIOP的请求格式非常相似。两个协议都用一个对象端点ID来确定目标对象,用方法标识符来决定调用哪个方法。
这两个协议主要有两点不同:主要的一点不同是采用IIOP/GIOP时,接口标识符是隐含的,因为一个给定的CORBA对象只实现一个接口(尽管OMG当前正在进行每个对象有多个接口支持的标准化工作)。DCOM与IIOP/GIOP请求的另一个细微差别是在传输体中参数值的格式。在DCOM中,传输体用网络数据表达(NDR)的格式来写,在IIOP/GIOP中,传输体用公共数据表达(CDR)的格式来写。NDR和 CDR分别处理在各种平台上的不同的数据表达。但是在这两种格式之间有一些小的差别,这使它们相互之间并不兼容。
在ORPC与RPC协议之间的另一个重要的不同是通信端点的命名方式。在ORPC协议中,对于ORPC端点的一些可传递的表达方式被要求在网络之间传递对象引用。在CORBA/IIOP,这个表达方式被称为可交互的对象引用(IOR)。IORs包含用紧凑格式表达的寻址信息,使用了它任何CORBA产品都可以决定一个对象端点。在DCOM中,这种表达方式被称为OBJREF,它组合了分布的引用计算和端点/对象标识。CORBA和DCOM都提供了在网络上寻找对象端点的高级机制,但最终这些机制都映射回到了IORs或OBJREFs。图3是表示一个 IOR/OBJREF 怎样与在IIOP/DCOM请求消息中的寻址信息关联起来的。
目前的技术存在的问题?
尽管DCOM和IIOP都是固定的协议,业界还没有完全转向其中任何一个协议。没有融合的部分原因是文化的问题所致。而且在当一些组织试图标准化一个或另一个协议的时候,两个协议的技术适用性就被提出质疑。传统上认为DCOM和CORBA都是合理服务器到服务器端的通信协议。但是,二者对客户到服务器端的通信都存在明显的弱点,尤其是客户机被散布在Internet上的时候。
DCOM 和 CORBA/IIOP都是依赖于单个厂商的解决方案来最大优势地使用协议。尽管两个协议都在各种平台和产品上被实现了,但现实是选定的发布需要采用单一厂商的实现。在DCOM的情况下,这意味着每个机器要运行在Windows NT。(尽管DCOM已经被转移到其它平台,但它只在Windows?上获得了广泛的延伸)。在CORBA情况下,这意味着每个机器要运行同样的ORB产品。的确让两个CORBA产品用IIOP相互调用是有可能的,但是许多高级的服务(如安全和事务)此时通常不是可交互的。而且,任何专门厂商为同样的机器的通信所作的优化很难起作用,除非所有的应用被建立在同一个ORB产品上。
DCOM 和CORBA/IIOP都依赖于周密管理的环境。两个任意的计算机使得DCOM或IIOP 在环境之外被成功调用(calls out of the box)的几率是很低的。特别是在考虑安全性的时候尤其是这样。尽管写一个能成功地运用DCOM或IIOP的紧缩包(shrink-wrap)应用是可能的,但这样做要比基于socket的应用要更多地关注细节。这对于乏味但必需的配置和安装管理任务特别适用。
DCOM 和 CORBA/IIOP都依赖于相当高技术的运行环境。尽管进程内的COM似乎特别简单,但COM/DCOM远程处理程序绝对不只是几天就解决的事情。IIOP 是一个比DCOM更容易实现的协议,但两个协议都有相当多的深奥的规则来处理数据排列、类型信息和位操作。这使得一般的程序员在没有领会ORB产品或OLE32.DLL的情况下去构造一个简单的CORBA或DCOM调用也变得很困难。
也许对DCOM和CORBA/IIOP