轉(zhuǎn)自:
http://www.ibm.com/developerworks/cn/webservices/ws-soa-axis2-1/index.html
Deepal Jayasinghe (deepal@apache.org), 高級(jí)軟件工程師, WSO2
2006 年 12 月 28 日
Apache Axis2 是 Apache Axis SOAP 項(xiàng)目的后繼項(xiàng)目。此項(xiàng)目是 Web 服務(wù)核心引擎的重要改進(jìn),目標(biāo)是成為 Web 服務(wù)和面向服務(wù)的體系結(jié)構(gòu)(Service-Oriented Architecture,SOA)的下一代平臺(tái)。作為一個(gè)干凈的可擴(kuò)展的開(kāi)放源代碼 Web 服務(wù)平臺(tái),它正逐漸受到廣泛的關(guān)注。Axis2 的體系結(jié)構(gòu)高度靈活,支持很多附加功能,如可靠消息傳遞和安全性等。
引言
Web 服務(wù)的歷史非常悠久,在其發(fā)展期間經(jīng)歷了多次迭代。第一代 Web 服務(wù)是受到高度控制的交互,可以視為僅是對(duì)可行性的測(cè)試。Apache SOAP 是第一代中值得注意的 SOAP 引擎之一,主要用作“概念驗(yàn)證”,而根本沒(méi)有考慮性能。第一代 SOAP 引擎的整個(gè)目的是為了讓人們認(rèn)識(shí)到 Web 服務(wù)是一個(gè)理想的選項(xiàng)。
不久,第一代 SOAP 引擎獲得了回報(bào)。越來(lái)越多的公司開(kāi)始對(duì)此產(chǎn)生興趣,SOA 的概念逐漸成形。可以將此階段稱為第二代 Web 服務(wù),它要求更好更快的 SOAP 引擎。發(fā)現(xiàn)和定義等方面已經(jīng)得到標(biāo)準(zhǔn)化,并需要 SOAP 引擎來(lái)支持這些標(biāo)準(zhǔn)。Axis 是這些第二代 SOAP 引擎之一。
現(xiàn)在,第二代 Web 服務(wù)的時(shí)代已經(jīng)接近尾聲。Web 服務(wù)現(xiàn)在的要求非常高,Web 服務(wù)領(lǐng)域的參與者也非常多。用于控制 Web 服務(wù)交互的不同方面的涉及內(nèi)容已得到標(biāo)準(zhǔn)化。第三代 Web 服務(wù)要求使用更快、更可靠的 SOAP 引擎——現(xiàn)有的 Axis 已不足以滿足此要求。Axis2 應(yīng)運(yùn)而生,填補(bǔ)了這一空白。
Axis2 體系結(jié)構(gòu)
Axis2 具有模塊化體系結(jié)構(gòu),由核心模塊和非核心模塊組成。據(jù)說(shuō),Axis2 核心是純 SOAP 處理引擎,并沒(méi)有包含 Java™ API for XML-based RPC (JAX-RPC) 概念作為其核心的一部分。同時(shí),Axis2 體系結(jié)構(gòu)的設(shè)計(jì)充分考慮了以下原則:
- 邏輯和狀態(tài)分離,以提供無(wú)狀態(tài)處理機(jī)制,因?yàn)?Web 服務(wù)是無(wú)狀態(tài)的。
- 所有信息位于一個(gè)信息模型中,允許對(duì)系統(tǒng)進(jìn)行掛起和恢復(fù)。
- 能夠在不更改核心體系結(jié)構(gòu)的情況下擴(kuò)展功能,能以最小或沒(méi)有核心更改的情況下直接支持新 Web 服務(wù)規(guī)范。
Axis2 核心體系結(jié)構(gòu)包括以下核心和非核心組件:
- 核心組件
- XML 對(duì)象模型 (AXIOM)
- SOAP 處理模型:處理程序框架
- 信息處理模型:上下文和描述
- 其他組件
- 部署模型
- 傳輸
- 客戶機(jī) API
- 核心生成模型
您可以在圖 1 中看到這些組件。
圖 1. Axis2 體系結(jié)構(gòu)關(guān)系圖

