Oracle SOA 套件最佳實(shí)踐
2024-08-29 13:53:57
供稿:網(wǎng)友
在 SOA 環(huán)境中管理流程和服務(wù)依賴關(guān)系
背景
您知道 BPEL 流程依賴哪些服務(wù)嗎?如果使用了不同版本的 BPEL 流程,二者之間的依賴關(guān)系很快就會(huì)變得更加復(fù)雜。如果我們將 BPEL 流程調(diào)用的企業(yè)服務(wù)總線 (ESB) 服務(wù)考慮在內(nèi),依賴性管理的復(fù)雜度將提升。復(fù)雜度使得部署和測(cè)試耗時(shí)、困難且易于出錯(cuò)。
通常我們最后使用 Microsoft Visio 建模工具來手動(dòng)描繪依賴關(guān)系,并在流程每次更改后忙于更新依賴關(guān)系。這是一個(gè)阻礙面向服務(wù)的體系結(jié)構(gòu) (SOA) 基礎(chǔ)架構(gòu)敏捷性的主要羈絆,SOA 體系結(jié)構(gòu)的設(shè)計(jì)旨在實(shí)現(xiàn)業(yè)務(wù)流程的敏捷更改。
在這一技術(shù)說明中,將向您介紹如何成功地改善構(gòu)建流程,以及實(shí)現(xiàn)流程依賴關(guān)系圖的自動(dòng)生成。
我們的挑戰(zhàn)是為客戶實(shí)施一個(gè) Oracle SOA 套件示范項(xiàng)目,該項(xiàng)目包含許多 BPEL 流程,并引用眾多 BPEL 子流程和 ESB 服務(wù)。最后我們使用了十來個(gè) BPEL 流程和 ESB 服務(wù)(它們定義為公共服務(wù),在服務(wù)注冊(cè)表上共享)以及其他專有 BPEL 流程和 ESB 服務(wù)。
首先,我們決定為項(xiàng)目所有服務(wù)創(chuàng)建一個(gè)基于 Ant 的部署,將 BPEL 流程(包括執(zhí)行它們的測(cè)試用例)部署到不同環(huán)境 (測(cè)試、集成、生產(chǎn)) ,并通過基于 Ant 的方式將 ESB 服務(wù)也部署到這些環(huán)境。計(jì)算機(jī)電子書籍免費(fèi)下載
要求
完成首個(gè)項(xiàng)目版本后,我們有一些要求:
,
當(dāng)一個(gè) BPEL 流程或 ESB 服務(wù)更改后,我們不想部署項(xiàng)目的所有服務(wù)。所以我們需要將以項(xiàng)目為中心的部署轉(zhuǎn)變?yōu)橐怨卜?wù)為中心的部署方法。
在部署 BPEL 流程時(shí),所有依賴關(guān)系的 (專有) 子流程和 ESB 服務(wù)也將自動(dòng)部署。
為防止覆蓋特定版本的流程,只有服務(wù)器未部署該版本的流程時(shí)才進(jìn)行部署,覆蓋將導(dǎo)致所有實(shí)例流信息丟失。
在部署期間應(yīng)自動(dòng)創(chuàng)建所有流程和服務(wù)依賴關(guān)系的可視化圖形,不需另外維護(hù)這些信息。可視化圖應(yīng)該如下所示。
懸而未決的問題
針對(duì)這些新要求,我們提出了以下問題,并做出以下解答:
問題:來自流程和服務(wù)依賴關(guān)系的信息存儲(chǔ)在哪里?需要增加更多信息以創(chuàng)建完整的依賴關(guān)系圖嗎?
答案: BPEL 流程調(diào)用的所有服務(wù)都存儲(chǔ)在 partnerLinkBinding 標(biāo)記的 bpel.xml 文件中。對(duì)于調(diào)用的 BPEL 流程、版本信息也以編碼編入 URL 中。例如: 計(jì)算機(jī)電子書籍免費(fèi)下載
<PRoperty name="wsdlRuntimeLocation">
${domain_url}/CustomerAccount_BES/1.3/CustomerAccount_BES?wsdl
</property>
要部署的當(dāng)前版本的 BPEL 流程可以在 build.properties 文件中找到。對(duì)于 BPEL 流程的版本維護(hù),我們只需要更改 build.properties 文件中的 rev 屬性。
為區(qū)分公共和專有 BPEL 流程,bpel.xml 文件內(nèi)客戶端的合作伙伴鏈接提供了一個(gè)新屬性“type”,其值為“public”或“private”,如此處所示:
<partnerLinkBinding name="client">
<property name="wsdlLocation">CustomerAccount_BES.wsdl</property>
<property name="type">public</property>
</partnerLinkBinding>
問題:有可以動(dòng)態(tài)生成依賴關(guān)系圖的工具或框架嗎?
答案:有,一個(gè)開放源工具 Graphviz (www.graphviz.org) 可從文本格式的輸入文件生成圖形。
問題:引用其他 BPEL 流程的選項(xiàng)有哪些?
答案:選項(xiàng)有:
引用默認(rèn)版本
引用具體版本
引用 UDDI 服務(wù)鍵 (帶或不帶經(jīng)編碼的版本信息)
問題:如何能實(shí)現(xiàn)所有這些新的部署要求?
答案:使用自定義 Ant 任務(wù)可以最好地實(shí)現(xiàn)這些新部署要求。
開始工作
問題都得到了圓滿解答,下面我們著手創(chuàng)建一個(gè)自定義 Ant 任務(wù)。在 Ant 任務(wù)中將解析 bpel.xml 文件。對(duì)于找到的所有 partnerLinkBindings 標(biāo)簽,將以遞歸方式開始解析對(duì)應(yīng)的 bpel.xml 文件。除了解析,還將從每個(gè)找到的 BPEL 項(xiàng)目的 build.properties 文件中提取版本屬性(“ref”)的當(dāng)前值。遞歸解析的挑戰(zhàn)之一是跳過循環(huán)的依賴關(guān)系。
我們?cè)?bpel.xml 文件中新推出的“type”屬性和遞歸解析實(shí)現(xiàn)了我們以服務(wù)心中的部署的所有需求。
更棒的是,我們使用 Graphviz 解決了依賴關(guān)系圖的自動(dòng)生成問題。為達(dá)到此目的,我們要將從遞歸 bpel.xml 解析中得到的所有依賴關(guān)系合并為一個(gè) XML 文件,如下所示。 計(jì)算機(jī)電子書籍免費(fèi)下載
<?xml version="1.0" encoding="UTF-8"?>
<BPELSuitcase>
<BPELProcess id="Resource_BAS_SetForAccount" src="http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BAS_SetForAccount.bpel">
<partnerLinkBindings>
<partnerLinkBinding name="client">
<property name="wsdlLocation">Resource_BAS_SetForAccount.wsdl</property>
<property name="type">public</property>
<property name="version">1.2</property>
</partnerLinkBinding>
<partnerLinkBinding name="RemoveFromAccount">
<property name="wsdlLocation">Resource_BAS_RemoveFromAccount.wsdl</property>
<property name="version">1.5</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
<BPELProcess id="Resource_BAS_RemoveFromAccount" src="http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BAS_RemoveFromAccount.bpel">
<partnerLinkBindings>
<partnerLinkBinding name="client">
<property name="wsdlLocation">Resource_BAS_RemoveFromAccount.wsdl</property>
<property name="type">public</property>
<property name="version">1.5</property>
</partnerLinkBinding>
<partnerLinkBinding name="CheckAvailability">
<property name="wsdlLocation">Resource_BES_CheckAvailability.wsdl</property>
<property name="version">1.1</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
<BPELProcess id="Resource_BES_CheckAvailability" src="http://www.oracle.com/technology/tech/soa/soa-suite-best-practices/Resource_BES_CheckAvailability.bpel">
<partnerLinkBindings>
<partnerLinkBinding name="client">
<property name="wsdlLocation">Resource_BES_CheckAvailability.wsdl</property>
<property name="type">public</property>
<property name="version">1.1</property>
</partnerLinkBinding>
...
</partnerLinkBindings>
</BPELProcess>
...
</BPELSuitcase>
使用 XSLT 將合并的 XML 文件轉(zhuǎn)換為目標(biāo)格式 (.dot), 這一格式可作為 Graphviz 生成程序的輸入,以生成 PNG 圖像,如下所示:
digraph structs {
node [shape=record,fontname="Arial",fontsize="10"];
edge [fontname="Arial",fontsize="8"];
rankdir=LR;
labeljust=l;
"Resource_BAS_SetForAccount_1_2" [shape=record,label="{Resource_BAS_SetForAccount}|{1.2|public}",
fillcolor=yellowgreen,style=filled];
"Resource_BAS_RemoveFromAccount_1_5" [shape=record,label="{Resource_BAS_RemoveFromAccount}|{1.5|public}",
fillcolor=yellowgreen,style=filled];
"Resource_BES_CheckAvailability_1_1" [shape=record,label="{Resource_BES_CheckAvailability}|{1.1|public}",
fillcolor=yellowgreen,style=filled];
"Resource_BAS_SetForAccount_1_2" -> "Resource_BAS_RemoveFromAccount_1_5" [decorate=true,label=""];
"Resource_BAS_RemoveFromAccount_1_5" -> "Resource_BES_CheckAvailability_1_1" [decorate=true,label=""];
}
由以上 DOT 文件生成的依賴關(guān)系圖形如下所示:
在方框中顯示了服務(wù)名稱、版本和類型。方框顏色指明了服務(wù)類型。在該圖中,我們有三個(gè)公共(綠色)服務(wù)。本文開頭的圖中還顯示了 ESB 服務(wù) (白色) 和 BPEL 服務(wù) (桔黃色)。
為各個(gè)公共 BPEL 流程生成理想的圖之后,我們要實(shí)施相關(guān)流程的自動(dòng)部署。對(duì)于這一以服務(wù)為中心的部署,我們使用了之前生成的流程列表。針對(duì)列表中的每一個(gè)流程調(diào)用標(biāo)準(zhǔn)部署目標(biāo)。為防止覆蓋服務(wù)器上的現(xiàn)有流程版本,只有服務(wù)器上沒有當(dāng)前版本的流程時(shí)才會(huì)調(diào)用部署目標(biāo)。
可以通過打開到流程 WSDL URL 的 HTTP 連接,然后檢查返回的狀態(tài)代碼來確定是否有特定流程版本(HTTP 狀態(tài) 200 ? 已經(jīng)部署, HTTP 狀態(tài) 404 ? 尚未部署)。 計(jì)算機(jī)電子書籍免費(fèi)下載
我們自定義的 Ant 任務(wù)(包含遞歸解析)、PNG 圖像生成以及以服務(wù)為中心的部署的輸出如下所示:
...
[mkdir] Created dir: /MyProject/Resource_BAS_SetForAccount/doc
[bpeltask] ** STARTING DeployWithDependencesTask **
[bpeltask] Resource_BAS_SetForAccount-1.2
[bpeltask] ** PARAMETER **
[bpeltask] dotfilename: doc/bpel-recursiv-all.dot
[bpeltask] dotfilenamepublic: doc/bpel-recursiv-public.dot
[bpeltask] deploytarget: deploy
[bpeltask] deployment: true
[bpeltask] overwriting: false
[bpeltask] stoponalreadydeployed: false
[bpeltask] ** RESOVLING RECURSIVLY ALL bpel.xml FILES **
[bpeltask] [Resource_BAS_SetForAccount-1.2]
[bpeltask] [Resource_BAS_SetForAccount-1.2, Resource_BAS_RemoveFromAccount-1.5]
[bpeltask] [Resource_BAS_SetForAccount-1.2, Resource_BAS_RemoveFromAccount-1.5, Resource_BES_CheckAvailability-1.1]
[bpeltask] ** WRITING CENTRAL bpel.xml FILE **
[bpeltask] ** TRANSFORMING DOT FILE **
[bpeltask] ** SERVICE DEPLOYMENT **
[bpeltask] ========================================================================
[bpeltask] SERVICE ALREADY DEPLOYED (HTTP/1.1 200 OK) 'Resource_BES_CheckAvailability' in version '1.1' http://localhost:8888/orabpel/default/Resource_BES_CheckAvailability/1.1/ Resource_BES_CheckAvailability?wsdl
[bpeltask] ========================================================================
[bpeltask] ========================================================================
[bpeltask] SERVICE ALREADY DEPLOYED (HTTP/1.1 200 OK) 'Resource_BAS_RemoveFromAccount' in version '1.5' http://localhost:8888/orabpel/default/Resource_BAS_RemoveFromAccount/1.5/ Resource_BAS_RemoveFromAccount?wsdl
[bpeltask] ========================================================================
[bpeltask] ========================================================================
[bpeltask] SERVICE NOT YET DEPLOYED (HTTP/1.1 404 Not Found) http://localhost:8888/orabpel/default/Resource_BAS_SetForAccount/1.2/ Resource_BAS_SetForAccount?wsdl
[bpeltask] STARTING SERVICE DEPLOYMENT of Resource_BAS_SetForAccount in version 1.2
[bpeltask] ========================================================================
...
結(jié)論
可自動(dòng)生成依賴關(guān)系圖的以服務(wù)為中心的部署實(shí)現(xiàn)了我們所有涉及 SOA 基礎(chǔ)架構(gòu)透明性的需求。因?yàn)椴渴鹜耆?Ant,我們也可以將它用于我們 Luntbuild 的晚間和生產(chǎn)構(gòu)建工作(持續(xù)構(gòu)建環(huán)境)。
為支持客戶的 SOA 治理,我們將在客戶的 wiki 中公開我們的公共流程及其文檔,以及生成的依賴關(guān)系圖,如此處所示:
在服務(wù)注冊(cè)表中查找檢索當(dāng)前注冊(cè)的公共服務(wù)的版本時(shí)會(huì)動(dòng)態(tài)生成 wiki 頁。wiki 頁中的圖提供了到源信息庫 (Subversion) 的鏈接,其中包含了文檔和我們公共服務(wù)的注冊(cè)版本的實(shí)際大小圖。點(diǎn)擊縮略圖可以通過 WebDAV 從 Subversion 中檢索對(duì)應(yīng)的圖。