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