Axis2 主要特性
Axis2 不僅是 Apache 的新 Web 服務(wù)框架。它還體現(xiàn)了從 Axis 1.x 系列獲得的經(jīng)驗(yàn)和最近兩年在 Web 服務(wù)領(lǐng)域的發(fā)展。推出 Axis2 的主要原因之一是從速度和內(nèi)存方面獲得更好的性能——不過(guò)還添加了一些新特性和功能。大部分新特性都是為了提高 Axis2 的易用性,并同時(shí)保留通過(guò)各種方式擴(kuò)展功能的空間。大部分新功能所添加到的主要領(lǐng)域如下所示:
- 新 XML 對(duì)象模型 (AXIOM)
- 基于消息傳遞的核心
- 經(jīng)過(guò)改進(jìn)的部署模型
- 可插入數(shù)據(jù)綁定
- 新客戶機(jī) API
- 信息處理模型
新 XML 對(duì)象模型:AXIOM
正如上面提到的,與 Axis 1.x 相比,Axis2 構(gòu)建于全新的體系結(jié)構(gòu)之上。引入 Axis2 的主要原因之一是獲得合適的 XML 處理模型。Axis 1.x 使用 DOM 作為其 XML 表示機(jī)制,但使用 DOM 的缺點(diǎn)是,需要在內(nèi)存中保存完整的對(duì)象層次結(jié)構(gòu)(與傳入消息對(duì)應(yīng))。對(duì)于小消息,這將不是問(wèn)題,但對(duì)于大型消息就是問(wèn)題了。為了克服此問(wèn)題,Axis2 引入了新的 XML 表示形式作為其基礎(chǔ)。
Axis2 對(duì)象模型(AXIs2 Object Model,AXIOM)是 Axis2 的基礎(chǔ),任何 SOAP 消息在 Axis2 中都表示為 AXIOM。AXIOM 相對(duì)于其他 XML 表示形式的優(yōu)勢(shì)在于,它基于 pull 解析器技術(shù),而其他大多數(shù)則基于 push 解析器技術(shù)。pull 與 push 的主要不同之處在于,在 pull 技術(shù)中,調(diào)用者對(duì)解析器具有完全控制權(quán),可以要求下一個(gè)事件;而對(duì)于 push,當(dāng)要求解析器繼續(xù)處理時(shí),它將觸發(fā)事件,直到達(dá)到文檔最后為止。
由于 AXIOM 基于 pull 解析器技術(shù),因此具有“隨需應(yīng)變構(gòu)建”功能,僅在被要求時(shí)才會(huì)構(gòu)建對(duì)象模型,而且,如果需要,可以直接從 AXIOM 訪問(wèn)基礎(chǔ) PULL 解析器并對(duì)其加以使用,而不用構(gòu)建對(duì)象模型(Object Model,OM)。
基于消息傳遞的核心
Axis2 核心是純 SOAP 處理引擎,并不了解數(shù)據(jù)綁定、傳輸、WSDl 等內(nèi)容。Axis2 核心的主要功能是處理傳輸消息,并將其交付給目標(biāo)應(yīng)用程序。與 Axis 1.x 一樣,Axis2 也具有用于擴(kuò)展其主要功能的處理程序概念。
 |
