原帖地址:http://www.ibm.com/developerworks/cn/webservices/ws-apacheaxis2/

2007 年 2 月 26 日

討論 Apache Axis2 的各個組成部分,并了解其為何憑借模塊化和可擴(kuò)展特性正逐漸成為下一代 Web 服務(wù)平臺。

引言

2006 年 5 月推出 Apache Axis2 1.0 是一個大的里程碑。Axis2 1.1 于 2006 年 11 月推出,提供了大量新功能(其中大部分都是其用戶最初提出的)以及大量錯誤修補(bǔ)程序(使其更加穩(wěn)定)。:從最初的 Apache Axis 和 Apache SOAP 到目前的 Axis2,經(jīng)歷了很大的發(fā)展。它不僅更高效、模塊化、基于 XML,而且具有靈活性和可擴(kuò)展性,實(shí)現(xiàn)了安全性和可靠性等企業(yè)功能。Apache Axis2 的易用性和功能確實(shí)使其成為了下一代 Web 服務(wù)平臺。在本文中,您將了解目前已實(shí)現(xiàn)了哪些功能。您將看到一個支持新一代可互操作標(biāo)準(zhǔn)(如 WS-Security、WS-Reliable Messaging 和 WS-Addressing)的成熟產(chǎn)品。

Axis2 體系結(jié)構(gòu):組件視圖


圖 1. 組件視圖
圖 1. 組件視圖

AXIS 對象模型(AXIs Object Model,AXIOM)是 Apache Axis2 的 XML 對象模型。Axiom 之上的內(nèi)核層包含引擎、模塊和部署框架。在 Axis2 的核心部分沒有特定于 Java™ 的概念。所有其他組件都在內(nèi)核之上的層中。各種傳輸協(xié)議(如 HTTP 和 SMTP)和數(shù)據(jù)綁定(在 XML 和 Java 代碼之間進(jìn)行轉(zhuǎn)換)并不在核心中,因為它們是可插入的,因此提供了很大的靈活性。所有其他相關(guān)技術(shù)(如 Java API for XML Web Services (JAX-WS))都在 Axis2 之上的層次中。

我們現(xiàn)在將分析 Axis2 的以下組件:

  • AXIOM(新 XML 信息集表示形式)
  • 可擴(kuò)展消息傳遞引擎
  • 可插入模塊體系結(jié)構(gòu)
  • 經(jīng)改進(jìn)的部署模型
  • 新客戶機(jī) API
  • 可插入數(shù)據(jù)綁定
  • 代表性狀態(tài)傳輸(Representational State Transfer,REST)支持

AXIOM

AXIs 對象模型 (AXIOM) 是一個 XML 對象模型,設(shè)計用于提高 XML 處理期間的內(nèi)存使用率和性能,基于 Pull 解析。通過使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱為 OM)可以控制解析過程,以提供延遲構(gòu)建支持。延遲構(gòu)建是指 AXIOM 不完全構(gòu)建對象模型,模型的其余部分基于用戶的需求構(gòu)建。以下示例對此概念進(jìn)行了說明:

假定某個用戶需要從 XML 輸入流中獲得第一個人的 <Location> 元素值,AXIOM 構(gòu)建的對象模型將一直包含到 <Location> 元素結(jié)束的內(nèi)容,而讓其他內(nèi)容保留在流中:


清單 1. 對象模型的 AXIOM 部分構(gòu)建
            <Persons>
            <Person>
            <Name>Dihini Himahansi</Name>
            <Sex>Female</Sex>
            <Location>Colombo, Sri Lanka</Location>
            <--- Object model is being built only up to this point
            </Person>
            <Person>
            <Name>Thushari Damayanthi</Name>
            <Sex>Female</Sex>
            <Location>Elpitiya, Sri Lanka</Location>
            </Person>
            </Persons>
            

