隨著 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 的註冊表中,可在運行時發現這些資訊,從而使流程可以提供最大限度的靈活性。儘管引入了另一個組件,但使用方與提供方之間的效能並未降低太多,這應歸功於註冊表精確的記憶體中尋找以及端點調用。
查看原文