SOA 设计原则和 Web 服务中的数据传输

SOA 被翻译为面向服务架构,它应该是创建从自治服务生成系统的一个架构方法,它的目的是更方便地进行集成。
SOA是Web 服务的一个自然延伸,因为Web 服务只是解决了异构系统之间的互操作,并没有降低Web 服务之间的耦合度。
而关于SOA,有太多关于这个名词的阐述和其他新鲜名词:SCA、SDO、ESB等,本文要讨论的是什么是服务、面向服务架构的设计原则和Web 服务中的数据传输。

什么是服务?
简单来说就是一个提供消息交换交互、满足特定功能的程序而已。它具有可用性和稳定性,同时也是松耦合的。服务长期存在,但是服务的配置和聚合必须能适应变化。

如何设计服务?
无他,把 OO 设计准则拿到 Web 服务领域而已,John Evdemon 在这篇文章(http://msdn.microsoft.com/architecture/default.aspx?pull=/library/en-us/dnbda/html/SOADesign.asp)里面谈到SOA的设计原则,中文在这里(http://www.microsoft.com/china/msdn/library/architecture/architecture/architecturetopic/SOADesign.mspx)。
有以下四个设计原则:
一:边界清楚(Boundaries Are Explicit)
 通过WSDL发布服务协定(流程和数据形式)、使用消息传递而不是RPC调用、提供结构良好的公共接口并保持静态。
二: 自治(Services Are Autonomous)
 服务的部署和版本变迁应该要独立于服务的部署和使用者、服务发布后接口即不可更改,做为服务提供者,要预料到服务有可能被误用或者服务的使用者出现问题。
三: 共享架构和协定而非类(Services Share Schema and Contract, Not Class)
 采用 XML 架构定义消息交换格式、采用 WSDL 定义消息交换模式、采用 Web 服务策略(WS-Policy) 定义功能和需求、采用BPEL(Business Process Execution Language,业务流程执行语言)做为业务流程级别的协定,以聚合多个服务。  
四: 服务兼容性基于策略(Service Compatibility Is Based Upon Policy)
 策略表达式可用于分隔化兼容性性和语义兼容性。WS-Policy 规范定义了一个能够表达服务级策略的机器可读的策略框架。关于WS-Policy的介绍,请参见:http://msdn.microsoft.com/webservices/default.aspx?pull=/library/en-us/dnglobspec/html/ws-policy.asp
 中文在这里(http://www.microsoft.com/china/MSDN/library/WebServices/WebServices/Usdnglobspecwspolicy.mspx)
 
采用何种格式在 Web 服务中传输数据?
 在选择传递数据所使用的机制上,有以下几种方法可供选择:DataSet、类型化DataSet、自定义集合、普通 XML 文件
 类型化DataSet只是在通用DataSet上增加了一些附加功能,还应该属于DataSet,可以被认为是一种格式。
 DataSet:
 使用它的理由有:可以把任何数据源的数据整合在一起进行传递;
 支持序列化,可以方便地和文本流进行转换;在.NET 2.0 中,连DataTable都开始支持序列化;
 在.NET中对DataSet进行操作也比较简便,开发工作量也比较小。
 而不应该在Web服务中采用DataSet的理由是:
 Web服务的设计目的是用来解决异构系统之间的数据通信问题的,数据就是以消息的形式在服务之间进行传递。而将一个其它服务或系统无法理解的DataSet放在Web服务中传输,是否已经违背了Web服务设计时的初衷?
 题外话:.NET 2.0 中增加了SerializationFormat.Binary,是否助长了这种风潮?是否有更多的开发者在应该使用.NET Remoting的场合“过度使用”了Web服务?
 直接使用DataSet的WriteXML方法和ReadXML方法来转换XML不采用其它措施的话,XML文件中会包含大量的架构信息,占用了宝贵的带宽资源;
 
 自定义集合:
 最大限度的支持自定义,可解决DataSet的隐式数据转换和效率问题,但是需要额外的代码来实现数据的访问并需要实现ISerializable接口来支持序列化,可能开发的工作量是最大的。
 
 普通XML文件:
 可以直接进行传输,需要编写解析程序将数据提取出来。
 
 如果使用Web服务的目的仅仅是为了穿透防火墙,不考虑异构系统直接的通讯的话,采用DataSet可能是比较好的方案。
 如果性能是首先要考虑的问题,应该会采用自定义集合。
 如果异构系统之间通讯的话,肯定应该采用普通XML文件。

posted @ 2006-04-07 21:25  xlzhu  阅读(2149)  评论(2编辑  收藏