這里的優(yōu)勢在于,盡可能僅使用能滿足用戶的需求的內(nèi)存。如果用戶希望訪問較大的文檔中前面的數(shù)個字節(jié)或數(shù)千字節(jié),則延遲構(gòu)建功能將改善該應(yīng)用程序的內(nèi)存需求情況。

可以從任何元素獲得 StAX 事件,而不管是否完整構(gòu)建了對象模型。在有些情況下,Axis 2 中的此功能非常有用。例如,當(dāng) Axis2 作為中介傳遞時,如果需要僅讀取 SOAP 消息的 Header,AXIOM 將防止其讀取整個 SOAP 消息,使其具有很高的內(nèi)存效率。另一個例子是,當(dāng) Web 服務(wù)實(shí)現(xiàn)能夠直接使用 StAX 事件時,由于采用了 AXIOM,Web 服務(wù)所需的內(nèi)存非常小。

此外,AXIOM 內(nèi)置了消息傳輸優(yōu)化機(jī)制(Message Transfer Optimization Mechanism,MTOM)支持。對于 AXIOM 體系結(jié)構(gòu),可以通過實(shí)現(xiàn) AXIOM 接口并將其插入到 Axis2 中來執(zhí)行自己的對象模型。

由于 AXIOM 最初是作為 Axis2 的對象模型而開發(fā)的,因此 AXIOM 提供了構(gòu)建于基礎(chǔ) AXIOM API 之上的 SOAP 接口。這允許您使用 envelope.getHeadersenvelope.getBody 之類的便利方法查看 SOAP。

與其他廣泛使用的對象模型相比,AXIOM 已被證明更快速高效。有關(guān)對 AXIOM 進(jìn)行的一些性能測試的信息,請參見參考資料





回頁首


可擴(kuò)展消息傳遞引擎

正如前面提到的,Axis2 是一個純 SOAP 處理器,并不依賴于任何 Java 特定的規(guī)范。例如,JAX-WS 將作為 Axis2 上的一個層實(shí)現(xiàn),而不會進(jìn)入核心部分中。


圖 2. 可擴(kuò)展消息傳遞引擎
圖 2. 可擴(kuò)展消息傳遞引擎

引擎通過傳輸協(xié)議接收到消息后,將調(diào)用之前注冊的一系列攔截器(稱為處理程序)。處理程序通常處理 SOAP Header 內(nèi)的信息,不過并不限制同時對消息的其他部分進(jìn)行處理。隨后會將消息傳遞給消息接收者——消息的最終接收方。消息接收者同時也負(fù)責(zé)對消息進(jìn)行相應(yīng)的處理,大部分時候都會將此消息傳遞給服務(wù)實(shí)現(xiàn)類進(jìn)行處理。

Axis2 的管道模型

可以使用一組關(guān)系對 Axis2 的核心消息處理部分進(jìn)行建模。Axis2 引擎的傳入消息會通過“In”管道。所有傳出消息都會通過“Out”管道。


圖 3. Axis2 的管道模型
圖 3. Axis2 的管道模型

消息交換模式(Message Exchange Pattern,MEP)
讓我們看一下客戶機(jī)和服務(wù)器之間的消息交換。如果客戶機(jī)需要從服務(wù)器獲得股票報價,則將向服務(wù)器發(fā)送請求消息,服務(wù)器將隨后向客戶機(jī)發(fā)送一條響應(yīng)消息。從服務(wù)器的角度而言,它將接收一個“In”消息,發(fā)送一個“Out”消息。這是用于請求-響應(yīng)方案的模式,名為 In-Out MEP。與此類似,客戶機(jī)可以向服務(wù)器發(fā)送 In-Only 消息來發(fā)出請求,例如訂閱郵件列表。

有關(guān)消息交換模式的更多信息,請參見 W3C 網(wǎng)站

通過組合使用不同數(shù)量的 In 和 Out 管道,Axis2 可以處理任何 MEP。例如,可以使用一個 In 管道和一個 Out 管道來支持進(jìn)行 In-out 交互。可以使用一個 In 管道來支持 In-Only 交互。這些管道之間的連接由消息接受者進(jìn)行。

