以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 Web Services & Semantic Web Services 』 (http://bbs.xml.org.cn/list.asp?boardid=10) ---- 用于实现 Web 服务的 SOA 编程模型,第 1 部分: IBM SOA 编程模型简介 (http://bbs.xml.org.cn/dispbbs.asp?boardid=10&rootid=&id=35119) |
-- 作者:supremeweb -- 发布时间:7/1/2006 9:07:00 PM -- 用于实现 Web 服务的 SOA 编程模型,第 2 部分: 使用服务数据对象简化的数据访问 级别: 初级 [URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#author]Stephen A. Brodsky[/URL], 高级技术人员, IBM 利用服务数据对象简化面向服务的软件中的数据访问和表示。SDO 用统一的抽象代替各种各样的数据访问模型来创建、检索、更新和删除供服务实现使用的业务数据。这是我们有关用于 IBM® 面向服务的体系结构 (SOA) 的编程模型系列文章的第二篇。 服务对象数据(Service Data Object,SDO)使用统一的抽象代替了各种各样的数据访问模型来创建、检索、更新和删除供服务实现使用的业务数据。SDO(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#Resources]参考资料[/URL]部分中的 Service Data Objects 2.0 和 Next-Generation Data Programming: Service Data Objects)是 IBM 面向服务的体系结构 (SOA) 的基础概念。SDO 将开发人员从如何访问特定的后端数据源的技术细节中解放出来,提高了他们的工作效率,这样他们就可以主要专注于业务逻辑(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#Resources]参考资料[/URL]部分中的 Integrating relational data into Web applications、Next-generation data programming in the Java™ environment 以及 Using Service Data Objects with Enterprise Information Integration technology)。SDO 是与 BEA Systems, Inc. 联合制订的规范,并且在 IBM 系列产品中得到了广泛的使用,包括 WebSphere® Application Server 和 Rational® Studio 工具。Java™ 数据库连接(Java™ DataBase Connectivity),通常称为 JDBC,是执行结构化查询语言(Structured Query Langauge,SQL)语句的 Java 接口。目前,用于 JDBC、Web 服务描述语言(Web Services Description Language,WSDL)定义的服务、企业 JavaBean(Enterprise JavaBean,EJB)等等由 Java 编写的服务实现的编程模型都是相似的,但却又有一些让人讨厌的不同。 SDO 定义了一种单一的、统一的方法来访问和操作来自异构数据源的数据,包括关系型数据库、可扩展标记语言(eXtensible Markup Language,XML)数据源、Web 服务以及企业信息系统 (EIS)。它们是基于数据图(data graph)的概念。数据图就是一组可以从数据源中分离出来的树形结构的对象。SDO 可以在整个应用程序体系结构中使用。 应用程序体系结构的领域 如何使用 SDO 在 SOA 中,应用程序并不直接地连接数据源。它访问一个叫做数据访问服务(data access service,DAS)的中介并接收响应中的数据图。DAS 是为特定数据源种类处理技术细节的服务。它为客户机将数据转换成 SDO 图。客户机应用程序与数据图进行交互来获得数据和改变数据。为了将更新应用于原始的数据源,应用程序将更新过的图发送回 DAS,而 DAS 又与数据源交互。通常,运行时提供 DAS 的实现,而应用程序开发工具提供对数据图的支持。 SDO 通过封装数据访问的细节将业务应用程序与技术改变相隔离,从而避开了技术改变产生的影响——重新编写应用程序以便跟上改变的技术(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#Resources]参考资料[/URL]部分中的 Wikipedia)。例如,考虑一个设计用来从数据库中读取产品描述并将其作为网页显示的 Java Web 应用程序。为了访问数据库中的产品描述,应用程序很可能使用 JDBC。假设不久后应用程序拓扑发生了改变,在应用程序和数据库之间放置了 Web 服务。现在,应用程序不能再使用 JDBC 访问数据,而是需要重做大量的工作来替换 Web 服务应用编程接口 (API),例如文档对象模型(Document Object Model,DOM)或者基于 XML 的远程过程调用的 Java API(Java APIs for XML-Based Remote Procedure Call,JAX-RPC)。SDO 避免了这个问题;使用 SDO 编写的应用程序不必改变。 另外,SDO 提供了支持元数据 API 的应用程序、工具和框架来以统一的方式自省数据模型,而不管它的来源。DAS 将后端元数据转换成标准的 SDO 格式。 SDO 类型可以由 Java 接口、XML Schema、关系型表和列、EJB、COBOL 记录、消息或者 UML 来定义(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#Resources]参考资料[/URL]部分中的 Catalog of OMG Modeling and Metadata Specifications);实现人员可以选择自己喜欢的系统类型。简单 Java 和 XML 数据类型是有效的 SDO 数据类型,这为 Java 实现人员简化了一步。SDO 支持动态的和静态的数据访问模型,两者也可以一起使用。我们将更详细地考虑这些内容: 动态模型(缺省值)允许编程人员通过名称(字符串)获得和设置数据图中的数据元素。当 SDO 的类型在编译阶段未知时,或者当程序部署完以后可能要添加新的属性时,这特别有用。客户机应用程序或服务查询 SDO 来了解它的结构,然后按名称读取和更新任何元素。例如,可以编写一个泛型 SDO 访问函数并用特定于元素的元数据填充它来访问单独的 SDO。SDO 同样也使用 XML 路径语言( XML Path Language,XPath)表达式的子集来支持快速遍历许多 DataObject,例如 customer[1]/address/zip,以便快速访问 customer DataObejct 的 zip 代码。
示例 下面的例子——定义了包含客户数据的数据对象——说明了使用 Java 或 XML 来定义和使用 SDO 是多么的容易。[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#ex1]示例 1[/URL](使用 XML)是 SDO 类型的基础。
[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#ex3]示例 3[/URL] 和[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#ex4]示例 4[/URL] 分别展示了如何通过传递 XML Schema 名称空间和复杂的类型名称(在[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#ex1]示例 1[/URL] 中定义的)或者 Java 接口类(在[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel2.html#ex2]示例 2[/URL] 中定义的)作为参数来创建 SDO。
示例 4. 使用具有 Java 接口类参数的 SDO DataFactory 创建 SDO
示例 6. 静态访问 SDO
示例 7. XML 文件服务 这个简单的例子将数据从 XML 文件加载到 SDO 数据图,打印并更新数据,然后将它写回文件。(业务目标是将“quot;Adam”改为“Kevin”。) 根据根 XML 元素和一个多值的 customer 属性定义将要作为根 customers 数据对象读入的 XML 文件。在 XML 文件中 Customers 为每个 customer 元素包含一个数据对象。每个 customer 具有两个属性:SN 和 firstName。
root.setString("customer[1]/firstName", "Kevin");
示例 8. 访问关系数据库 虽然复杂的关系数据库到 SDO 的映射是可行的,但是这个例子使用的是一个非常简单的映射:每个数据库表都是一个 SDO 类型,表的每行是 SDO 数据对象,而每列是 SDO 属性。应用程序逻辑是相同的:通过执行预先定义好的查询从数据库中读取、打印并更新数据(将“Adam”改为“Kevin”),将更改保存到数据库。数据库查询返回 CUSTOMER 表中的两行: CUSTOMER ID(整数,主键) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串) 下面给出了带有解释的 SDO 实现。 rdbService 查询数据库以获得数据。
root.setString("CUSTOMER[1]/FIRSTNAME", "Kevin");
现在数据库包含: CUSTOMER ID(整数,主键) CUSTOMER FIRSTNAME(字符串) CUSTOMER LASTNAME(字符串) 注意,第一行已经被更新了。 如果在我们的示例应用程序已经获得数据图之后,另外一个应用程序访问数据库并更改了值会怎么样?在写入时,数据访问服务检查变更摘要来决定如何对数据源应用更新。数据库可以使用开放式并发控制 (optimistic concurrency control) 来确保这个改变之前最后包含的值是“Adam”(否则,另外一个应用程序可能先改变数据,可能在该应用程序中需要某些错误恢复)。某些服务实现了更为高级的开放式并发形式;变更历史记录提供了那些算法所需要的原始值。 使用 EJB 时,SDO 作为 [URL=http://www.martinfowler.com/eaaCatalog/dataTransferObject.html]DTO[/URL](也称作值对象)J2EE 设计模式。一般来说,访问实体 EJB(Entity EJB)的每个属性的开销非常大,所以传输几个数据图中的 SDO 对象效率更高。会话 EJB(Session EJB)可能有方法产生和使用 SDO 图来更加高效地直接访问实体 EJB。Customer 实体 EJB 封装了对 Customer 记录的数据库访问。会话 EJB 提供了访问方法来从 Customer 实体 EJB 产生和返回 Customer SDO 图。
总结 SDO 为所有数据源启用了对应用程序数据的统一访问和公共编程模型,而不管数据存储在何地以及如何存储。SDO 利用了 XML 的简易性,而又没有引入 XML Schema 的复杂性或序列化的性能问题。通过同时使用 SDO 和 SOA,可以将系统编程任务从业务逻辑中分离出来,并且将其封装在可重用的服务之中,而不是所有编程人员都必须掌握这些技能才能入门。它们在没有陷入技术和实现细节的情况下简化了业务应用程序的编程,防止了技术改变产生的影响。有了 SDO,业务应用程序就是名副其实的业务应用程序。
参考资料 您可以参阅本文在 developerWorks 全球站点上的 [URL=http://www.ibm.com/developerworks/webservices/library/ws-soa-progmodel2.html]英文原文[/URL]。 |
-- 作者:supremeweb -- 发布时间:7/1/2006 9:09:00 PM -- 用于实现 Web 服务的 SOA 编程模型,第 3 部分: 流程编排和业务状态机 级别: 初级 [URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#author]Matthias Kloppmann[/URL], 高级技术人员, IBM Software Group 组合服务的一种方法是使用业务流程执行语言(Business Process Execution Language,BPEL)将服务定义为业务流程,或者将它们表示为业务状态机 (business state machines)。编排这样一系列服务的调用的主线代码在一个称为流程编排引擎 (process choreography engine) 的特殊容器中运行。容器提供的功能可以支持甚至跨企业的边界执行长时间运行的流程,承受计划的和未计划的停用,并且促进企业到企业(business-to-business,B2B)的协作。 业务流程 业务流程编排中的服务编排的概念对于二十世纪七十年代的 FORTRAN 编程人员来说或许并不陌生。它只不过就是调用函数或者子例程的主线代码的概念,其中每个函数或者子例程实现了更大的程序的一个单独的部分。现在,在二十一世纪,子例程变成了 Web 服务。主程序的实现语言是用于 Web 服务的 BPEL(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#resources]参考资料[/URL]以获得更多关于 BPEL 的信息)。执行环境是 IBM WebSphere® Business Integration Server Foundation 中的 Business Process Choreography 容器。而程序可以将许多可能跨多个企业的长时间运行的任务组合在一起来实现一个业务功能。 [URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#fig1]图 1[/URL] 展示了一个简单的内部旅行审批和预订流程的 BPEL 流程,涉及检查请求数据的程序、实际管理审批的人工任务,以及为实际执行预订而与合作伙伴进行的 B2B 交互。 由于没有重复提及许多关于 BPEL 的参考资料和教程(请参阅[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#resources]参考资料[/URL]),因此我们在这里概要地列出了 BPEL 的一些特性以及 IBM 的 WebSphere Business Integration 中的 BPEL 实现所提供的扩展: 可以与多个合作伙伴交互的长时间运行的业务流程。所有的交互都是通过标准的无状态 Web 服务调用执行的。相关性用来利用应用程序级数据处理特定的实例,例如根据员工序号审批某人的旅行请求。补偿功能用来在必要时(部分地)撤消流程的作用,例如,在已经预订了一个航班之后取消旅行请求。
业务状态机 工作流过程与可能采取多个步骤和路径的动作或动词——例如,CreatePurchaseOrder 或者 BookTravel——相似,调用许多 Web 服务、Java 类或 Enterprise JavaBeans (EJB)。 如果工作流过程是一个动词,那么业务状态机就是一个表示事物 的名词,例如订购单、故障单或保险单应用程序。这里,动词——例如 CreatePurchaseOrder 或 BookTravel——是对事物的操作。业务状态机上的操作可以调用任何服务,例如直接通过状态机指定的 BPEL 流程或者 Java 代码。 两种方法——过程或者状态机——中没有哪个是更好的。两者在功能上都是等价的服务抽象。无论选择哪一个对当前任务来说都是很好的服务抽象。 业务状态机是由状态转移图以图形方式指定的,状态转移图显示其状态、状态间可能的转移和触发状态转移的事件,以及作为结果的操作。[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#fig2]图 2[/URL] 是一个表示 PurchaseOrder 的简单状态机的流程图。 节点(矩形)表示 PurchaseOrder 的可能状态,可以是 Created、Ready、InApproval、Purchased、Canceled、Shipped、Delivered 或者 Archived。弧线(箭头)表示可能发生的事件,导致 PurchaseOrder 从一个状态转移到另外一个状态。 业务状态机可以通过 BPEL 流程来实现。如果这样的话,事件就仅仅是 Web 服务描述语言 (WSDL) 所描述的流程的 portType 上的操作。当前状态(存储在一个变量中)决定了哪些事件(操作)是活动的。如果调用者试图调用无效的操作,那么运行时将抛出异常。您也可以查询状态机的当前状态来确定操作的有效性。 当一个事件发生时(例如,当调用一个操作或者定时器超时的时候),状态机转换到新的状态并执行与这个转换相关联的动作(例如调用操作或者方法)。在[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#fig2]图 2[/URL] 中,转移是通过带有事件注释的弧线、可选的条件以及将要执行的动作来反映的。转移只在其相关联的条件为真时才执行。在状态进入和退出时可能执行其他动作。在[URL=http://www-128.ibm.com/developerworks/cn/webservices/ws-soa-progmodel3/#fig2]图 2[/URL] 中,处于 Ready 状态的状态机具有两种可能的事件(已启用的操作):purchase 和 Cancel。对于 purchase 操作来说,有两个可能的条件:要么需要审批,要么不需要审批。 当调用者调用购买操作时,业务状态机框架执行以下操作: 确定操作对于当前状态是否有效。
总结 IBM 用于 SOA 的编程模型提供了若干构造新的面向服务的应用程序或者将现有的应用程序组合成服务框架的方法。本文重点介绍了使用业务流程执行语言的业务编排方法,它与调用传统的过程性编程中的子例程相似,增加了对于长时间运行的工作和并行工作的支持。业务状态机是另一个编程模型构件,它可以用 BPEL 来表示。没有哪种方法是更好的。选择最适合当前问题的方法。后续的文章将介绍其他组件类型,它们是 SOA 开发人员的常备工具。
参考资料 您可以参阅本文在 developerWorks 全球站点上的 [URL=http://www.ibm.com/developerworks/webservices/library/ws-soa-progmodel3/index.html]英文原文[/URL]。 |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
218.750ms |