随着企业规模的不断发展,越来越多的企业希望能够快速架设多种业务,以满足内部和外部客户不断增长的应用需求,提高企业的整合能力和客户满意度。引入服务综合网关(SIG,Service Integration Gateway),目的是实现业务的互通 / 融合,提供统一的业务能力和业务平台的接入。各业务平台间不再需要分别建设互通网关,只需一个统一的接口接入综合网关,即可调用各种开放的业务能力,构建更丰富的业务特征;不再需要关注被调用者的组网、业务部署、业务控制及与其它业务的紧密相关情况,只需要按照综合网关定义的标准要求接入综合网关,利用综合网关统一实现业务能力调用。
本文首先给出一个服务综合网关的模拟应用场景,然后结合 WESB 7.0 产品的新功能进行场景分析,最后使用 WebSphere Integration Developer(以下简称 WID)7.0 给出一套完整的解决方案。目的是通过对这一模拟实际应用场景的实现,一方面揭示 WESB 7.0 产品的强大新功能,另一方面告诉用户如何在实际应用中使用这些功能。
本文假设您熟悉服务组件体系结构(Service Component Architecture,SCA)编程模型,并具有使用 WID 和 WESB 或 WebSphere Process Server(以下简称 WPS)开发应用程序的经验。
ServiceGateway 是 WESB 产品的一个重要功能,它的作用是为了能够处理各种不同格式的接入和调用消息,实现一个通用的消息处理网关。其开放的 ServiceGateway 接口不仅支持基于 SOAP 的 Web Service 协议,还支持 HTTP、MQ、JMS 等主流协议。最重要的是,在 WESB 7.0 版本中对 ServiceGateway 的功能进行了重大完善,引入了 ProxyGateway 的概念,支持通过虚拟服务(Virtual Service)名称进行动态路由,实现了一个真正意义上服务网关的功能。而且新开发的 Native Data Data Handler、Gateway BodyAware、SOAP 异常处理等功能大大提高了 ServiceGateway 的健壮性和易用性,利用这些新功能用户可以方便快速的部署一个综合网关。
综合网关主要包括业务能力调用、业务控制功能、业务能力接入、通用管理功能和管理控制接口集合 5 个功能模块。为了更清楚的描述问题,下面 图 1 给出一个模拟的服务综合网关应用场景,本文将围绕这个应用场景展开说明。
图 1. 服务综合网关应用场景
本文将利用 WESB 7.0 的新功能实现 图 1 所示的服务综合网关,包括业务能力调用、业务控制功能和业务能力接入。其中,业务控制部分将实现消息校验、路由控制和 SLA 控制功能,通用管理功能部分将实现日志记录功能。此外,还包括整个系统的业务异常、运行时异常处理等功能。
根据 图 1 所示的应用场景,由于要实现的是一个综合服务网关,不得不提到 WESB 产品的一个重要功能 ServiceGateway。它作用就是为了能够处理各种不同格式的接入和调用消息,实现一个通用的消息处理网关。而且在 WESB 7.0 版本中对 ServiceGateway 的功能进行了重大完善,引入了 ProxyGateway 的概念,实现了一个真正意义上服务网关的功能。本文将演示如何使用该功能方便快速的部署一个综合网关。
业务能力调用:从 图 1 可以看到业务平台通过综合网关调用业务能力,这里使用基于 SOAP 的 Web Service 接口协议供自有的业务平台或者第三方应用调用。提供开放的接口是 WESB 产品的基本功能,同时 ServiceGateway 接口具有通用消息处理能力,能够处理各种不同格式的调用消息,因此这里只需要创建两个 ServiceGateway 的 Export 来分别覆盖 SOAP 1.1 和 SOAP 1.2 两种协议即可。
业务能力接入:从 图 1 可以看到综合网关通过定义的业务能力接入接口实现业务接入功能,同样使用的是基于 SOAP 的 Web Service 接口。由于综合网关面向各种开放的业务能力,为了实现接入不同的服务,类似的只需要创建两个 ServiceGateway 的 Import 来分别覆盖 SOAP 1.1 和 SOAP 1.2 两种协议即可。
业务控制功能:该部分完成综合网关的核心处理功能,包括消息校验、路由控制、SLA 控制等核心功能。WESB 提供了一系列的中介原语(Mediation Primitive),借助于 WID 工具可以方便的对中介流(Mediation Flow)进行操作。例如,MessageValidator 中介原语用来实现消息校验功能;GatewayEndpointLookup 中介原语可以基于 WSRR 和 Built-in Configuration Store 进行可用服务查找,进而实现动态路由功能;SLACheck 中介原语可以实现 SLA(Service Level Agreement)相关的功能。
此外,对于通用管理模块中的日志记录功能可以采用 MessageLogger 中介原语实现。运行时异常处理可以采用 CustomMediation 中介原语通过 Java 代码方便的实现,业务异常只需要把封装好的异常消息返回,Fault Flow 可以自动处理。其中用到的 SOAP 异常处理功能是 WESB 7.0 产品在异常处理方面的一个重要增强。它不仅真正意义上支持业务异常(Business Fault)处理,而且增强了对运行时异常(Runtime Fault)处理的支持。
基于上面的场景分析,需要利用 WESB 的 ServiceGateway 功能来构建服务综合网关。同时,为了方便实现和说明问题,本实现中仅选取手机邮箱,下载和铃声 3 个应用服务作为业务示例。本节使用 WID 7.0 分步骤给出具体的实现过程,并对其中用到的 WESB 功能点进行简要的描述。
第一步,创建 Library 并定义接口(Interface)。
这一步需要定义传输消息使用的数据类型和各个业务能力提供者使用的接口。根据综合网关协议的通用原则,综合网关只解析消息头(SOAP Header)来进行各种控制,消息体(SOAP Body)中的信息由各业务平台 / 能力定义,综合网关不做解析。综合分析本示例中使用的数据类型,给出其定义如下 图 2 所示:
图 2. 接口数据类型定义
另外,对于手机邮箱、下载、铃声 3 个应用服务分别定义 3 个接口 MailBoxInterface、DownloadInterface 和 RingtoneInterface,具体的接口定义比较常规,请参见下载中附件,这里不做赘述。
第二步,创建综合服务网关模块。
根据前面的场景分析,本文采用 ProxyGateway 来实现综合网关模块。为了便于说明综合网关的具体实现,这里有必要先简要介绍一下 ProxyGateway 的原理。ProxyGateway 是一种特殊的 ServiceGateway,它支持通过虚拟服务(Virtual Service)名称进行动态路由。其工作流程如下 图 3 所示。
图 3. ProxyGateway 工作流程示例
首先,客户端发送一个请求消息,目的 URL 为 http://zzz/Gold,这里 http://zzz 是 ProxyGateway 的地址,Gold 是 Virtual Service 的名字;然后,消息进入 Mediation Flow,GatewayEndpointLookup 中介原语从该 URL 中提取出 Virtual Service 的名字,到基于 BusinessSpace 的 Built-in Configuration Store 中进行查找,发现 Gold 这个服务映射的真实服务地址是 http://aaa/premiumservice,返回并按此地址进行路由;最后动态调用该服务。
这里,可以明显的看到,相比之前的版本,ProxyGateway 实现了真正业务层面的动态路由,实现了真正意义上的服务网关的概念。下面介绍 ProxyGateway 在 WID 7.0 中的具体实现。
首先,导入 ServiceGateway 接口,因为该 Interface 是预定义的接口,需要在 WID 中 GatewayModule/Dependencies/Predefined Resources 下勾选相应的 Interface 和 DataHandler 选项才能使用,如下 图 4 所示:
图 4. 配置 Predefined Resources
其次,创建 ProxyGateway 模块,其装配图如下 图 5 所示:
图 5. ProxyGateway 模块装配图
这里使用的是 WebService Binding,Export 和 Import 都采用 ServiceGateway 的 Interface,这也是我们通常所说典型的 Dynamic ServiceGateway。需要注意的是,Data fomat 采用 Native Data Data Handler 取代了以前版本中的 Service Gateway Text Data Handler。这是 WESB 7.0 的一个新功能,它终结了以前每一个协议接口(MQ,JMS,HTTP,Web Service)都使用单独的 Data Binding 的历史,整合为统一的 Native Data Data Handler,而且在使用 WID 7.0 创建 ServiceGateway 的过程中自动设置为默认值,大大增强了 ServiceGateway 的易用性。
其次,实现中介流组件(MFC),包括 Request Flow 和 Response Flow。其中,Request Flow 的设计如下 图 6 所示。
图 6. Request Flow 的设计
可以看到,消息通过 Input 节点流入 Request Flow,先用 SetMessageType 中介原语把 headers/SOAPHeader[1]/value 设定为前面自定义的 SOAPHeader 类型 HeaderType,以便于 WID 识别;然后用 MessageLogger 中介原语记录日志,并 Promoted “Enabled”属性,使用 PolicyResolution 中介原语在运行时控制,作为是否记录日志的开关;之后到达 MessageValidator 中介原语根据设定的 Xpath 对消息进行校验,如果校验失败,进入 ValidatorFault 中介原语对错误信息进行封装,经 InputFault 节点返回客户端;校验通过则继续进入 GatewayEndpointLookup 中介原语根据设置进入 Built-in Configuration Store 或者 WSRR 查找可用的服务,如果没有找到服务,进入 noMatchFault 中介原语对错误信息进行封装,经 InputFault 节点返回客户端;如果找到服务,返回其地址并设置为 SMOHeader/Target/Address 属性的值;之后使用 MessageFilter 中介原语过滤消息,如果是 SOAP 1.1 消息,那么流入 SLACheck 中介原语进行 SLA 校验;如果是 SOAP 1.2 消息,那么直接从 ServiceGatewayPartner1 流出动态调用该服务(这是因为目前的 SLACheck 中介原语还不能支持 SOAP 1.2 协议);对于 SOAP 1.1 消息,如果 SLA 校验失败,那么流入 rejectFault 中介原语对错误信息进行封装,经 InputFault 节点返回客户端;如果 SLA 校验通过,那么 OK 从 ServiceGatewayPartner 流出并动态调用该服务。
这里大多数的中介原语使用都比较简单,详细信息请参见下载中的附件。但是有一些中介原语是 WESB 7.0 上新开发的,还有一些 ServiceGateway 增强的新功能,这里对 Request Flow 的配置过程中需要注意的地方说明如下:
(1) 对于 Input 节点,勾选“Automatically convert the ServiceGateway message”属性,流入的 gateway 消息就会序列化为 Business Object,在中介流中就可以实现对 SMO Body 的访问。这是 WESB 7.0 上 ServiceGateway 的一个新功能,称之为 Gateway BodyAware。如下 图 7 所示:
图 7. 配置 Input 节点
(2) 对于 GatewayEndpointLookup 中介原语本文选用基于 URL 的查找方法,只需要添加一个 ProxyGroup 的名字,那么在 Server 上部署之后,便会自动在 BSpace 的 ProxyGateway Widget 中创建该 ProxyGroup。之后需要登录 BSpace Console,通过 ProxyGateway Widget 添加 Virtual Service 和真实地址之间的映射。如下 图 8 和 图 9 所示:
图 8. 配置 GatewayEndpointLookup 中介原语
图 9. 在 ProxyGateway widget 中配置 Virtual Service
(3) 对于 SLACheck 中介原语,需要指定 Endpoint、Consumer ID 和 Context ID 存放的 Xpath 路径来作为 SLA 的限制条件,同时在 WSRR 服务器上进行 SLA 相关的配置,这样在运行时 SLACheck 中介原语才能在 WSRR 服务器上查找到匹配这些条件的服务。本例的配置如下 图 10 所示:
图 10. 配置 SLA Check 中介原语
接下来是 Response Flow 的设计,这一部分相对比较简单,如下 图 11 所示:
图 11. Response Flow 的设计
从 Request Flow 的设计可以明显看出,在 ServiceGateway 的 Mediation Flow 中支持了 Fault Flow 的路由,对于应用服务中抛出的业务异常(ServiceBusinessException)能够正确的路由到 Fault Flow,这是 WESB 7.0 对业务异常处理的重大完善,以前版本中是不支持这一点的。另外和 Request Flow 一样,所有 Input 节点都需要 Enable 如上 图 7 所示的 Gateway BodyAware 属性,这么做主要是为了运行时异常(RuntimeException)处理的方便。如果使用了 ServiceGateway 的 BodyAware 功能,运行时异常处理只需要借助于 CustomMediation 中介原语使用少于 10 行的 Java 代码即可实现。这里以 GatewayEndpointLookup 中介原语的 noMatchFault 为例,其 Java 代码如下 清单 1所示:
清单 1. 运行时异常处理 Java 代码示例
// create newBody
ServiceMessageObjectFactory factory = ServiceMessageObjectFactory.INSTANCE;
DataObject newBody = factory.createServiceMessageObjectBody(new QName(
"http://JAM2010Lib/GenericFaultInterface", "FaultOp_fault1Msg"));
// create faultBO
DataObject exception = DataFactory.INSTANCE.create("http://JAM2010Lib", "FaultType");
exception.setString("name", "CustomException");
exception.setInt("msgType", 1);
exception.setInt("errorCode", 802);
exception.setString("errorMsg", "Can not find service in Built-in configuration store of
BusinessSpace in GatewayEndpointLookup1 primitive.");
// set SMO
newBody.set(0, exception);
smo.setBody(newBody);
// print SMO
System.out.println( com.ibm.wsspi.bo.BOPrinter.INSTANCE.toXMLString(smo) );
out.fire(smo);
|
第三步,创建业务能力模块。
本文中业务能力模块如前面所述,只选取手机邮箱、下载和铃声三个应用服务作为示例,分别创建三个模块,采用 Java Componnet 实现,创建 SOAP 1.1 或 SOAP 1.2 的 Export。其原理比较简单,图 12 是手机邮箱业务能力模块的组装图,其它业务模块的详细信息请参见下载中附件。
图 12. 手机邮箱模块的组装图
第四步,创建业务调用端。
对于业务调用端,本文采用 Web Service Java 客户端,使用 Axis2 的 API 封装 SOAP 消息,其详细源代码请参看下载中附件。这里仅给出业务调用端的 SOAP 请求消息示例,如下 表 2所示:
清单 2. SOAP 请求消息示例
<?xml version="1.0" encoding="utf-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header xmlns:ns1="http://GatewayLib">
<ns1:HeaderType>
<level>Gold</level>
<callerUID>caller_01</callerUID>
<callerSID>caller_openLog</callerSID>
<providerSID>provider_mailbox11</providerSID>
<providerEID>provider_mailbox11</providerEID>
<timeStamp>3/11/10 17:08:59:903 CST</timeStamp>
</ns1:HeaderType>
</soapenv:Header>
<soapenv:Body>
<ns1:getMailSize xmlns:ns1="http://GatewayLib/MailBoxInterface">
<ns1:input1>
<id>testMailBox001</id>
<msgType>0</msgType>
<opName>getMailContent</opName>
<msgContent>This is the request content of the mail.</msgContent>
</ns1:input1>
</ns1:getMailSize>
</soapenv:Body>
</soapenv:Envelope>
|
综上所述,本文给出了使用 WESB 7.0 新功能便捷实现服务综合网关的具体步骤。其中涵盖了业务能力调用、消息检验、动态路由、日志记录、SLA 校验和异常处理等重要功能。可以明显看到基于 ServiceGateway 功能的增强和 SOAP 异常处理机制的完善,再加上 Gateway BodyAware 等新功能的协助,原本繁琐的实现步骤变的简单快捷,在完善产品功能的同时大大提高了 WESB 产品的易用性,同时也增强了用户体验。
关于本例的所有源码都已放入下载中附件,读者如果有什么疑问,欢迎发邮件给作者咨询,我们将认真解答。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| 示例代码 | Sample_code.zip | 63KB | HTTP |
学习
-
利用 WID 和 WESB 构建基于 Mediation Flow 的 ESB Service(developerWorks 中国,2006 年 8 月)介绍了 WID 和 WESB 的基础知识。
- “基于WESB/WPS实现SOAP和JMS消息头的转换”:本文重点阐述如何基于WESB实现SOAP和JMS消息头的转换,以及如何在WESB中处理SOAP和JMS消息头。
- “Enterprise Service Bus 常见问题及解答”:本专题是企业服务总线 (Enterprise Service Bus,ESB) 以及 WebSphere 相关产品的问题集锦。它汇集了这个领域:新手们最困惑的问题、开发者们最常见的问题、行业用户们最关注的问题。解答深入浅出,通俗易懂。本专题将持续更新,敬请关注!
-
关于本文的 论坛讨论。
- developerWorks WebSphere 专区 :针对使用 WebSphere 产品的开发人员的技术信息和资源。developerWorks WebSphere 提供产品下载、how-to 信息、支持资源以及一个免费技术库,该技术库包含 2000 多篇技术文章、教程、最佳实践、IBM 红皮书和在线产品手册。无论您是初学者、专家还是介于二者之间,您都能发现使用基于开源标准的 WebSphere 软件平台构建企业级 SOA 解决方案所需的信息和资源。
获得产品和技术
- 从 WebSphere 下载中心,您可以获得最新的 WebSphere 产品的试用版和免费版,让您可以提前免费体验相关产品的强大功能。
讨论
- 参与论坛讨论。
- 查看
developerWorks 博客的最新信息。