Axis2 可以處理 Web 服務(wù)描述語言(Web Services Description Language,WSDL)2.0 規(guī)范中定義的大部分 MEP,且可以擴(kuò)展為支持任何自定義 MEP。

階段

每個 Axis2 管道內(nèi)部被邏輯劃分為名為階段 (Phase) 的區(qū)域。(階段是管道中的處理程序邏輯集。)將按特定的方式對這些階段進(jìn)行命名,以表示在該階段對消息的處理方式。例如,管道中的第一個階段是 TransportIn 階段,所有進(jìn)行傳輸信息處理的處理程序都可能位于此處。Dispatch 階段中的處理程序?qū)?biāo)識此消息的目標(biāo)服務(wù)和操作。

這些階段都會有用處,特別是嘗試部署新處理程序時,因為我們可以指定處理程序需要在哪個階段中執(zhí)行。

上下文層次結(jié)構(gòu)

Axis2 環(huán)境需要在不同的級別保存信息。例如,整個引擎公用的信息應(yīng)該在系統(tǒng)級別進(jìn)行維護(hù),而消息級別的信息應(yīng)該保存在消息級別。有些信息是動態(tài)的,而有些信息是靜態(tài)的。為了處理這些不同的需求,Axis2 提供了上下文層次結(jié)構(gòu)來在不同級別維護(hù)信息。


圖 4. 上下文層次結(jié)構(gòu)
圖 4. 上下文層次結(jié)構(gòu)

層次結(jié)構(gòu)的左側(cè)包含所有動態(tài)信息,而右側(cè)則包含靜態(tài)信息(大部分都是從文件中讀取的)。

MessageContext 包含與所處理的消息相關(guān)的信息,而 OperationContext 包含此消息所屬的特定 MEP 相關(guān)的信息。ConfigurationContext 包含系統(tǒng)級的動態(tài)信息,而 AxisConfiguration 包含系統(tǒng)級的靜態(tài)信息(大部分都是從 axis2.xml 讀取的)。

調(diào)度

傳入 Axis2 引擎的每條消息都以特定服務(wù)和操作為目標(biāo)。標(biāo)識此服務(wù)/操作組合的過程稱為調(diào)度,Axis2 引擎提供了進(jìn)行此工作的四種基本方法:

  1. 基于請求 URI 進(jìn)行調(diào)度:有時候可以通過查看請求 URI 確定消息的目標(biāo)服務(wù)。例如,通過請求 URI“http://myip/axis2/service/StockQuoteService/getQuote”可以確定,該消息的目的地是 StockQuoteServicegetQuote 操作。
  2. 傳輸信息:可以將 SOAPAction HTTP Header 用于確定服務(wù)和操作。
  3. WS-Addressing Header:如果傳入消息包含 WS-Addressing Header,也可以將其用于進(jìn)行調(diào)度。
  4. 如果 SOAP 主體的第一個子項的 QName 是使用 RPC 規(guī)則定義的,則也可以使用此名稱。

這些是 Axis2 引擎的一些基本功能。我們現(xiàn)在將了解模塊如何為 Axis2 提供擴(kuò)展機(jī)制。





回頁首


可插入模塊體系結(jié)構(gòu)

模塊為服務(wù)器提供了一個擴(kuò)展機(jī)制。Axis2 中的每個模塊都包含一組相關(guān)的處理程序。例如,WS-Addressing 模塊將包含一組為 Axis2 引擎提供 WS-Addressing 支持的處理程序。Axis2 管理員可以下載 WS-Addressing 模塊,并將其部署到 Axis2 引擎中,從而為 Axis2 引擎添加 WS-Addressing 支持。module.xml 文件包含指定處理程序應(yīng)屬于哪個管道和階段的規(guī)則。


