IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope: Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

专家访谈: Greg Flurry 谈构建面向服务的解决方案

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 中级

Greg Flurry, 高级技术人员, IBM

2005 年 9 月 13 日

在这篇一问一答的文章里,Greg Flurry 回答了一系列有关使用面向服务体系结构技术创建解决方案的问题。

引言

在这篇“专家访谈”文章中,SOA 专家 Greg Flurry 回答了有关使用 IBM® 产品(例如 WebSphere® Application Server V6 和 WebSphere MQ)构建面向服务的解决方案和企业服务总线 (ESB) 的问题。WebSphere Application Server V6 不仅包含构建健壮的面向服务的解决方案所需的一切,还提供了行业领先的用于承载应用程序的 J2EE 应用程序服务器。WebSphere Application Server V6 还包括允许用户通过 ESB 访问应用程序的 WebSphere Platform Messaging。Greg 经常到各地帮助客户定义和实现面向服务的解决方案。

问:

  1. 如何定义服务的范围?
  2. 哪种服务可能是我们所说的服务?基础设施组件,例如报表服务器,可以作为服务公开吗?
  3. 从服务的角度看,“编排”是如何工作的?我有一个叫做“MyService”的服务,需要使用多个数据源生成报表,我该如何实现这个功能?在编写 MyService 时,我需要什么来部署它?
  4. 对于付费服务的使用,有没有一些模型或最佳实践?

答:

  1. 对于服务的范围,没有确切的答案。我只能提供一些有关如何识别服务和确定服务的范围方面的指导。面向服务的体系结构(或者说面向服务的解决方案)的主要目标之一就是可重用性。换言之,就是不需要为某些只有单个应用程序才使用的业务功能创建服务。但是,如果两个或更多应用程序需要使用一个业务功能,那么该业务功能就是非常合适的候选服务。也许接下来我们就要考虑粒度这个问题。遗憾的是,在某些情况下,远程处理会带来性能损失,服务也不例外。所以,您通常还需要识别大粒度的业务功能和定义大粒度的服务。为此,您需要了解业务,以便识别有资格作为服务的业务功能或业务任务。当然,这其中还有其他一些因素也限制了服务的范围。考虑这样一种情况,一些外部的合作伙伴提供或请求某种对您的企业来说非常关键的功能,那么这也就为您确定了服务的范围。有时,您可能定义了一个大粒度服务并且需要将它分为多个服务,但这只不过是传统的分解。
  2. IBM 通常认为,服务就是业务功能或业务任务,但如果解决方案需要将某种基础设施组件作为某个应用程序的外部接口,那么就可以将其公开为服务。
  3. 我不太明确您想问什么,但我会按照我所理解的问题来回答。如果“MyService”需要访问多个数据源,那么至少有三种选择。但选择哪一种,取决于数据源的性质。第一种选择,如果数据源是标准的数据库,那么可以使用普通技术(例如 JDBC 或 EJB)来实现。第二种选择,如果数据源是遗留系统,可能就必须使用适配器或 JCA。第三种选择就是,您可能需要结合使用以上两种方法。根据 MyServece 的性质,可以将其作为标准 Java™ 程序(例如无状态会话 EJB)来开发,并使用普通的 J2EE 应用程序服务器部署技术。另一方面,如果 MyService 比较复杂,那么可能需要将其描述为一个业务流程或多个服务的编排。在这种情况下,您可以通过 BPEL 定义 MyService(使用工具协助定义业务流程)。采用与普通的 J2EE 应用程序服务器部署类似的技术,也可以在 IBM 应用程序服务器中进行这样的部署。
  4. 我不了解整个行业对于服务收费的最佳实践。我在这里要重申的是,这个主题要比它初看起来复杂很多。收费是基于使用情况(“单击一次收费一次”),还是必须考虑服务所达到的质量(例如,响应时间)?关于请求者和提供者的“带外”收费系统,虽然不是我所认为的最佳实践,但却是最常见的收费系统。JAX-RPC 处理程序和企业服务总线中的中介都是这方面的例子。

问:可以推荐一些有关实现面向服务的体系结构和构建 ESB 的教程吗?

答:下面列出了一些关于 SOA 和 ESB 技术的参考资料:

下面列出了一些有关 WebSphere® Application Server V6 的文章:

