级别: 中级 Chao M Beck, 软件工程师, IBM Anbumunee Ponniah, 顾问软件工程师, IBM Mark B Coats, 顾问软件工程师, IBM
2009 年 8 月 10 日 本系列文章介绍 IBM® WebSphere® Application Server V7 Feature Pack for SCA,本文是其中的第 3 部分,将详细介绍此功能部件包对指定与 SCA 策略框架和 SCA 转换规范兼容的服务质量(Quality of Service,QoS)需求的支持。此功能部件包提供了通过意图描述抽象策略需求的框架,可通过使用策略集对服务和引用应用特定的功能或约束。在相应的部分将重点介绍这些功能的使用示例。
引言
IBM WebSphere Application Server Feature Pack for Service Component Architecture (SCA) 提供了一个框架,用于通过 SCA 意图描述抽象策略需求和通过 SCA 策略集对服务或引用应用特定的功能或约束。SCA 意图是关于用于描述 SCA 组件、服务和引用的需求的特定服务质量(Quality of Service,QoS)的抽象断言。策略定义特定的功能或约束。SCA 中的策略通过 PolicySet 元素与服务和引用关联。意图通常是开发人员用于指定服务的预期行为所需的广泛断言。组织人员和开发人员可以选择使用这些意图作为指南,将其与相应的具体策略关联。
此功能部件包支持:
- 意图
- 策略
- 交互式(基于 WS Policy 和 WS Policy 附件的现有标准):
- 实现:
交互式意图和策略指影响服务和引用间的交互的约束。实现类型指定 SCA 容器应该如何调整环境的条件,以恰当地执行组件。
交互式意图和策略
身份验证、机密性和完整性
当需要保护对数据和服务的访问时,或需要保护客户端和服务之间传输的数据时,应用程序将使用安全意图:
- 身份验证意图指示客户端必须对自己进行身份验证,以调用 SCA 服务。
- 机密性意图指示消息的内容受到保护,只能供授权用户访问。
- 完整性意图指示需要确保消息在发送方和接收方之间进行传输时未被篡改或修改。
Feature Pack for SCA 当前仅支持将身份验证、机密性、完整性和可靠消息传递安全意图用于使用 WS 绑定时。如果意图要在通信协议的传输层执行,则可以使用“transport”限定符对这些安全意图进行限定;如果意图在消息级别实现,则使用“message”。
对于机密性意图,指定 transport 限定符会导致数据由传输协议(如 https)进行加密;而指定 message 限定符时,会加密消息本身(仅主体或含 Header)。
图 1 描述了 SCA 如何集成意图和策略。
图 1. QoS 集成
安全意图在 binding.ws 元素上指定。例如,当引用的服务传入和传出的数据需要保密时,通过加密消息实现这个机密性,您将在其 SCDL 文件中执行以下行(对于“sampleReference”服务):
清单 1
<reference name="sampleReference">
<binding.ws requires="confidentiality.message"
...
/>
</reference> |
要指定需求,让服务的所有访问通过传输协议进行身份验证,则 SCDL 文件可能与以下所示类似(“AccountService”服务):
清单 2
<service name="AccountService">
<binding.ws requires="authentication.transport"
...
/>
</service> |
保证这个断言的具体策略由 WebSphere Application Server V7.0 提供,可以供 SCA 服务、引用和组件使用。
您可以将这些具体策略集使用 WebSphere Application Server 管理控制台附加到服务提供者和服务引用。策略集的实例由策略的集合构成。例如,WS-I RSP 缺省策略集由 WS-Security、WS-Addressing 和 WS-ReliableMessaging 策略类型的实例构成。策略集使用名称标识,该名称在整个单元中具有唯一性。
服务可以通过将其附加到提供者、其端点或操作进行配置。类似地,也可以将策略集附加到服务引用、其端点或操作。WebSphere Application Server 还支持将策略集附加到组合单元中的所有引用或所有提供者。
WebSphere Application Server 提供预配置的策略集,可将其作为起点针对特定需求进行自定义。附加的策略集可以使用特定于组合单元的绑定(特定于应用程序的绑定)或使用通用绑定进行进一步自定义。通用绑定是安全域的全局绑定,可以跨应用程序和组合单元共享。
图 2. 从缺省存储库导入其他策略集
通过在 binding 元素的 qos.wsPolicySet 属性指定需求,可以将 SCA 组件服务或引用配置为需要特定的 Web 服务策略。下面的 SCDL 代码片段指定了附加到 service 元素(清单 3)和 reference 元素(清单 4)的“WSHTTPS Default”策略集:
清单 3
<service name="AccountService">
<binding.ws
qos.wsPolicySet="WSHTTPS default"
...
/>
</service> |
清单 4
<reference name="AccountServiceReference">
<binding.ws
qos.wsPolicySet="WSHTTPS default"
...
/>
</reference> |
已经导入了多个公共策略集,可供附加到服务和客户端组合单元。为了便于参考,图 3 中显示了当前已经导入可供使用的预配置策略集列表。
图 3. 在 Websphere Application Server 管理控制台中导入的策略集
可靠消息传递
可靠消息传递策略允许您控制服务间请求的可靠性,包括交付顺序和交付保证。意图通过 binding 元素在操作级别应用,具体的策略由 WebSphere Application Server 的 WS-ReliableMessaging 策略集提供。WS-ReliableMessaging 所实现的 QoS 级别取决于持续性级别和用于管理可靠消息传递状态的数据存储提供的事务支持。WebSphere Application Server 提供的 Feature Pack for SCA 使用 SOAP over HTTP 绑定实现这些服务限定:
- Unmanaged-non-persistent 是非事务性的,用于重新发送网络上丢失的消息;不过,如果服务器停机,将会丢失待定请求,而且无法在集群中工作。
- Managed-non-persistent 使用消息引擎存储请求,因此您可以在网络或服务器发生故障时恢复丢失的消息。不过,Managed-non-persistent 类型的消息会在消息引擎重启时丢失。这种类型的请求可以使用集群部署,也可以在单服务器安装中使用。
- Managed-persistent 最可靠,使用消息引擎,并进行存储来保存消息,不受服务器和消息引擎重启影响。
如果用例需要将服务的消息存储在消息引擎中,并跨服务器重启,则需要在其 SCDL 中指定以下代码(对于“OrderStatusService”服务):
清单 5
<binding.ws wsdlElement="http://jdbc.sca.orderstatus#wsdl.port
(OrderStatusServiceWebService/OrderStatusServiceSOAP11port)"
qos:wsPolicySet="WSReliableMessaging persistent"
/> |
在 Web 容器内运行并使用托管 QoS 的应用程序可以使用 WS-ReliableMessaging 提供事务可恢复消息。受支持的属性包括:
- JAX-WS 请求上下文映射包括 enableTransactedOneWay 属性,如果需要此行为,可以将其设置为 true。
- inOrderDelivery 属性在管理控制台中作为选项提供,也可以在配置 WS-ReliableMessaging 策略时通过 wsadmin 工具将该属性设置为“true”。
有关详细信息,请参阅参考资料。
实现策略
安全策略
SCA 授权策略控制能够访问 SCA 资源的用户、组和角色。SCA 对用户-角色使用 <allow>、<deny>、<permitAll> 和 <denyAll> 来控制访问权限。安全标识声明用于执行操作的角色。SCA 定义类似于 Java™ EE 的基于角色的权限模型。这些安全断言在 definition.xml 文件中使用 policySet SCA 元素进行定义。definition.xml 文件必须打包在包含需要访问控制的 SCA 资源所在的同一 JAR 文件中。
策略管理员使用与以下所示类似的 SCA 策略集创建 definition.xml:
清单 6
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://www.osoa.org/xmlns/sca/1.0"
targetNamespace="http://application.workload"
xmlns:sca="http://www.osoa.org/xmlns/sca/1.0">
<policySet name="ERWW1AdminPolicy"
appliesTo="sca:implementation.java">
<authorization>
<allow roles="policyadmin superintendent"/>
</authorization>
<securityIdentity>
<runAs role="policyadmin"/>
</securityIdentity>
</policySet>
</definitions> |
组装人员然后将这个 SCA 策略集附加到 SCA 组合;SCDL 代码中附加策略集的代码如下所示:
清单 7
<component name="ConvertInputOutputServiceComponent">
<implementation.java class="convert.inputoutput.sca.ConvertServiceImpl"
policySets="erww:ERWW1AdminPolicy" /> |
清单 7 中的 definition.xml 文件演示了将应用到 implementation.java 中的 SCA 策略集,在附加之后,用户角色策略管理员和负责人可以调用服务并使用“policyadmin”安全标识执行 ConvertService() 操作。
部署人员然后将用户或组分配到为组合定义的角色,并将用户分配到组合中定义的 runAs 角色。
definition.xml 文件必须打包在与对其进行引用的组合相同的资源(JAR 或 EAR 文件)中。角色分配在配置单元范围内进行,如果没有附加到元素的显式策略断言,则将应用从其祖先元素继承的策略。没有附加策略集时,缺省将在不受保护的情况下运行。当遇到多个策略集或 allow/deny 组合时,deny 角色将覆盖 allow 角色和将导致验证错误的冲突元素(如 denyAll 和 permitAll)。
请注意,打包为 WAR (Web Archives) 文件的组合中不支持 SCA 授权策略。
事务策略
Feature Pack for SCA 提供了实现和交互策略,为组件和交互提供事务 QoS。事务策略可以使用意图在组件实现、SCDL 中的绑定或特定于语言的 Annotation 上指定。SCA 运行时为组件提供事务环境,以便彼此进行交互和协调。
实现事务意图
与事务相关的意图在 SCDL 中的 implementation 元素指定。
- 全局事务
SCA managedTransaction.global 意图用于指示组件将在全局事务中操作。此意图定义工作范围单位,在此范围内事务具有原子性。事务可以使用运行分布式请求的多个事务资源或多个远程服务提供者。当使用多个事务资源管理器时,SCA 容器使用一个两阶段提交实现原子性。全局事务可以传播到此组件使用的服务。清单 8 显示了使用 managedTransaction.global 的示例。
清单 8
<component name="PaymentComponent">
<implementation.java class="payment.PaymentServiceImpl"
requires="managedTransaction.global"/>
</component> |
- 本地事务
本地事务是组件需要在缺少有效的全局事务的情况下在扩展资源管理器本地事务(Resource Manager Local Transaction,RMLT)中操作的事务。将此类事务称为在本地事务容器(Local Transaction Containment,LTC)中运行,将在服务方法结束时结束:
- managedTransaction.local 定义允许访问多个资源管理器的事务范围。在成功完成范围确定服务方法时,要求所有交互进行提交,否则在遇到非业务异常时进行隐式回滚。不过,各个 RMLT 可以在不影响与其他 RMLT 交互的情况下独立失败。本地事务不能进行传播。下面是使用 managedTransaction.local 的 SCA 组件的示例:
清单 9
<component name="PaymentComponent">
<implementation.java class="payment.PaymentServiceImpl"
requires="managedTransaction.local"/>
</component> |
- noManagedTransaction 组件在没有托管事务(全局事务或 LTC)的情况下运行。应用程序或各个资源管理器负责提交或回滚交互。例如:
清单 10
<component name="PaymentComponent">
<implementation.java class="payment.PaymentServiceImpl"
requires="noManagedTransaction"/>
</component> |
Feature Pack for SCA V1.0 的缺省交互范围为 managedTransaction.global。
交互事务意图
这些意图在交互级别指定,通常在 SCDL 的 binding 元素中。受支持的交互意图有:
- suspendsTransaction 意图将导致调用方的事务上下文不传播到被调用的服务。在 reference 元素上指定时,此意图不传播调用服务的事务上下文。而在 service 元素上指定时,则不会参与调用方的事务并启动新的全局事务。
- 在引用上指定时,propagatesTransaction 意图指示当前事务上下文将传播到被调用的服务。在服务上指定时,此意图将指示服务将在调用方的全局事务中运行(如果有全局事务),如果没有全局事务则将启动新的全局事务。在单向服务上传播事务是错误的。另外,当组件采用 noManagedTransaction 实现意图时,指定交互意图也是错误的。
总结
通过 SCA 策略框架,可以使用 SCA 意图在更高的级别指定服务约束,而让组装人员、部署人员或管理员选择具体的策略。本文介绍了 SCA 意图的主要功能和 Feature Pack for SCA 支持的策略集,以及它们在 WebSphere Application Server V7 中的用途和常见使用方法。通过这些功能,组装人员可以提供基于操作环境和需求的以不同方式工作的服务组合,无需更改底层业务逻辑本身,而且同时还能与 SCA 概念的发展保持同步。在下面的示例用户场景中提供了示例用例和典型实现。
示例场景
用例:商品付款
描述:此用例演示客户如何完成支付事务。此事务需要用户提供保密信息,以便应用程序在预先设置的帐户中收取费用,然后将订单标记为已支付。
前提条件:此用例仅说明给定应用程序的支付部分。已经设置并激活了用户登录和密码信息。支付将通过选择具有足够余额完成交易的客户帐户进行。
基本流:
- 客户输入站点的 URL。
- 客户使用有效用户 ID 和密码登录。
- 应用程序显示商品列表供客户选择。
- 客户从列表中选择一个或多个要购买的商品。
- 客户表明要支付所选商品的意图。
- 应用程序显示足够支付待付金额的预定义支付帐户。
- 客户选择支付方法。
- 应用程序提示用户输入安全支付信息。
- 客户提供安全支付信息。
- 系统从帐户扣除费用。
- 应用程序将订单标记为已支付。
- 系统记录支付事务,并向客户提供确认号。
备选流 1:步骤 2 失败。将用户定向回登录提示界面。
备选流 2:步骤 9 身份验证失败。用户返回步骤 6。
备选流 3:步骤 10 到 12 失败。用户返回步骤 6。
此用例给出的场景能够演示一部分 SCA QoS 意图和策略。在上面的流中:
- 步骤 2 中的身份验证需求可以通过使用 WS 策略集 WSHTTPS 实现。
- 客户在步骤 8 中传递的信息是保密的,机密性 SCA 策略意图将确保敏感信息的保护。
- 步骤 10 和 12 之间的操作需要成为单个原子操作,可以指定 SCA 事务意图来实现。
典型的实现将包括以下组件:
- 客户端用户界面
- InputPortlet:从用户收集信息,并基于控制流显示输出数据。
- 服务器服务
- WelcomeService:为 InputPortlet 提供信息,以作为欢迎屏幕的一部分进行显示。
- ListItemsService:从永久存储检索商品列表,以向客户显示。
- PaySessionService:编排支付会话。
- ProcessPayment:发布和授权支付。此服务将返回支付 ID。
- updateItems:如果成功处理支付,则将商品标记为已支付。
- LogHistory:记录支付事务的审核跟踪信息。
这个典型的实现将具有与以下所示类似的技术流:
- InputPortlet 显示站点的欢迎面板。
- InputPortlet 使用 Web 服务 LTPA WSSecurity 缺省策略集确保消息。服务端 SCDL 将与清单 11 所示类似,而引用端 SCDL 将与清单 12 所示类似。
清单 11
<service name="WelcomeService">
<binding.ws wsdlElement="http://session.pay.WecomeService/#wsdl.port
(WecomeService/WecomeService)" requires="authentication.transport"
qos:wsPolicySet="LTPA WSSecurity default"
...
/>
</service> |
清单 12
<reference name="WelcomeService"
target="WelcomeServiceComponent/WelcomeService">
...
<binding.ws wsdlElement="http://sca.WelcomeService#wsdl.port
(WelcomeServiceWebService/WelcomeServiceSOAP11port)"
qos:wsPolicySet="LTPA WSSecurity default"/>
</reference> |
WSSecurity 具体策略集 LTPA 在运行时附加到服务。对于服务端,可以通过进入管理控制台并导航到 Applications => Application Types => Business-level applications 来附加策略集。导航到包含 WelcomeService 的业务级应用程序,然后找到包含 WelcomeService 的组合单元(Composition Unit,CU),并单击 Service provider policy sets and bindings(图 4)。
图 4. 用于管理 CU、附加到策略集的面板
在下一个面板(图 5)上,选中 WelcomeService 行并在下拉菜单中单击 Attach Policy Set。从列表中选择 LTPA WSSecurity default,并按照提示保存配置。
图 5. 附加策略集
在客户端上,按照与服务端相同的步骤访问策略集,但选择客户端 BLA、组合和服务。
- 在后续服务调用中显示的信息需要保密。ListItemsService 可以指定机密性意图:
清单 13
<service name="listItemsService">
<binding.ws requires="confidentiality.message"
qos:wsPolicySet="LTPA WSSecurity default"
...
/>
</service> |
附加具体策略和绑定的步骤与步骤 2 完全一样。
- PaySessionService 收集客户信息并按顺序依次调用 processPayment 服务、updateItems 服务和 logHistory 服务。如果顺利完成,没有出错,服务然后将向客户返回支付确认 ID。processPayment 和 updateItems 服务需要归入单个原子事务中。因此,PaySessionService 的 SCDL 文件中包含以下代码片段:
清单 14
<component name="PaymentComponent">
<implementation.java class="payment.PaymentServiceImpl"
requires="managedTransaction.global"/>
<reference name="processPayment" target="ProcessComponent"
requires="propagatesTransaction" />
<reference name="updateItems" target="UpdateComponent"
requires="propagatesTransaction" />
<reference name="logHistory" target="AuditComponent"
requires="suspendsTransaction" />
</component> |
如果服务和引用不使用 binding.ws,则事务意图不需要显式策略集附加。不过,在事务行为需要在 WS 绑定上进行时,应该将 qos:wsPolicySet 属性设置为“WSTransaction”值,否则就必须使用相同的步骤通过管理控制台附加这个 WS 策略。
- 到 PaySessionService 的消息交付需要通过设置 WS-ReliableMessaging 持久 SCA 策略集进行保证:
清单 15
<component name="PaymentComponent">
<service name="PaySessionService ">
<interface.wsdl xmlns:wsdli="http://www.w3.org/2006/01/wsdl-instance"
interface="http://session.pay#wsdl.interface(PaySessionService)"
wsdli:wsdlLocation="http://session.pay PaySessionService.wsdl"/>
<binding.ws wsdlElement="http://session.pay#wsdl.port(PaySessionWebService/
PaySessionServiceSOAP11port)" qos:wsPolicySet="WSReliableMessaging
persistent"/>
</service>
<reference name="processPayment" target="ProcessComponent"
requires="propagatesTransaction" />
<reference name="updateItems" target="UpdateComponent"
requires="propagatesTransaction" />
<reference name="logHistory" target="AuditComponent"
requires="suspendsTransaction" />
</component> |
除了前面讨论过的用于附加策略集的过程外,WS-ReliableMessaging 持久策略集还需要使用总线和消息传递引擎。然后需要为服务和客户端创建策略绑定。对于此示例,需要创建总线并配置消息传递引擎:
- 要创建总线,请从管理控制台中导航到 Service Integration => Buses => New。输入名称,然后单击 Finish。
图 6. 创建后的总线
- 接下来,您将创建总线成员。单击新创建的总线,然后选择 Bus members => Add。从下拉菜单中选择要添加到总线的服务器或集群。单击 Next。
- 在下一个面板上,选中 Enable messaging engine policy assistance 和 High availability 选项,然后单击 Next。
- 选择用于进行持久操作的文件或数据存储,然后单击 Next。
- 单击 Is the message store configured。根据需要对值进行自定义,然后单击 Next。
- 如果需要,对性能参数进行调整,然后单击 Finish,从而添加总线成员并创建消息传递引擎。此时,您必须重新启动服务器。
接下来,创建服务和客户端策略集绑定:
- 要创建服务策略集绑定,请从管理控制台导航到 Services => Policy Sets => General Provider policy set bindings。单击 New。输入绑定配置名称,如
PayServiceBind(图 7),然后单击 Add。
- 从列表中选择 WS-ReliableMessaging。选择之前创建的总线和消息传递引擎,然后单击 OK。
- 重复这些步骤以创建客户端策略集绑定:从管理控制台中选择 Services => General client policy set bindings,以创建新的客户端绑定。
图 7. 创建新服务策略集绑定
- 接下来,附加客户端和服务的策略集绑定。从管理控制台中,导航到 Application types => Business Level Application => Paymentcomposite => PaySessionComposite => Service Provider Policy Sets and Bindings。
- 选择 PaySessionService,单击 Assign Binding,并从下拉列表中选择上面创建的服务绑定 PayServiceBind。
图 8. 向服务分配绑定
- 在客户端上导航到客户端 BLA、CU 和客户端绑定面板执行相同的步骤。
这就完成了将 WS-ReliableMessaging 策略集附加到应用程序所需的配置步骤。
- 将返回新支付 ID,用于确认是否已成功完成所有步骤。
参考资料 学习
获得产品和技术
作者简介  | |  |
Chao Beck 是服务组件体系结构(Service Component Architecture,SCA)功能包早期计划的技术负责人。她是 Application Integration Middleware 早期计划团队的老资格成员,负责执行 IBM WebSphere Application Server 产品的早期计划。她处理新产品功能的教育开发和交付,并在 GA 前(早期)计划和 GA 后(客户促进)计划期间提供客户支持。 |
 | |  | Anbumunee Ponniah 是 SCA Feature Pack 团队的高级测试人员/开发人员。 |
 | |  |
Mark Coats 是一名 WebSpere Application Server 高级开发人员,他关注的领域是 Web 服务和管理控制台。在以前的工作中,他曾是 CORBA 对象请求代理的开发人员和 Attachmate Corporation 公司的通信系统工程师。 |
对本文的评价
|