圖 5. 可插入模塊體系結(jié)構(gòu)
圖 5. 可插入模塊體系結(jié)構(gòu)

模塊非常有用,因為在需要支持某個 WS-* 規(guī)范的情況下,可以下載并部署相應(yīng)的模塊,而不必?fù)?dān)心處理程序應(yīng)該歸入何處。模塊的擴(kuò)展名為 .mar,指示其為模塊存檔 (module archive)。以下是支持已經(jīng)構(gòu)建的 WS-* 規(guī)范的幾個模塊:

  • Sandesha2 模塊:提供 WS-Reliable Messaging 支持
  • WS-Addressing 模塊:為 Axis2 提供 WS-Addressing 支持
  • Rampart 和 Rahas 模塊:提供 WS-SX(安全相關(guān)規(guī)范)支持
  • Kandula 模塊:提供 WS-AT 支持
  • Savan 模塊:提供 WS-Eventing 支持

模塊可用性和參與

模塊部署到 Axis2 引擎中后,它就“可用”,并能夠參與到系統(tǒng)中。模塊的參與可以在以下級別進(jìn)行,具體取決于特定要求:

  • 系統(tǒng)級別:模塊將影響整個系統(tǒng),此模塊中的處理程序?qū)?yīng)用于傳入系統(tǒng)的所有消息。
  • 服務(wù)級別:此模塊中的處理程序?qū)?yīng)用于以特定服務(wù)為目標(biāo)的消息。這些處理程序應(yīng)該始終部署在調(diào)度階段后。
  • 操作級別:此模塊中的處理程序?qū)?yīng)用于以特定操作為目標(biāo)的消息。這些處理程序應(yīng)該始終部署在調(diào)度階段后。

部署服務(wù)后,可以通過在描述符中加入一個較小的條目來使模塊參與到服務(wù)中。





回頁首


經(jīng)改進(jìn)的部署模型

Axis2 現(xiàn)在支持將服務(wù)熱部署到 Axis2 引擎中。這就允許用戶在不用重新啟動服務(wù)器的情況下部署服務(wù)。服務(wù)應(yīng)該存檔為 ZIP 文件,且在文件名中使用 .aar(Axis2 存檔,Axis2 archive)作為擴(kuò)展名。服務(wù)存檔包含以下信息:

  • 服務(wù)實(shí)現(xiàn)類
  • Services.xml 文件描述其使用的消息接收者、所需的任何模塊和可用的操作
  • 可選依賴庫打包在 lib 文件夾內(nèi)

可以將這些服務(wù)存檔文件復(fù)制到 Axis2 存儲庫中(其中包含所有服務(wù)和模塊),或通過 Axis2 所屬的管理控制臺進(jìn)行更新。





回頁首


新客戶機(jī) API

Axis2 可以采用兩種方式調(diào)用 Web 服務(wù)。ServiceClient API 是最簡單的方法,但為用戶提供的控制較少。OperationClient API 在調(diào)用期間提供了大量的控制。這兩個 API 都內(nèi)置了基本 In-Out 和 In-Only MEP。

Axis2 現(xiàn)在同時支持阻塞和非阻塞調(diào)用模型。非阻塞調(diào)用在設(shè)計用戶界面時以及服務(wù)調(diào)用非常費(fèi)時的情況下很有用。

用戶現(xiàn)在可以為調(diào)用的不同路徑選擇不同的傳輸方法。例如,對于 In-Out 調(diào)用,用戶可以按照以下方式進(jìn)行處理:

  • 使用 HTTP 發(fā)送消息,并使用相同的 HTTP 通道接收響應(yīng)(使用一個雙向通道傳輸方法)
  • 使用 HTTP 發(fā)送消息,但使用不同的 HTTP 通道接收響應(yīng)(使用兩個雙向通道傳輸方法)
  • 使用 SMTP 發(fā)送消息,并使用 SMTP 接收響應(yīng)(兩個不同的傳輸方法)

