greenteazsh
          讓我們攜手一起努力......
          posts - 26,  comments - 18,  trackbacks - 0
          轉(zhuǎn)自:http://www.ibm.com/developerworks/cn/webservices/ws-soa-axis2-1/index.html

          Deepal Jayasinghe (deepal@apache.org), 高級軟件工程師, 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ò)展的開放源代碼 Web 服務(wù)平臺(tái),它正逐漸受到廣泛的關(guān)注。Axis2 的體系結(jié)構(gòu)高度靈活,支持很多附加功能,如可靠消息傳遞和安全性等。

          引言

          Web 服務(wù)的歷史非常悠久,在其發(fā)展期間經(jīng)歷了多次迭代。第一代 Web 服務(wù)是受到高度控制的交互,可以視為僅是對可行性的測試。Apache SOAP 是第一代中值得注意的 SOAP 引擎之一,主要用作“概念驗(yàn)證”,而根本沒有考慮性能。第一代 SOAP 引擎的整個(gè)目的是為了讓人們認(rèn)識(shí)到 Web 服務(wù)是一個(gè)理想的選項(xiàng)。

          不久,第一代 SOAP 引擎獲得了回報(bào)。越來越多的公司開始對此產(chǎn)生興趣,SOA 的概念逐漸成形。可以將此階段稱為第二代 Web 服務(wù),它要求更好更快的 SOAP 引擎。發(fā)現(xiàn)和定義等方面已經(jīng)得到標(biāo)準(zhǔn)化,并需要 SOAP 引擎來支持這些標(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ù)說,Axis2 核心是純 SOAP 處理引擎,并沒有包含 Java™ API for XML-based RPC (JAX-RPC) 概念作為其核心的一部分。同時(shí),Axis2 體系結(jié)構(gòu)的設(shè)計(jì)充分考慮了以下原則:

          • 邏輯和狀態(tài)分離,以提供無狀態(tài)處理機(jī)制,因?yàn)?Web 服務(wù)是無狀態(tài)的。
          • 所有信息位于一個(gè)信息模型中,允許對系統(tǒng)進(jìn)行掛起和恢復(fù)。
          • 能夠在不更改核心體系結(jié)構(gòu)的情況下擴(kuò)展功能,能以最小或沒有核心更改的情況下直接支持新 Web 服務(wù)規(guī)范。

          Axis2 核心體系結(jié)構(gòu)包括以下核心和非核心組件:

          • 核心組件
            • XML 對象模型 (AXIOM)
            • SOAP 處理模型:處理程序框架
            • 信息處理模型:上下文和描述
          • 其他組件
            • 部署模型
            • 傳輸
            • 客戶機(jī) API
            • 核心生成模型

          您可以在圖 1 中看到這些組件。


          圖 1. Axis2 體系結(jié)構(gòu)關(guān)系圖
          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)存方面獲得更好的性能——不過還添加了一些新特性和功能。大部分新特性都是為了提高 Axis2 的易用性,并同時(shí)保留通過各種方式擴(kuò)展功能的空間。大部分新功能所添加到的主要領(lǐng)域如下所示:

          1. 新 XML 對象模型 (AXIOM)
          2. 基于消息傳遞的核心
          3. 經(jīng)過改進(jìn)的部署模型
          4. 可插入數(shù)據(jù)綁定
          5. 新客戶機(jī) API
          6. 信息處理模型

          新 XML 對象模型:AXIOM

          正如上面提到的,與 Axis 1.x 相比,Axis2 構(gòu)建于全新的體系結(jié)構(gòu)之上。引入 Axis2 的主要原因之一是獲得合適的 XML 處理模型。Axis 1.x 使用 DOM 作為其 XML 表示機(jī)制,但使用 DOM 的缺點(diǎn)是,需要在內(nèi)存中保存完整的對象層次結(jié)構(gòu)(與傳入消息對應(yīng))。對于小消息,這將不是問題,但對于大型消息就是問題了。為了克服此問題,Axis2 引入了新的 XML 表示形式作為其基礎(chǔ)。

          Axis2 對象模型(AXIs2 Object Model,AXIOM)是 Axis2 的基礎(chǔ),任何 SOAP 消息在 Axis2 中都表示為 AXIOM。AXIOM 相對于其他 XML 表示形式的優(yōu)勢在于,它基于 pull 解析器技術(shù),而其他大多數(shù)則基于 push 解析器技術(shù)。pull 與 push 的主要不同之處在于,在 pull 技術(shù)中,調(diào)用者對解析器具有完全控制權(quán),可以要求下一個(gè)事件;而對于 push,當(dāng)要求解析器繼續(xù)處理時(shí),它將觸發(fā)事件,直到達(dá)到文檔最后為止。

          由于 AXIOM 基于 pull 解析器技術(shù),因此具有“隨需應(yīng)變構(gòu)建”功能,僅在被要求時(shí)才會(huì)構(gòu)建對象模型,而且,如果需要,可以直接從 AXIOM 訪問基礎(chǔ) PULL 解析器并對其加以使用,而不用構(gòu)建對象模型(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 引入了階段概念,以方便地對核心功能進(jìn)行擴(kuò)展。在 Axis 1.x 中,如果您希望向處理程序鏈添加處理程序,需要更改全局配置文件,但對于 Axis2, 您并不需要進(jìn)行此工作,因?yàn)殡A段和階段規(guī)則可解決此問題。階段規(guī)則用于指定如何在階段內(nèi)對給定處理程序集進(jìn)行排序。圖 2 說明了階段如何組成流。

          Axis 1.x 并沒有異步 Web 服務(wù)調(diào)用的概念,它完全綁定到請求-響應(yīng)調(diào)用,但在 Axis2 中卻是另一番景象。Axis2 體系結(jié)構(gòu)能夠支持在客戶端和服務(wù)器端同時(shí)支持異步調(diào)用。同時(shí),Axis2 也支持請求-響應(yīng)樣式的調(diào)用,但這會(huì)以兩個(gè)異步調(diào)用的方式進(jìn)行。在 Axis2 中,進(jìn)入系統(tǒng)的消息可能有也可能沒有響應(yīng),應(yīng)該注意,Aixs2 支持 WSDL 2.0 中定義的所有八種消息交換模式(Message Exchange Patterns,MEP)。

          Axis2 具有流的概念,流是階段的集合,而階段是處理程序的集合。根據(jù)給定方法調(diào)用的 MEP,與其關(guān)聯(lián)的流的數(shù)量可能會(huì)有所變化。如果僅傳入的 MEP 對應(yīng)方法只具有一個(gè)流,則稱為 inflow;而對于傳入-傳出,則具有兩個(gè)流——inflow 和 outflow。在大多數(shù)情況下,inflow 從傳輸偵聽器開始,到消息接收方處結(jié)束,而 outflow 能以不同的方式開始,大多數(shù)情況下都在傳輸發(fā)送方處結(jié)束。

          消息接收方
          如果消息在沒有出現(xiàn)問題的情況下通過執(zhí)行鏈,則引擎會(huì)將消息轉(zhuǎn)交給消息接收方來進(jìn)行業(yè)務(wù)邏輯調(diào)用,此后,將由消息接收方調(diào)用服務(wù)并在必要的情況下發(fā)送響應(yīng)。圖 3 說明了消息接收方如何適合執(zhí)行鏈。

          圖 2. 流中的階段
          流中的階段

          圖 3. Inflow 和消息接收方
          Inflow 和消息接收方

          新部署模型

          Axis 之前的版本沒有處理好 Web 服務(wù)部署中涉及的用戶友好因素,因此開發(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)麻煩的部署模型對新手肯定是一道障礙。Axis2 經(jīng)過了精心的設(shè)計(jì),能夠克服此缺點(diǎn),并提供靈活、用戶友好、可方便進(jìn)行配置的部署模型。

          Axis2 部署引入了類似于 Java™ 2 Platform Enterprise Edition (J2EE) 部署機(jī)制的概念,開發(fā)人員可以在其中將所有類文件、庫文件、資源文件和配置文件一起打包為存檔文件,并將其放置在文件系統(tǒng)中的指定位置。

          熱部署熱更新 的概念并不是新技術(shù)術(shù)語(對于熟悉 Web 服務(wù)平臺(tái)的人更是如此),但對于 Apache Axis 則是一個(gè)新特性。因此開發(fā)了 Axis2 來提供進(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ù)的生存期。不過,會(huì)同時(shí)需要向系統(tǒng)添加新服務(wù),如果可以在不關(guān)閉服務(wù)器的情況下完成,則是一個(gè)極大的進(jìn)步。因此 Axis2 對此問題進(jìn)行了處理,提供了 Web 服務(wù)熱部署功能,可以在不必關(guān)閉系統(tǒng)的情況下部署新 Web 服務(wù)。所需要進(jìn)行的工作就是,將所需的 Web 服務(wù)存檔放入到存儲(chǔ)庫的 services 目錄中。然后,部署模型將自動(dòng)部署服務(wù),并進(jìn)行提供。

          熱更新:在不必關(guān)閉系統(tǒng)的情況下對現(xiàn)有 Web 服務(wù)進(jìn)行更改的能力。這是一個(gè)重要的特性,是測試環(huán)境中需要的一個(gè)功能。不過,在實(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 之前的版本沒有處理好 Web 服務(wù)部署中涉及的用戶友好因素,因此開發(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)麻煩的部署模型對新手肯定是一道障礙。Axis2 經(jīng)過了精心的設(shè)計(jì),能夠克服此缺點(diǎn),并提供靈活、用戶友好、可方便進(jìn)行配置的部署模型。

          Axis2 部署引入了類似于 Java™ 2 Platform Enterprise Edition (J2EE) 部署機(jī)制的概念,開發(fā)人員可以在其中將所有類文件、庫文件、資源文件和配置文件一起打包為存檔文件,并將其放置在文件系統(tǒng)中的指定位置。

          熱部署熱更新 的概念并不是新技術(shù)術(shù)語(對于熟悉 Web 服務(wù)平臺(tái)的人更是如此),但對于 Apache Axis 則是一個(gè)新特性。因此開發(fā)了 Axis2 來提供進(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ù)的生存期。不過,會(huì)同時(shí)需要向系統(tǒng)添加新服務(wù),如果可以在不關(guān)閉服務(wù)器的情況下完成,則是一個(gè)極大的進(jìn)步。因此 Axis2 對此問題進(jìn)行了處理,提供了 Web 服務(wù)熱部署功能,可以在不必關(guān)閉系統(tǒng)的情況下部署新 Web 服務(wù)。所需要進(jìn)行的工作就是,將所需的 Web 服務(wù)存檔放入到存儲(chǔ)庫的 services 目錄中。然后,部署模型將自動(dòng)部署服務(wù),并進(jìn)行提供。

          熱更新:在不必關(guān)閉系統(tǒng)的情況下對現(xiàn)有 Web 服務(wù)進(jìn)行更改的能力。這是一個(gè)重要的特性,是測試環(huán)境中需要的一個(gè)功能。不過,在實(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),并沒有在運(yùn)行時(shí)更改處理程序鏈的動(dòng)態(tài)方法。

          為了克服這個(gè)問題和增加新特性,Axis2 引入了 Web 服務(wù)擴(kuò)展或模塊的概念;其中模塊的主要工作是對核心功能進(jìn)行擴(kuò)展。在 Axis 1.x 中,可以通過向處理程序鏈添加處理程序來實(shí)現(xiàn)此目標(biāo)。與 Axis 1.x 處理程序鏈相比,使用模塊的優(yōu)勢在于,您可以在根本不改變?nèi)峙渲梦募那闆r下添加新模塊。同時(shí),模塊是一個(gè)自容器,其中可以包含處理程序、第三方庫、模塊相關(guān)資源和模塊配置文件。

          模塊的狀態(tài)
          模塊具有兩個(gè)狀態(tài):availableengaged。將模塊放入存儲(chǔ)庫中,此模塊就為 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è)思路非常簡單。或許您需要支持 WS-Addressing 或 WS-Security。然后您必須下載對應(yīng)的模塊,并將其放置到 Axis2 存儲(chǔ)庫的 modules 目錄中。您可以在部署時(shí)通過向 axis2.xml(Axis2 全局配置文件)添加以下條目使模塊參與系統(tǒng),或在運(yùn)行時(shí)通過使用各種方法(如使用 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è)方法是傳輸級非阻塞調(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è)類,分別名為 ServiceClientOperationClient。ServiceClient API 專門用于只需要發(fā)送和接收 XML 的普通用戶,而 OperationClient 旨在供希望處理 SOAP Header 和其他一些高級任務(wù)的高級用戶使用。通過使用 ServiceClient,您只能訪問 SOAP 主體或有效負(fù)載。當(dāng)然,可以添加 SOAP Header,但無法從服務(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)。不過,如果出現(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)對象,將在調(diào)用完成后立即調(diào)用回調(diào)對象。

          正如前面提到的,OperationClient 用于高級用戶,使用 OperationClient 要求您對 Axis2 有良好的了解。在 ServiceClient 中,您并不需要知道有關(guān) SOAP 信封或消息上下文的任何信息,但對于 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ì)對 Web 服務(wù)概念進(jìn)行驗(yàn)證,而將提供更好的 SOAP 處理模型,且與 Axis 1.x 及其他現(xiàn)有 Web 服務(wù)引擎相比,其速度和內(nèi)容方面的性能都得到很大的提高。此外,它還為用戶提供了方便的 API,用于部署服務(wù)、擴(kuò)展核心功能和新客戶機(jī)編程模型?,F(xiàn)在已經(jīng)進(jìn)入了 Axis2 的時(shí)代了。

          posted on 2007-07-03 13:42 綠茶 閱讀(857) 評論(1)  編輯  收藏 所屬分類: WebService

          FeedBack:
          # re: 現(xiàn)在已經(jīng)進(jìn)入了 Axis2 的時(shí)代:Axis2基礎(chǔ)
          2007-07-03 13:44 | 綠茶
          在IBM developerWorks上有很多web service的文檔,愿和大家一塊兒學(xué)習(xí),有什么資源也告訴我啊,謝謝嘍,嘿嘿http://www-128.ibm.com/developerworks/cn/webservices/   回復(fù)  更多評論
            
          在壓力下共生:)
          我們一起成長
          QQ:176739920

          <2007年7月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 莱阳市| 通河县| 庐江县| 屯门区| 监利县| 和政县| 长治县| 新源县| 凭祥市| 卓尼县| 精河县| 泗洪县| 阳春市| 金沙县| 龙井市| 汝城县| 蓝山县| 天长市| 法库县| 东丽区| 荔波县| 金溪县| 怀柔区| 大关县| 潮安县| 太仆寺旗| 尚义县| 浦北县| 凌海市| 襄樊市| 久治县| 安图县| 怀化市| 汤原县| 新田县| 古蔺县| 神木县| 高淳县| 北安市| 盖州市| 太原市|