面向服务的体系结构(Service-Oriented Architecture,SOA)正快速成为很多企业中的主要体系结构样式。构建 SOA 解决方案的主要目的是通过松散耦合其系统来对企业进行武装,从而能更好地响应业务需求。在 SOA 解决方案内设计 Web 服务的主要目标之一是支持快速构造业务流程。您还希望加速企业内以及与外部业务合作伙伴的应用程序集成。
在实现 SOA 解决方案的上下文中,服务接口的结构非常重要。设计糟糕的服务接口可能会极大地导致使用此接口的很多服务使用者应用程序的开发过程变得非常复杂。从业务角度而言,设计糟糕的服务接口可能使得业务流程的开发和优化变得复杂。相反,设计良好的服务接口可以加速开发计划的执行,并对业务级别的灵活性起到促进作用。
Web 服务从本质上就非常适合用于构造 SOA 解决方案。Web 服务领域的很多现有和未来的行业标准可确保互操作性,此类标准包括 SOAP、Java API for XML-based RPC (JAX-RPC)、WSDL 和 WS-* 规范等等。各种流行的开发环境(如 IBM? Rational? Application Developer 和 IBM WebSphere? Integration Developer)中均包含了基于标准的工具,从而能够加速 SOA 项目的进行。
本文的重点是服务接口设计抽象层面的东西:
设计与开发方法
服务粒度
操作签名
开发方法
基于 XML 和 Web 服务的编程模型和开发工具定义了三种构建 Web 服务的方法:
自底向上
各种先进的集成开发环境(Integrated Development Environment,IDE)提供了用于从现有代码(如 Java? 或 COBOL)创建 Web 服务实现的工具。使用此方法时,开发人员通常将选择现有的 JavaBean 或 EJB 组件,并调用向导来生成 WSDL 文件,以用于将 Bean 或 EJB 作为 Web 服务调用。
自顶向下
使用此方法时,开发人员将首先使用 WSDL 和 XML 模式(XML Schema,XSD)构造定义 Web 服务接口,然后为服务生成框架实现代码。接下来,开发人员将完成框架服务实现。大多数先进的 IDE(如 Rational Application Developer V6 和 WebSphere Integration Developer V6)都为此方法提供工具支持。
中间相遇
此方法对前面两个方法进行了结合。开发人员首先使用 WSDL 和 XSD 定义服务接口,并为服务生成框架实现。如果有必要,开发人员还可以使用自底向上技术来通过方便的应用程序编程接口(Application Programming Interface,API)公开现有代码。然后开发人员将编写在新设计的接口和旧接口之间进行转换的代码。
很多熟练的 Java 开发人员喜欢使用自底向上技术来加速 SOA 项目中的 Web 服务开发。他们将首先用 Java 开发新服务的实现,然后将使用强大的代码生成向导来为这些服务创建 WSDL 接口。尽管此方法可以加速各个服务的实现,但这对整个 SOA 项目通常都意味着问题。
之所以出现问题,是因为自底向上生成经常会得到无法重用的类型定义以及多个定义为表示语义等效信息的类型。
最佳实践:使用自顶向下和中间相遇开发方法,而不使用自底向上技术。使用 XSD 和 WSDL 设计您的服务接口,然后生成框架 Java 代码。
当存在现有遗留代码(例如 JavaBeans、EJB、COBOL 等)时,就适合使用自底向上开发方法。采用此方法时,应该仔细地复查现有类的接口,然后再生成 WSDL 接口。如果 Java 接口仅包含任何以下内容,则可以将其视为弱类型:
作为方法的参数或返回类型使用的 java.lang.Object
作为方法的参数或返回类型使用的集合类(例如 java.util.Vector)(JAX-RPC 约束)
应该考虑对遗留代码进行重构,以确保接口为强类型;或构建中介,以使用强类型接口包装弱类型接口。