這個功能可在選擇交互的恰當(dāng)傳輸時為用戶提供最大的控制。





回頁首


可插入數(shù)據(jù)綁定

在純 SOAP 級別上工作有時候比較麻煩,因此大部分用戶更喜歡使用 Java 代碼,而讓框架處理 XML 和 Java 代碼間的轉(zhuǎn)換。這稱為數(shù)據(jù)綁定。有很多數(shù)據(jù)綁定框架可用,用戶會因為各種不同的原因而偏好使用某個框架。Axis2 支持目前可用的大部分?jǐn)?shù)據(jù)綁定框架,而且沒有任何限制。例如,Axis2 內(nèi)置了對 XMLBeans、JAXB 和 JiBX 的支持,用戶可以選擇使用其中任何一個。任何其他數(shù)據(jù)綁定框架都可以方便地插入。

Axis2 還提供自己的簡單數(shù)據(jù)綁定框架,稱為 Axis2 Data Binding (ADB)。這就允許用戶下載 Axis2 并使用它,而不用太多考慮數(shù)據(jù)綁定框架。由于 ADB 和 Axis2 內(nèi)部元素之間實(shí)現(xiàn)了緊密的集成,可以預(yù)見,與其他框架相比,此框架的性能和生成代碼維護(hù)方面都更具優(yōu)勢。最近的 WS 互操作性研討會中對 ADB 進(jìn)行了大量的測試(請參見參考資料)。





回頁首


REST 支持

隨著 Web 2.0 的推出,代表性狀態(tài)傳輸(REpresentational State Transfer,REST)得到了認(rèn)可。一段時間以來,REST 陣營和 SOAP 陣營一直在就使用哪個規(guī)范進(jìn)行激烈的爭論。我們嘗試在 Axis2 中同時支持二者,采用了 WSDL 2.0 中將 REST 與 Web 服務(wù)結(jié)合的工作成果。

在 Axis2 中,用戶可以調(diào)用 Axis2 引擎中采用 REST 方式部署的所有 Web 服務(wù),但受到 WSDL 2.0 HTTP Bindings 規(guī)范中定義的約束的限制。





回頁首


Axis2 中其他值得注意的改進(jìn)

  • WSDL 2.0 支持:Axis2 現(xiàn)在支持 WSDL 2.0。我們在最近進(jìn)行的互操作性研討會中成功地進(jìn)行了初始互操作性測試。
  • 工具支持:復(fù)雜操作始終需要使用工具來簡化工作。Axis2 隨附了 WSDL2Java 和 Java2WSDL 工具,同時提供了與 Axis2 協(xié)同工作的 Eclipse 插件。通過在 Web 容器中部署管理控制臺,可以更方便地對 Axis2 引擎進(jìn)行遠(yuǎn)程管理。
  • 各種傳輸協(xié)議支持: Axis2 支持 HTTP、SMTP、TCP 和 JMS。
  • Spring 支持:Axis2 內(nèi)置了 Spring 服務(wù)支持。您可以編寫 Spring Bean,然后方便地使用 Axis2 將其作為 Web 服務(wù)公開。
  • WS-Policy 集成:Axis2 完全支持 WS-Policy,該規(guī)范已集成到了引擎的核心中。


參考資料

學(xué)習(xí)

獲得產(chǎn)品和技術(shù)

討論


關(guān)于作者

Eran Chinthaka 是首創(chuàng) Apache Axis 2 項目的架構(gòu)師,專職是 Lanka Software Foundation 的軟件工程師。他曾經(jīng)為 Axis 2 實(shí)現(xiàn)了 AXIOM、WS-Addressing、SOAP 1.1 和 1.2,以及 BPEL4WS 的可視化建模工具。此外,他還做過 Web 服務(wù)、業(yè)務(wù)過程自動化、移動開發(fā)和電信網(wǎng)絡(luò)管理項目的架構(gòu)師。