與語言無關(guān)、基于組件的面向服務(wù)的體系結(jié)構(gòu) (SOA) 編程模型簡化了實現(xiàn) Web 服務(wù)以及將其組裝到解決方案中的過程。使用編程模型,非編程人員可以在沒有掌握復(fù)雜的技術(shù)的情況下使用現(xiàn)有的 IT 資產(chǎn)。它滿足了解決方案設(shè)計人員和業(yè)務(wù)分析人員的需要,提供了更高級別的抽象來隱藏實現(xiàn)技術(shù)之間的差異,同時還提高了業(yè)務(wù)可靠性。
為什么需要基于組件的編程模型?
推動 IBM 的 SOA 編程模型的遠景依賴于兩個重要的觀察結(jié)果,請看以下兩段引言中的精辟描述:
“根據(jù)時髦詞語設(shè)計 (Design-by-buzzword) 是一種常見的情況。至少在軟件行業(yè),這種行為或多或少與缺乏對一組給定的有用體系結(jié)構(gòu)約束的理解有關(guān)。換句話說,在選擇要重用的軟件體系結(jié)構(gòu)時,設(shè)計人員并沒有真正弄清楚這些體系結(jié)構(gòu)之所以好的原因。”
——Roy Thomas Fielding,“Architectural Styles and the Design of Network-based Software Architectures”(請參閱參考資料以獲得指向此研究報告的鏈接)。
這個問題可以通過將詳細了解體系結(jié)構(gòu)約束的原因的人的經(jīng)驗融入一組模式、編程構(gòu)件和工具來解決。
第二個重要的觀察結(jié)果同人以及人與技術(shù)的交互有關(guān):
“創(chuàng)建面向服務(wù)的體系結(jié)構(gòu) (SOA) 意味著重新考慮當(dāng)前用于構(gòu)建系統(tǒng)的實踐、組織的技能,以及團隊成員協(xié)作的方式。面向服務(wù)的作用在于通過組裝不同的應(yīng)用程序來開發(fā)解決方案,SOA 是體系結(jié)構(gòu)樣式,強調(diào)獨立服務(wù)提供者的松散耦合。”
——A.W. Brown 等,“Realizing service-oriented solutions with the IBM software development platform”(請參閱參考資料以獲得指向這篇文章的鏈接)。
基于 XML 的 Web 服務(wù)標準使人想到了基于組件的編程模型的某些方面。諸如 Web 服務(wù)互操作性 (WS-I)、Web 服務(wù)描述語言 (WSDL) 和 Web 服務(wù)策略 (WS-Policy) 之類的標準嘗試創(chuàng)建與平臺無關(guān)的抽象和統(tǒng)一的框架來進行業(yè)務(wù)軟件集成。而 Web 服務(wù)的價值來源于在 SOA 中使用它們。
大多數(shù)關(guān)于 Web 服務(wù)的資料都集中于互操作性協(xié)議和服務(wù)接口及其使用。而本文把重點放在用于實現(xiàn)服務(wù)并將服務(wù)組裝成解決方案的編程模型上。組件模型簡化了構(gòu)建和組裝服務(wù)的過程。
良好定義的組件應(yīng)該支持生態(tài)系統(tǒng)中的各種用戶角色——例如業(yè)務(wù)分析人員、集成開發(fā)人員、適配器開發(fā)人員和解決方案管理員——通過實例化、使用、組裝和自定義符合用戶目標、技能和概念性框架的不同組件類型,來創(chuàng)建面向服務(wù)的應(yīng)用程序。(注意:編程人員作為專業(yè)人員和重要的軟件開發(fā)角色仍然存在,但并非每個人都必須成為專業(yè)編程人員才能高效地使用 SOA 構(gòu)件。)
Web 服務(wù)標準中的組件模型明確地定義了組件和組件類型,以及定義和構(gòu)造組件的方式,以便由適合角色的工具重用和操作,這與我們對技術(shù)使用中人的方面的觀察結(jié)果是一致的。
基于組件的編程模型有許多好處,最顯著的好處是可以減少復(fù)雜性。沒有哪個角色需要了解實現(xiàn)功能的所有方式或所有的系統(tǒng)接口。公開給每個角色的復(fù)雜性是有限的,而公開給開發(fā)人員角色的復(fù)雜性有助于他們使用適合于其任務(wù)的工具以定義良好的方式開發(fā)解決方案。
組件模型必須是抽象的,并且與語言無關(guān),因為它的作用在于隱藏技術(shù)細節(jié)和差異。
組件模型還必須簡化非編程人員組裝和定制“解決方案部分”的過程。因此,與組裝和調(diào)整有關(guān)的組件(或組件集合)的所有方面必須以與語言無關(guān)的方式顯式地聲明,這樣無需編程人員修改源代碼就可以通過工具操作它們。我們使用 XML 來表示這些聲明。
SOA 的確切特征還有待探討,不過一些關(guān)鍵的方面已經(jīng)得到廣泛承認:
- SOA 是一種分布式組件 體系結(jié)構(gòu)。不管在企業(yè)內(nèi)部還是企業(yè)外部,SOA 組件都是透明的,并且可以通過一系列統(tǒng)一支持的、可互操作遠程過程調(diào)用和消息傳遞協(xié)議來統(tǒng)一訪問。接口定義標準支持開發(fā)人員工具之間的互操作性。網(wǎng)絡(luò)上 (on the wire) 協(xié)議互操作性——相對于代碼可移植性——是 SOA 組件的中心部分,支持統(tǒng)一訪問和平臺獨立。調(diào)用方不知道組件的基礎(chǔ)實現(xiàn)技術(shù),例如 Java? 2 Platform、Enterprise Edition (J2EE)、Microsoft? .Net 和 PHP。
- SOA 組件封裝功能,并支持通過業(yè)務(wù)分析人員和業(yè)務(wù)模型建模的抽象級別的重用。這使 IT 功能和它所支持的業(yè)務(wù)功能之間的映射更加直接,從而提高了可靠性。
- 聲明性的、計算機可處理的約定允許第三方訪問 SOA 組件提供的服務(wù)。這些約定顯式地聲明功能性特征以及非功能性(服務(wù)質(zhì)量或 QoS)特征和需求。SOA 組件使用 WSDL 記錄它們的操作。還可以使用用于 Web 服務(wù)的業(yè)務(wù)流程執(zhí)行語言 (BPEL4WS) 來定義組件的有效操作序列。
- 可以動態(tài)地發(fā)現(xiàn)、選擇、綁定(通過其聲明性屬性)和集成(使用組合機制,例如本系列第 3 部分“Process choreography and business state machines”(developerWorks,2005 年 7 月)中描述的組合機制)SOA 組件。
組件實現(xiàn)和專用組件類型
開發(fā)人員可以選擇使用 J2EE、PHP 或其他工具實現(xiàn)基本組件。作為一種編程模型,從根本上講,SOA 更多地關(guān)系到與組件的交互以及如何將這些交互集成到復(fù)合組件、應(yīng)用程序和解決方案。
我們的編程模型還引入了一些定義良好的組件類型,可以建模開發(fā)人員生產(chǎn)和部署到解決方案中的常見構(gòu)件。其中包括 Plain Old Java Objects (POJOs)、Business Processes (BPEL4WS)、Structured Query Language (SQL) 服務(wù)、Adaptive Business Objects、通過 J2EE Connector (J2C) 體系結(jié)構(gòu)資源適配器訪問的 Customer Information Control System (CICS) 程序、使用 SAP 的業(yè)務(wù)應(yīng)用程序編程接口的應(yīng)用程序、J2EE 無狀態(tài)會話 Bean 和 IBM MQSeries? 應(yīng)用程序。
因為在性質(zhì)上 SOA 組件模型是虛擬的,所以許多 SOA 組件自然支持多種實現(xiàn)技術(shù)。另一方面,不同的實現(xiàn)技術(shù)更好地適合于不同的任務(wù)。為了提高透明度,我們引入了服務(wù)組件類型的概念,每種類型都適合于具有特定技能、執(zhí)行特定任務(wù)和使用特定工具的開發(fā)人員。對于查詢,編程人員實現(xiàn)了一個 SQL 文件和一個包含一組 XQuery 語句的文件;對于文檔轉(zhuǎn)換,使用為此任務(wù)優(yōu)化的工具實現(xiàn) XSLT 樣式表等等。不需要知道 Web 服務(wù)、Enterprise JavaBean (EJB) 或其他組件是在部署時生成的,這是因為總體結(jié)果是作為通用 SOA 組件公開和使用的。
編程人員構(gòu)建一種適合于該任務(wù)的特定組件類型,集中于要解決的問題和要使用的工具,而不是結(jié)果構(gòu)件。SOA 開發(fā)工具應(yīng)該集中于開發(fā)人員的技能和他或她理解的概念。后續(xù)文章將簡要介紹一些組件類型,通過三個完全不同的示例——Java 對象、信息管理系統(tǒng) (IMS) 事務(wù)和 SQL 語句——演示如何將任何實現(xiàn)技術(shù)映射到公共 SOA 組件模型,同時滿足特定開發(fā)人員的需要。
組合
雖然可以使用特定于平臺的技術(shù)實現(xiàn) SOA 組合,但是新的以 SOA 為中心的組合類型可以自己實現(xiàn),而無需轉(zhuǎn)換為另一種編程模型。
使用組合模型,可以發(fā)現(xiàn)具有所需的接口和所需的基礎(chǔ)設(shè)施 (QoS) 策略的服務(wù),并且將這些服務(wù)聚合到新的服務(wù)、模塊和解決方案中。可以組合這些新的服務(wù)。
我們的方法統(tǒng)一了創(chuàng)建和訪問業(yè)務(wù)邏輯的范型。我們的 SOA 編程模型比現(xiàn)有的編程構(gòu)造復(fù)雜,隱藏了實現(xiàn)技術(shù)之間的不同。在這種模型中,組件組裝到模塊中,而模塊又可以組合到解決方案中。組件公開了可以通過可尋址接口調(diào)用的接口。接口是使用 WSDL、Java 或其他語言描述的。實現(xiàn)可能有無法解析的對所需服務(wù)的引用,這些服務(wù)是執(zhí)行之前由連接在一起的組件提供的。可以由解決方案集成人員或解決方案組裝人員使用適合于角色的工具進行連網(wǎng)操作,他們可以運用可能不為最初開發(fā)這些組件的人所知的企業(yè)策略和企業(yè)服務(wù)總線 (ESB) 部署拓撲知識來進行工作。
在沒有進行編程的情況下自定義
不可能始終在沒有進行配置、自定義或調(diào)整的情況下按原樣重用服務(wù)。在需要更改時,當(dāng)前的技術(shù)發(fā)展水平是修改源代碼。然而,是否能夠交付可以大量重用的組件在很大程度上取決于組件適應(yīng)其使用環(huán)境的功能。SOA 編程模型應(yīng)該支持構(gòu)建“編程人員”可以在沒有修改源代碼的情況下進行自定義的服務(wù)和模塊。當(dāng)使用組件的編程人員與構(gòu)建組件的編程人員不在一個單位時,這一點尤為重要。
基于組件的 SOA 編程模型提供了幾種在沒有進行編程的情況下自定義組件的機制。
旨在重用的組件可以打包成具有可變點 (points of variability) 的模板,在將模板放入解決方案時可以對其做一些調(diào)整。這種適應(yīng)性是我們的編程模型最重要的部分,此外,編程模型還包括規(guī)則語言和相關(guān)工具,用于給新的用戶提供自定義功能。
中介主要用于處理動態(tài)消息。通常可以在沒有進行編程的情況下組合中介。作為一個多協(xié)議構(gòu)造,企業(yè)服務(wù)總線發(fā)揮了重要的作用,可以將服務(wù)組件組合在一起進行無縫交互,另外,還允許在消息的路徑中插入稱為中介 的組件,以在不改變現(xiàn)有端點的情況下代理服務(wù)之間的交互,從而在主要方面解決整個企業(yè)范圍內(nèi)的問題,例如審核、記錄、路由、不匹配接口的適應(yīng)性、等效組件的增量替換和安全性。
SOA 編程模型的另一個好處(來源于前面提到的特性)是能夠在軟件生命周期的不同階段用一個組件替換另一個組件。通過將聲明的接口延遲綁定到支持這些接口的實現(xiàn)可以做到這一點。企業(yè)為什么需要替換功能單元,有許多方面的原因。其中最重要的原因可能是減少在大型企業(yè)中管理更改的困難。以增量的方式引入更改并且通過遵循定義的接口限制其影響可以提高靈活性。這種做法也適合于松散耦合,而松散耦合常常是大型組織的特征。此外,使用服務(wù)組件,有不同的技能、需求和時間安排的組可以以人力資源和系統(tǒng)資源兩方面的效率都最高的方式在 IT 基礎(chǔ)設(shè)施中協(xié)同工作,這樣企業(yè)就可以快速地響應(yīng)業(yè)務(wù)級的更改,從而使企業(yè)大大獲益。
組件定義
我們的 SOA 是由以下規(guī)范定義的:
-
服務(wù)規(guī)范 以組件提供和使用的一組服務(wù)的形式提供了組件的視圖。它由以下三組規(guī)范定義:
- 接口,通常是 WSDL
portTypes
。
- 策略,記錄 QoS 屬性,例如事務(wù)行為和安全性。
- 行為描述,例如 BPEL4WS 抽象流程。另一個例子可能是統(tǒng)一建模語言 V2 (UML2) 狀態(tài)模型,該模型指定了哪些操作對不同的狀態(tài)和操作所引發(fā)的狀態(tài)事務(wù)是有效的。調(diào)用方可以通過狀態(tài)模型計算有效的操作序列。
-
服務(wù)組件實現(xiàn) 是由以下四組規(guī)范定義的:
- 提供的服務(wù)規(guī)范。
- 需要的服務(wù)規(guī)范。
- 可以在組件上設(shè)置以調(diào)整或自定義的屬性。
- 為此提供基本支持的屬性;更復(fù)雜的方案使用可變點和對自定義組件的外部調(diào)用。
- 對所有實現(xiàn)實例都保持不變的容器指示(策略)。
- 定義組件實現(xiàn)的實現(xiàn)構(gòu)件(例如 Java 類、BPEL 文檔或 XSLT 規(guī)則集)。
-
服務(wù)組件(實例)由以下規(guī)范定義:
- 名稱。
- 服務(wù)組件實現(xiàn)。
- 實現(xiàn)的任何屬性的值,設(shè)置用于調(diào)整實例。
- 任何服務(wù)的規(guī)范,解析實現(xiàn)需要的服務(wù)規(guī)范。它們可以是連接組件實例的“網(wǎng)絡(luò)”,也可以是在運行時執(zhí)行以查找組件的“查詢”,所查找的組件實現(xiàn)相關(guān)接口,具有相關(guān)的 QoS 策略,并且匹配指定的行為(例如抽象流程或狀態(tài)模型)。
有兩種定義 SOA 組件的基本方法。這些定義可以通過開發(fā)工具生成,也可以由開發(fā)人員手動創(chuàng)建。
第一種方法是控制文件,顧名思義,控制文件即關(guān)聯(lián)或聯(lián)接組件的所有部分的文檔。例如,控制文件可以引用 WSDL 定義(提供的接口)、實現(xiàn)組件的 Java 類(實現(xiàn)構(gòu)件)或相關(guān)的策略文檔(策略斷言)。 它們可以是對文件系統(tǒng)、類路徑、源代碼管理系統(tǒng)或 Web URL 的引用。控制文件方法將多個單獨開發(fā)的構(gòu)件聚合在一起組成組件。應(yīng)用程序開發(fā)工具可以幫助定義控制文件。
第二種方法是使用 pragmas,指定相同信息的語言元素,但是包含在單個源文件的主體中。Java 方面的支持正在不斷增加(例如,JSR 175 中的 XDoclet 標記),以用 Java 語言編寫這些批注部分。但是這種方法尚不支持其他等同的有效 SOA 組件實現(xiàn)技術(shù)(如 SQL 或 XQuery 語句集)。每種組件類型都有用于其實現(xiàn)構(gòu)件的相關(guān)源文件格式,例如 Java 文件、狀態(tài)機或 SQL 文件。IBM WebSphere? Rapid Deployment 中的批注支持可以生成所有組成包含 pragmas 的源文件中的組件的單個元素。例如,Java 源文件中的結(jié)構(gòu)化注釋指示哪些 Java 方法將成為所生成的定義組件的服務(wù)接口中的 Web 服務(wù)操作。
總結(jié)
基于組件的編程模型——由面向任務(wù)的工具和運行時基礎(chǔ)設(shè)施支持——是快速采用 SOA 的關(guān)鍵。借助于期望的優(yōu)勢(如新的軟件重用方法),專業(yè)人員(不必是編程人員)可以在新的業(yè)務(wù)需求出現(xiàn)時使用 SOA 組件創(chuàng)建新的業(yè)務(wù)解決方案和改寫現(xiàn)有的業(yè)務(wù)解決方案。