階段和階段規(guī)則 階段是一個(gè)或多個(gè)處理程序的邏輯集合,有時(shí)候階段本身也充當(dāng)處理程序。Axis2 引入了階段概念,以方便地對(duì)核心功能進(jìn)行擴(kuò)展。在 Axis 1.x 中,如果您希望向處理程序鏈添加處理程序,需要更改全局配置文件,但對(duì)于 Axis2, 您并不需要進(jìn)行此工作,因?yàn)殡A段和階段規(guī)則可解決此問(wèn)題。階段規(guī)則用于指定如何在階段內(nèi)對(duì)給定處理程序集進(jìn)行排序。圖 2 說(shuō)明了階段如何組成流。 |
|
Axis 1.x 并沒(méi)有異步 Web 服務(wù)調(diào)用的概念,它完全綁定到請(qǐng)求-響應(yīng)調(diào)用,但在 Axis2 中卻是另一番景象。Axis2 體系結(jié)構(gòu)能夠支持在客戶端和服務(wù)器端同時(shí)支持異步調(diào)用。同時(shí),Axis2 也支持請(qǐng)求-響應(yīng)樣式的調(diào)用,但這會(huì)以兩個(gè)異步調(diào)用的方式進(jìn)行。在 Axis2 中,進(jìn)入系統(tǒng)的消息可能有也可能沒(méi)有響應(yīng),應(yīng)該注意,Aixs2 支持 WSDL 2.0 中定義的所有八種消息交換模式(Message Exchange Patterns,MEP)。
Axis2 具有流的概念,流是階段的集合,而階段是處理程序的集合。根據(jù)給定方法調(diào)用的 MEP,與其關(guān)聯(lián)的流的數(shù)量可能會(huì)有所變化。如果僅傳入的 MEP 對(duì)應(yīng)方法只具有一個(gè)流,則稱為 inflow;而對(duì)于傳入-傳出,則具有兩個(gè)流——inflow 和 outflow。在大多數(shù)情況下,inflow 從傳輸偵聽(tīng)器開(kāi)始,到消息接收方處結(jié)束,而 outflow 能以不同的方式開(kāi)始,大多數(shù)情況下都在傳輸發(fā)送方處結(jié)束。
 |
