在SOA 環境中管理流程和服務依賴關係
背景您知道BPEL 流程依賴哪些服務嗎?如果使用了不同版本的BPEL 流程,二者之間的依賴關係很快就會變得更加複雜。如果我們將BPEL 流程呼叫的企業服務匯流排(ESB) 服務考慮在內,依賴性管理的複雜度將會提升。複雜度使得部署和測試耗時、困難且易於出錯。
通常我們最後使用Microsoft Visio 建模工具來手動描繪依賴關係,並在流程每次變更後忙於更新依賴關係。這是一個阻礙服務導向的體系架構(SOA) 基礎架構敏捷性的主要羈絆,SOA 體系架構的設計旨在實現業務流程的敏捷變更。
在這項技術說明中,將向您介紹如何成功地改善建置流程,以及實現流程依賴關係圖的自動產生。
我們的挑戰是為客戶實施一個Oracle SOA 套件示範項目,該項目包含許多BPEL 流程,並引用眾多BPEL 子流程和ESB 服務。最後我們使用了十來個BPEL 流程和ESB 服務(它們定義為公共服務,在服務註冊表上共享)以及其他專有BPEL 流程和ESB 服務。
首先,我們決定為專案所有服務建立一個基於Ant 的部署,將BPEL 流程(包括執行它們的測試案例)部署到不同環境(測試、整合、生產) ,並透過基於Ant 的方式將ESB 服務也部署到這些環境。電腦電子書籍免費下載
要求完成首個專案版本後,我們有一些要求:
,
當一個BPEL 流程或ESB 服務更改後,我們不想部署專案的所有服務。所以我們需要將以專案為中心的部署轉變為以公共服務為中心的部署方法。
在部署BPEL 流程時,所有依賴關係的(專有) 子流程和ESB 服務也會自動部署。
為防止覆蓋特定版本的流程,只有伺服器未部署該版本的流程時才進行部署,覆蓋將導致所有實例流資訊遺失。
在部署期間應自動建立所有流程和服務依賴關係的視覺化圖形,不需另外維護這些資訊。可視化圖應該如下所示。
懸而未決的問題針對這些新要求,我們提出了以下問題,並做出以下解答:
問題:來自流程和服務依賴關係的資訊儲存在哪裡?需要增加更多資訊以建立完整的依賴關係圖嗎?
答案: BPEL 流程呼叫的所有服務都儲存在partnerLinkBinding 標記的bpel.xml 檔案中。對於所呼叫的BPEL 流程、版本資訊也以編碼編入URL 中。例如: 電腦電子書籍免費下載
<property name="wsdlRuntimeLocation">
${domain_url}/CustomerAccount_BES/1.3/CustomerAccount_BES?wsdl
</property>
要部署的目前版本的BPEL 流程可以在build.properties 檔案中找到。對於BPEL 流程的版本維護,我們只需要更改build.properties 檔案中的rev 屬性。
為區分公共和專有BPEL 流程,bpel.xml 檔案內客戶端的合作夥伴連結提供了一個新屬性“type”,其值為“public”或“private”,如這裡所示:
<partnerLinkBinding name="client">
<property name="wsdlLocation">CustomerAccount_BES.wsdl</property>
<property name="type">public</property>
</partnerLinkBinding>
問題:有可以動態產生依賴關係圖的工具或框架嗎?
答:有,一個開放原始碼工具Graphviz ( www.graphviz.org ) 可從文字格式的輸入檔產生圖形。
問題:引用其他BPEL 流程的選項有哪些?
答案:選項有:
引用預設版本引用具體版本引用UDDI 服務鍵(帶或不帶經編碼的版本資訊)
問題:如何能實現所有這些新的部署要求?
答案:使用自訂Ant 任務可以最好地實現這些新部署要求。
開始工作問題都得到了圓滿解答,下面我們著手建立一個自訂Ant 任務。在Ant 任務中將解析bpel.xml 檔案。對於找到的所有partnerLinkBindings 標籤,將以遞歸方式開始解析對應的bpel.xml 檔案。除了解析,還將從每個找到的BPEL 項目的build.properties 檔案中提取版本屬性(“ref”)的當前值。遞歸解析的挑戰之一是跳過循環的依賴關係。
我們在bpel.xml 檔案中新推出的「type」屬性和遞歸解析實作了我們以服務心中的部署的所有需求。
更棒的是,我們使用Graphviz 解決了依賴關係圖的自動產生問題。為達到此目的,我們要將從遞歸bpel.xml 解析中得到的所有依賴關係合併為一個XML 文件,如下所示。 電腦電子書籍免費下載
<?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 檔案轉換為目標格式(.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 檔案產生的依賴關係圖形如下所示:
在方框中顯示了服務名稱、版本和類型。方框顏色指明了服務類型。在該圖中,我們有三個公共(綠色)服務。本文開頭的圖中也顯示了ESB 服務(白色) 和BPEL 服務(桔黃色)。
在為各個公共BPEL 流程產生理想的圖之後,我們要實施相關流程的自動部署。對於這項以服務為中心的部署,我們使用了先前產生的流程清單。針對清單中的每一個流程呼叫標準部署目標。為防止覆蓋伺服器上的現有流程版本,只有伺服器上沒有目前版本的流程時才會呼叫部署目標。
可以透過開啟到流程WSDL URL 的HTTP 連接,然後檢查返回的狀態代碼來確定是否有特定流程版本(HTTP 狀態200 ? 已經部署, HTTP 狀態404 ? 尚未部署)。 電腦電子書籍免費下載
我們自訂的Ant 任務(包含遞歸解析)、PNG 映像產生以及以服務為中心的部署的輸出如下所示:
…
[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/ Rews_BESpel/default/ Resource_BES_CheckAvailability/1.1/ RewsBESd
[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/orabpel/Awid/Resource_BAS_RemoveFromAccount/1.51
[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] ================================================= ===========================
…
結論可自動產生依賴關係圖的以服務為中心的部署實現了我們所有涉及SOA 基礎架構透明性的需求。因為部署完全基於Ant,我們也可以將它用於我們Luntbuild 的晚間和生產建置工作(持續建置環境)。
為支援客戶的SOA 治理,我們將在客戶的wiki 中公開我們的公共流程及其文檔,以及產生的依賴關係圖,如此處所示:
在服務註冊表中尋找檢索目前註冊的公共服務的版本時會動態產生wiki 頁。 wiki 頁中的圖提供了到來源資訊庫(Subversion) 的鏈接,其中包含了文件和我們公共服務的註冊版本的實際大小圖。點選縮圖可以透過WebDAV 從Subversion 中檢索對應的