问:如果我理解正确的话,MQ V6.0 应该可以在 OS/390 上安装。如果我先在分布式平台上安装 MQ V6.0,那么它是否向下兼容?由于我现在运行的是 MQ V5.3 CSD09,在 Windows® 和 AIX® 上安装 MQ V6.0 是否真的将带来更多的好处?

答:您确实可以在 z/OS 上安装 WebSphere MQ V6.0。该产品是 MQ for z/OS V6.0。升级到 MQ 6.0 有许多优势(MQ for z/OS V6.0 尤其如此),包括增强的可用性和分布式配置功能。需要说明的是,我的答案来源于 WebSphere MQ 网站。我个人对于使用该产品没有任何经验。

问:我们将 WebSphere Business Integration 作为 ESB,以便将消息从应用程序路由到服务。全部都是基于 MQ Series 的。WebSphere Business Integration 未来将会怎样?使用与 WebSphere Application Server V6 集成在一起的 ESB 路由消息和使用 WebSphere Business Integration 路由消息的方法一样吗?

答:WebSphere Business Integration 将继续作为 IBM 产品系列的一部分。可能在名称上会有一些改变,目的是反映产品的增强功能。您可能会在其他 IBM 产品中发现 WebSphere Business Integration 的某个功能,由此引出第二个问题。“集成到 WebSphere Application Server V6 中的 ESB”是一种称为服务集成总线 (SIB) 的技术。SIB 包括许多 MQ 功能和 WebSphere Business Integration 功能,其中至少包括您所期望的企业服务总线。这些功能包括路由、协议转换和消息传输等等。这些功能的最大差别在于范围和成熟度。MQ 和 WebSphere Business Integration 是成熟的产品,因而具有“内置”企业范围和健壮性、相关工具和广泛的专业经验。SIB 问世还不到一年。它当前的主要目标是工作组或站点,但它支持允许您构建企业级 ESB 的联合。您不会找到太多的工具,而且直到最近才出现许多重要的有助于传播专门知识的信息。随着技术的不断成熟,将逐步解决这些局限性问题。

问:我正从事一个文档集成的项目。这里有一个打印/传真/EDI 用例:用户可以在 WebSphere Portal 页面选择一些工作订单,然后进行打印/传真/EDI。在这个过程中,WebSphere Portal 会打印/传真/EDI 大约 200 份文档。在用户单击该页面的打印/传真/EDI 按钮后,他可以离开页面并忽略这些打印/传真/EDI 工作。我的建议是:使用 MQ 处理“打印/传真/EDI”工作,因为这些工作与时间无关,并且 MQ 比较适合异步处理。请问您是怎么认为的?如果 MQ 是本例的优选方案,请问您是否有一些关于 WebSphere Portal 和 MQ 集成的资料?

答:您是正确的,MQ 在支持异步处理方面确实更胜一筹,而且看起来 MQ 在您的项目中似乎工作得不错。我想第二个问题主要针对的是面向服务的。构建面向服务解决方案的最常用方法是使用 Web 服务。在 IBM developerWorks WebSphere 站点有许多关于门户和 Web 服务集成的资料。其中甚至还有桥接门户和 Web 服务的标准——用于远程 Portlet 的 Web 服务(Web Services for Remote Portlets,WSRP)。 有关 WSRP 标准及其如何使用的概述,请参阅 Introduction to Web Services for Remote Portlets。IBM 和许多其他的公司都支持 Web 服务的 SOAP/JMS 绑定。此外,还可以使用 MQ 作为 JMS 提供程序,这样就可以通过 MQ 使用 Web 服务。当然,也可以仅使用 JMS 来编写 Portlet,并使用 MQ 作为 JMS 提供程序。

问:我们正在使用 WebSphere MQ V5.3。我们希望修改已放入本地队列的消息的消息到期值。有什么办法可以无需取走/放回消息,就能够达到此目的?

答:很遗憾,没有。您必须取走/放回消息。虽然我并不很了解您正在努力达到的目标,但您可以做的一件事就是交叉退出 API,这样做可以覆盖将消息放入的应用程序使用的“到期值”。然而,一旦消息真正进入队列,就没有办法执行 MQUPDATE 了。