消息接收方 如果消息在沒(méi)有出現(xiàn)問(wèn)題的情況下通過(guò)執(zhí)行鏈,則引擎會(huì)將消息轉(zhuǎn)交給消息接收方來(lái)進(jìn)行業(yè)務(wù)邏輯調(diào)用,此后,將由消息接收方調(diào)用服務(wù)并在必要的情況下發(fā)送響應(yīng)。圖 3 說(shuō)明了消息接收方如何適合執(zhí)行鏈。 |
|
圖 2. 流中的階段
圖 3. Inflow 和消息接收方
新部署模型
Axis 之前的版本沒(méi)有處理好 Web 服務(wù)部署中涉及的用戶友好因素,因此開(kāi)發(fā)了 Axis 1.x,其主要目的是為了進(jìn)行 Web 服務(wù)概念證明。因此,在 Axis 1.x 中,用戶必須手動(dòng)調(diào)用管理客戶機(jī),并更新服務(wù)器類路徑,然后重新啟動(dòng)服務(wù)器,以應(yīng)用更改。這個(gè)有點(diǎn)麻煩的部署模型對(duì)新手肯定是一道障礙。Axis2 經(jīng)過(guò)了精心的設(shè)計(jì),能夠克服此缺點(diǎn),并提供靈活、用戶友好、可方便進(jìn)行配置的部署模型。
Axis2 部署引入了類似于 Java™ 2 Platform Enterprise Edition (J2EE) 部署機(jī)制的概念,開(kāi)發(fā)人員可以在其中將所有類文件、庫(kù)文件、資源文件和配置文件一起打包為存檔文件,并將其放置在文件系統(tǒng)中的指定位置。
熱部署 和熱更新 的概念并不是新技術(shù)術(shù)語(yǔ)(對(duì)于熟悉 Web 服務(wù)平臺(tái)的人更是如此),但對(duì)于 Apache Axis 則是一個(gè)新特性。因此開(kāi)發(fā)了 Axis2 來(lái)提供進(jìn)行“熱”部署的空間。
熱部署:在系統(tǒng)啟動(dòng)并運(yùn)行時(shí)部署服務(wù)的功能。系統(tǒng)可用性在實(shí)時(shí)系統(tǒng)或業(yè)務(wù)環(huán)境中非常重要。如果系統(tǒng)停機(jī)(即使很短的時(shí)間),損失會(huì)很大,可能會(huì)影響業(yè)務(wù)的生存期。不過(guò),會(huì)同時(shí)需要向系統(tǒng)添加新服務(wù),如果可以在不關(guān)閉服務(wù)器的情況下完成,則是一個(gè)極大的進(jìn)步。因此 Axis2 對(duì)此問(wèn)題進(jìn)行了處理,提供了 Web 服務(wù)熱部署功能,可以在不必關(guān)閉系統(tǒng)的情況下部署新 Web 服務(wù)。所需要進(jìn)行的工作就是,將所需的 Web 服務(wù)存檔放入到存儲(chǔ)庫(kù)的 services 目錄中。然后,部署模型將自動(dòng)部署服務(wù),并進(jìn)行提供。
熱更新:在不必關(guān)閉系統(tǒng)的情況下對(duì)現(xiàn)有 Web 服務(wù)進(jìn)行更改的能力。這是一個(gè)重要的特性,是測(cè)試環(huán)境中需要的一個(gè)功能。不過(guò),在實(shí)時(shí)系統(tǒng)中使用熱更新并不明智,因?yàn)闊岣驴赡軐?dǎo)致系統(tǒng)進(jìn)入未知狀態(tài)。此外,還可能丟失該服務(wù)的現(xiàn)有服務(wù)數(shù)據(jù)。為了防止發(fā)生這種情況,Axis2 的熱更新參數(shù)缺省設(shè)置為 false。
新部署模型
Axis 之前的版本沒(méi)有處理好 Web 服務(wù)部署中涉及的用戶友好因素,因此開(kāi)發(fā)了 Axis 1.x,其主要目的是為了進(jìn)行 Web 服務(wù)概念證明。因此,在 Axis 1.x 中,用戶必須手動(dòng)調(diào)用管理客戶機(jī),并更新服務(wù)器類路徑,然后重新啟動(dòng)服務(wù)器,以應(yīng)用更改。這個(gè)有點(diǎn)麻煩的部署模型對(duì)新手肯定是一道障礙。Axis2 經(jīng)過(guò)了精心的設(shè)計(jì),能夠克服此缺點(diǎn),并提供靈活、用戶友好、可方便進(jìn)行配置的部署模型。
Axis2 部署引入了類似于 Java™ 2 Platform Enterprise Edition (J2EE) 部署機(jī)制的概念,開(kāi)發(fā)人員可以在其中將所有類文件、庫(kù)文件、資源文件和配置文件一起打包為存檔文件,并將其放置在文件系統(tǒng)中的指定位置。
熱部署 和熱更新 的概念并不是新技術(shù)術(shù)語(yǔ)(對(duì)于熟悉 Web 服務(wù)平臺(tái)的人更是如此),但對(duì)于 Apache Axis 則是一個(gè)新特性。因此開(kāi)發(fā)了 Axis2 來(lái)提供進(jìn)行“熱”部署的空間。
熱部署:在系統(tǒng)啟動(dòng)并運(yùn)行時(shí)部署服務(wù)的功能。系統(tǒng)可用性在實(shí)時(shí)系統(tǒng)或業(yè)務(wù)環(huán)境中非常重要。如果系統(tǒng)停機(jī)(即使很短的時(shí)間),損失會(huì)很大,可能會(huì)影響業(yè)務(wù)的生存期。不過(guò),會(huì)同時(shí)需要向系統(tǒng)添加新服務(wù),如果可以在不關(guān)閉服務(wù)器的情況下完成,則是一個(gè)極大的進(jìn)步。因此 Axis2 對(duì)此問(wèn)題進(jìn)行了處理,提供了 Web 服務(wù)熱部署功能,可以在不必關(guān)閉系統(tǒng)的情況下部署新 Web 服務(wù)。所需要進(jìn)行的工作就是,將所需的 Web 服務(wù)存檔放入到存儲(chǔ)庫(kù)的 services 目錄中。然后,部署模型將自動(dòng)部署服務(wù),并進(jìn)行提供。
熱更新:在不必關(guān)閉系統(tǒng)的情況下對(duì)現(xiàn)有 Web 服務(wù)進(jìn)行更改的能力。這是一個(gè)重要的特性,是測(cè)試環(huán)境中需要的一個(gè)功能。不過(guò),在實(shí)時(shí)系統(tǒng)中使用熱更新并不明智,因?yàn)闊岣驴赡軐?dǎo)致系統(tǒng)進(jìn)入未知狀態(tài)。此外,還可能丟失該服務(wù)的現(xiàn)有服務(wù)數(shù)據(jù)。為了防止發(fā)生這種情況,Axis2 的熱更新參數(shù)缺省設(shè)置為 false。
模塊體系結(jié)構(gòu)
正如上面提到的,Axis2 也具有處理程序的概念,但與 Axis 1.x 相比,指定和部署處理程序的方式有一些變化。在 Axis 1.x 中,要添加處理程序,需要首先更改全局配置文件,然后需要重新啟動(dòng)系統(tǒng),并沒(méi)有在運(yùn)行時(shí)更改處理程序鏈的動(dòng)態(tài)方法。
為了克服這個(gè)問(wèn)題和增加新特性,Axis2 引入了 Web 服務(wù)擴(kuò)展或模塊的概念;其中模塊的主要工作是對(duì)核心功能進(jìn)行擴(kuò)展。在 Axis 1.x 中,可以通過(guò)向處理程序鏈添加處理程序來(lái)實(shí)現(xiàn)此目標(biāo)。與 Axis 1.x 處理程序鏈相比,使用模塊的優(yōu)勢(shì)在于,您可以在根本不改變?nèi)峙渲梦募那闆r下添加新模塊。同時(shí),模塊是一個(gè)自容器,其中可以包含處理程序、第三方庫(kù)、模塊相關(guān)資源和模塊配置文件。
 |
