随着 BPEL 的引进,SOA 已有了大的发展,现在可将业务流程(包含原子服务)可编排至可执行文件中。但是就到此为止了吗,或者说这就是可重用性以及灵活性可以达到的最高程度?
本文中,我们将介绍:Oracle 服务注册表 (OSR)。您将从中了解到如何在不牺牲性能的情况下放松紧密耦合的 BPEL 流程,同时创建一个使企业受益的可重用且可发现的文件库。
设置
示例场景包含两个 BPEL 流程:一个主流程 (MasterProcess),它用以调用另一个名为 CalleeProcess 的流程。一般而言,构建场景时,主流程与它的服务通过引用其具体的绑定定义 (WSDL) 紧密耦合。
创建了 BPEL 流程后,创建者已确定了该流程提供的消息模式。根据其操作,可以是异步或同步。
请看以下的 CalleeProcess 定义。
在上述示例中,流程的服务接口提供了一个称为“process”的操作,该操作在其内部定义了一个输入 (CalleeProcessRequestMessage) 和一个输出 (CalleeProcessResponseMessage) 消息。
此时,BPEL 流程不包含任何有关其所在位置或用何种技术调用它的信息。
将 BPEL 流程部署到服务后,应实现 WSDL 接口并添加一个物理端点。此时,其定义将由抽象转为具体。
现在,流程 (CalleeProcess) 已变成了一个服务,可以通过使用其具体的 WSDL 位置并将将其作为 partnerlink 的基础,在另一个流程中重用它。
部署成功后,就可以调用 MasterProcess 了。这将触发 CalleeProcess 的执行,而其通信是完全在内存中处理的。
将服务绑定从 BPEL 流程剥离
准备工作完成后,实现松散耦合系统的第一步,就是将实施从 CalleeProcess(从 MasterProcess 调用)的定义中剥离。
将该模式应用到 BPEL 流程可带来极大的灵活性,这是因为无需更改流程本身即可更改所使用的特定服务实施。
在本步骤中,将具体的服务定义注册到 OSR 后,它在整个企业中都可被发现了。
根据 UDDI 数据模型,服务是业务(允许按用途分组)的细目。(注意:业务与可视性没有联系。)
只需在 UDDI 业务实体下发布一个 WSDL 就可以添加服务定义(本例中为 CalleeProcess 的服务定义),如下所示。
完成发布过程后,可将服务定义添加到业务 (DynamicDiscoveryBusiness),为 CalleeProcess 创建一个 UDDI 项,以及添加一个与物理端点的绑定。
现在,服务注册表的 UI 中唯一可发现就是物理端点,调用服务需要调用对该端点。要使动态绑定与技术和实施无关,需要添加一个新绑定。该绑定的类型为 wsdlDeployment,它将由 BPEL 引擎在运行时使用。
现在,可以应用 BPEL 流程并向 BPEL 域添加关键信息以实现动态的服务注册表查询。首先,需要向 Partnerlink 添加 CalleeProcess 的唯一服务键。单击服务项的细目可找到该键。
正如“利用 ESB 虚拟化 BPEL 流程服务端点”中所述,partnerlink 可包含特定的属性,用于修改或增强其运行时行为。在本例中,该标志名为 registryServiceKey,它是使 BPEL 服务器在运行时发现 OSR 中具体服务定义的一个 UDDI 唯一标识符。
实现查询所需的最后一个信息是配置 BPEL 服务器,包含有关目标 OSR 实例位置 (uddiLocation) 的信息;如果要加强安全性,还可包含用户名 (uddiUsername) 和口令 (uddiPassword)。
为什么要应用这些更改?现在,流程与服务的物理实施相分离,流程能够在运行时查询 OSR 实例以检索和调用端点。这意味着,在硬件或软件发生变化时,不必修改流程配置就可以移动服务,这是因为所有信息都存储在服务注册表中。
最后一步是接受具体的 WSDL,图片中没有显示出 partnerlink。重要的是,BPEL 编译器 (bpelc) 需要有关操作和类型的信息,以确保部署前的类型完整性。但没有必要提供所有绑定信息。
这意味着将使用抽象的 WSDL,而不是提供具体的 WSDL。再次查看流程描述符,其中将揭示其位置。
如上所示,并不是将 wsdlLocation 属性指向 CalleeProcess 具体的 WSDL。
重新编译和部署流程将实现我们期望达到的松散耦合度。
该流程没有包含任何有关用于实施服务的技术或其端点的信息。
结论
在 MasterProcess 知晓技术以及其调用的流程 (CalleeProcess) 位置的前提下,完全独立于业务流程实现动态绑定并管理端点和属性是多么容易呀。
关键信息现在位于可搜索的、符合 UDDI v3 的注册表中,可在运行时发现这些信息,从而使流程可以提供最大限度的灵活性。尽管引入了另一个组件,但使用方与提供方之间的性能并未降低太多,这应归功于注册表精确的内存中查找以及端点调用。