问:如何通过“wsejb”绑定使用 JAX-RPC 客户机访问 EJB 服务的过载操作?如何通过 SIB 绑定直接使用 JAX-RPC 客户机访问 SIBus 出站服务目标的过载操作?这两个问题的背景是:我已经通过 SOAP 绑定使用 JAX-RPC 客户机成功地访问了标准 Web 服务的过载操作。如果目标 Web 服务通过 SOAP 出站端口集成到 SIBus 中,我还可以通过 SOAP 入站端口使用 JAX-RPC 客户机访问过载操作,但我无法通过 SIB 绑定直接使用 JAX-RPC 客户机访问 SIBus 出站服务目标的过载操作。

同时,如果目标 EJB 服务通过 RMI-IIOP 出站端口集成到 SIBus 中,我也无法访问 EJB 服务的过载操作。即使 EJB 服务没有集成到 SIBus 中,我还是不能通过 WSEJB 绑定使用 JAX-RPC 客户机访问过载操作。我怀疑 WSEJB 和 SIB 绑定不支持过载操作。我使用的是 WebSphere Application Server ND V6.0.0.1。

答:我首先想到的是,您应该避免使用过载操作。在 WSDL 中,我不赞成使用它,但它在 WDSL 1.1 中是可能的。过载操作与目前 Web 服务的 WSDL 描述的实际标准(称为包装的文档/文本)不兼容。而且,过载操作在 WSDL 2.0 中将被禁用。

EJB 绑定失败背后的原因是在跨 RMI/IIOP 发送消息时使用了称为“变形”的方法。我们不支持跨 WSEJB 的过载操作。Web 服务社区正力图改变过载操作的这种状态。

附加 API(针对使用 SIB 绑定名称空间的客户机)不能正常工作的原因还不清楚。可能有一个 Bug。我们不认为直接连接到出站服务是一个最佳实践。最好通过入站服务来避免这个问题。当然,即使您按照推荐方法避免使用了过载操作,您仍可能在第一个地方出现问题。

问:我正在使用 JAX-RPC 处理程序捕获传入的 SOAP 消息。由于客户机不能处理 SOAP 主体中的令牌,所以我必须将令牌放入 SOAP 头中。但不知何故,我只要一使用 it.getChildElements() 遍历 SOAP 主体,就会得到一个 SOAP 错误。我该如何纠正此问题?SOAP 消息如下:

?xml version="1.0" encoding="UTF-8" standalone="no" ?>
<SOAP-ENV:Envelope xmlns:SOAPSDK1="http://www.w3.org/2001/XMLSchema" 
xmlns:SOAPSDK2="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAPSDK3
="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/">
<SOAP-ENV:Body>
<CBOEligibilityRequest xmlns="http://test.com">
<CMSEBSHeader xmlns:SOAPSDK4="http://test.com">
  <HeaderVersion>1.0</HeaderVersion>
  <ServiceName>CBO_Request</ServiceName> 
  <ServiceVersion>1.0</ServiceVersion>   
  <ServiceType>CSR</ServiceType>
  <SecurityToken>UNKNOWN</SecurityToken> 
  </CMSEBSHeader>
  <MessageIdentifier xmlns:SOAPSDK5="http://test.com">FROMASPPAGE</MessageIdentifier> 
<CBOGroup xmlns:SOAPSDK6="http://test.com">
  <HICN>txtHICN</HICN> 
  <DOB>1989-01-21</DOB> 
  <LastName /> 
  <EntitlementType /> 
  <StartDt>1900-01-01</StartDt> 
  <Zip /> 
  </CBOGroup>
<CSRGroup xmlns:SOAPSDK7="http://test.com">
  <HICN>txtHICN</HICN> 
  <DOB>1989-01-21</DOB> 
  </CSRGroup>
  </CBOEligibilityRequest>
  </SOAP-ENV:Body>
  </SOAP-ENV:Envelope>
  

答:我没有足够的资料来回答您的问题。在该消息中,确实没有任何 SOAP 头,SOAP 头仍在消息主体中。我所能告诉您的是,该示例消息是格式正确的,但我也不明白为什么您在试图处理它时会出现异常。



参考资料



关于作者

作者的照片

Greg Flurry 是 IBM 企业集成解决方案小组的高级技术人员,主要负责帮助客户实施面向服务的解决方案和推动 IBM 的面向服务的产品的发展。




对本文的评价










回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款