模塊的狀態(tài) 模塊具有兩個(gè)狀態(tài):available 和 engaged。將模塊放入存儲(chǔ)庫(kù)中,此模塊就為 available 狀態(tài),而它的處理程序都不在處理程序鏈中。模塊可以隨時(shí)參與到系統(tǒng)中。參與就是將其處理程序添加到處理程序鏈(或流),因此一旦使模塊參與系統(tǒng),它就處于 engaged 狀態(tài)了。 |
|
可以將模塊作為存檔文件部署,Axis2 為模塊采用了一個(gè)新擴(kuò)展文件名 .mar。模塊存檔文件中最重要的文件是模塊配置文件或 module.xml。除非具有 module.xml 文件,否則該模塊就是一個(gè)錯(cuò)誤模塊。模塊配置文件主要用于指定處理程序及其階段規(guī)則,因此讓模塊參與系統(tǒng)后,根據(jù)階段規(guī)則不同,處理程序?qū)⒈环胖迷诓煌牧魃稀猧nflow 或 outflow。
這個(gè)思路非常簡(jiǎn)單。或許您需要支持 WS-Addressing 或 WS-Security。然后您必須下載對(duì)應(yīng)的模塊,并將其放置到 Axis2 存儲(chǔ)庫(kù)的 modules 目錄中。您可以在部署時(shí)通過(guò)向 axis2.xml(Axis2 全局配置文件)添加以下條目使模塊參與系統(tǒng),或在運(yùn)行時(shí)通過(guò)使用各種方法(如使用 Axis2 Web 管理控制臺(tái)或 handlerfor exsample)使模塊參與到系統(tǒng)中:
<module ref="ModuleName">
新客戶機(jī) API
異步或非阻塞 Web 服務(wù)調(diào)用是目前 Web 服務(wù)中的一個(gè)主要需求。同時(shí),還存在一些以非阻塞方式調(diào)用 Web 服務(wù)的方法。第一個(gè)是客戶機(jī)編程模型,在此模型中,客戶機(jī)能在不阻塞其應(yīng)用程序的情況下以非阻塞方式調(diào)用服務(wù)。第二個(gè)方法是傳輸級(jí)非阻塞調(diào)用,其中的調(diào)用是在兩個(gè)傳輸協(xié)議之間發(fā)生的。可以是 SMTP 之類的兩個(gè)單向傳輸協(xié)議,也可以為兩個(gè) HTTP 之類的雙向傳輸協(xié)議。Axis2 客戶機(jī) API 同時(shí)支持上述兩個(gè)非阻塞調(diào)用方案。
Axis2 引入了用于調(diào)用服務(wù)的非常方便的客戶機(jī) API,此 API 包含兩個(gè)類,分別名為 ServiceClient 和 OperationClient。ServiceClient API 專門用于只需要發(fā)送和接收 XML 的普通用戶,而 OperationClient 旨在供希望處理 SOAP Header 和其他一些高級(jí)任務(wù)的高級(jí)用戶使用。通過(guò)使用 ServiceClient,您只能訪問(wèn) SOAP 主體或有效負(fù)載。當(dāng)然,可以添加 SOAP Header,但無(wú)法從服務(wù)客戶機(jī)檢索 SOAP Header。為了實(shí)現(xiàn)此操作,您將需要使用 OperationClient。
ServiceClient 具有以下用于調(diào)用服務(wù)的 API:
- sendRobust
- fireAndForget
- sendReceive
- sendReceiveNonBlocking
sendRobust:此 API 的思路是將 XML 塊發(fā)送給 Web 服務(wù),而不考慮其響應(yīng)。不過(guò),如果出現(xiàn)了錯(cuò)誤,您將也需要知道此情況。因此,此 API 用于調(diào)用并不返回值但可能引發(fā)異常的服務(wù)。
fireAndForget:此 API 只用于發(fā)送 XML 塊,但并不考慮響應(yīng)或異常,因此這是調(diào)用僅傳入的 MEP。
sendReceive:調(diào)用具有返回值的服務(wù)。這是最常用的 API 之一,可以用于調(diào)用傳入-傳出 MEP。
sendReceiveNonBlocking:以非阻塞方式調(diào)用服務(wù)。服務(wù)具有返回值時(shí),可以使用此方法。為了使用此方法,您必須傳遞一個(gè)回調(diào)對(duì)象,將在調(diào)用完成后立即調(diào)用回調(diào)對(duì)象。
正如前面提到的,OperationClient 用于高級(jí)用戶,使用 OperationClient 要求您對(duì) Axis2 有良好的了解。在 ServiceClient 中,您并不需要知道有關(guān) SOAP 信封或消息上下文的任何信息,但對(duì)于 OperationClient,您必須在調(diào)用服務(wù)前自己創(chuàng)建它。使用 OperationClient 創(chuàng)建和調(diào)用服務(wù)涉及到以下步驟:
- 創(chuàng)建服務(wù)客戶機(jī)
- 然后使用創(chuàng)建的服務(wù)客戶機(jī)創(chuàng)建操作客戶機(jī)
- 創(chuàng)建 SOAP 信封
- 創(chuàng)建消息上下文
- 將 SOAP 信封添加到消息上下文
- 將操作上下文添加到操作客戶機(jī)
- 調(diào)用操作客戶機(jī)
- 如果有響應(yīng),則從操作客戶機(jī)獲取響應(yīng)消息上下文
總結(jié)
Axis2 將不會(huì)對(duì) Web 服務(wù)概念進(jìn)行驗(yàn)證,而將提供更好的 SOAP 處理模型,且與 Axis 1.x 及其他現(xiàn)有 Web 服務(wù)引擎相比,其速度和內(nèi)容方面的性能都得到很大的提高。此外,它還為用戶提供了方便的 API,用于部署服務(wù)、擴(kuò)展核心功能和新客戶機(jī)編程模型。現(xiàn)在已經(jīng)進(jìn)入了 Axis2 的時(shí)代了。
posted on 2007-07-03 13:42
綠茶 閱讀(851)
評(píng)論(1) 編輯 收藏 所屬分類:
WebService