原帖地址:http://www.ibm.com/developerworks/cn/webservices/ws-apacheaxis2/
2007 年 2 月 26 日
討論 Apache Axis2 的各個(gè)組成部分,并了解其為何憑借模塊化和可擴(kuò)展特性正逐漸成為下一代 Web 服務(wù)平臺(tái)。
引言
2006 年 5 月推出 Apache Axis2 1.0 是一個(gè)大的里程碑。Axis2 1.1 于 2006 年 11 月推出,提供了大量新功能(其中大部分都是其用戶最初提出的)以及大量錯(cuò)誤修補(bǔ)程序(使其更加穩(wěn)定)。:從最初的 Apache Axis 和 Apache SOAP 到目前的 Axis2,經(jīng)歷了很大的發(fā)展。它不僅更高效、模塊化、基于 XML,而且具有靈活性和可擴(kuò)展性,實(shí)現(xiàn)了安全性和可靠性等企業(yè)功能。Apache Axis2 的易用性和功能確實(shí)使其成為了下一代 Web 服務(wù)平臺(tái)。在本文中,您將了解目前已實(shí)現(xiàn)了哪些功能。您將看到一個(gè)支持新一代可互操作標(biāo)準(zhǔn)(如 WS-Security、WS-Reliable Messaging 和 WS-Addressing)的成熟產(chǎn)品。
Axis2 體系結(jié)構(gòu):組件視圖
圖 1. 組件視圖
AXIS 對(duì)象模型(AXIs Object Model,AXIOM)是 Apache Axis2 的 XML 對(duì)象模型。Axiom 之上的內(nèi)核層包含引擎、模塊和部署框架。在 Axis2 的核心部分沒(méi)有特定于 Java™ 的概念。所有其他組件都在內(nèi)核之上的層中。各種傳輸協(xié)議(如 HTTP 和 SMTP)和數(shù)據(jù)綁定(在 XML 和 Java 代碼之間進(jìn)行轉(zhuǎn)換)并不在核心中,因?yà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 對(duì)象模型 (AXIOM) 是一個(gè) XML 對(duì)象模型,設(shè)計(jì)用于提高 XML 處理期間的內(nèi)存使用率和性能,基于 Pull 解析。通過(guò)使用 Streaming API for XML (StAX) Pull 解析器,AXIOM(也稱為 OM)可以控制解析過(guò)程,以提供延遲構(gòu)建支持。延遲構(gòu)建是指 AXIOM 不完全構(gòu)建對(duì)象模型,模型的其余部分基于用戶的需求構(gòu)建。以下示例對(duì)此概念進(jìn)行了說(shuō)明:
假定某個(gè)用戶需要從 XML 輸入流中獲得第一個(gè)人的 <Location>
元素值,AXIOM 構(gòu)建的對(duì)象模型將一直包含到 <Location>
元素結(jié)束的內(nèi)容,而讓其他內(nèi)容保留在流中:
清單 1. 對(duì)象模型的 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)勢(shì)在于,盡可能僅使用能滿足用戶的需求的內(nèi)存。如果用戶希望訪問(wèn)較大的文檔中前面的數(shù)個(gè)字節(jié)或數(shù)千字節(jié),則延遲構(gòu)建功能將改善該應(yīng)用程序的內(nèi)存需求情況。
可以從任何元素獲得 StAX 事件,而不管是否完整構(gòu)建了對(duì)象模型。在有些情況下,Axis 2 中的此功能非常有用。例如,當(dāng) Axis2 作為中介傳遞時(shí),如果需要僅讀取 SOAP 消息的 Header,AXIOM 將防止其讀取整個(gè) SOAP 消息,使其具有很高的內(nèi)存效率。另一個(gè)例子是,當(dāng) Web 服務(wù)實(shí)現(xiàn)能夠直接使用 StAX 事件時(shí),由于采用了 AXIOM,Web 服務(wù)所需的內(nèi)存非常小。
此外,AXIOM 內(nèi)置了消息傳輸優(yōu)化機(jī)制(Message Transfer Optimization Mechanism,MTOM)支持。對(duì)于 AXIOM 體系結(jié)構(gòu),可以通過(guò)實(shí)現(xiàn) AXIOM 接口并將其插入到 Axis2 中來(lái)執(zhí)行自己的對(duì)象模型。
由于 AXIOM 最初是作為 Axis2 的對(duì)象模型而開(kāi)發(fā)的,因此 AXIOM 提供了構(gòu)建于基礎(chǔ) AXIOM API 之上的 SOAP 接口。這允許您使用 envelope.getHeaders
和 envelope.getBody
之類的便利方法查看 SOAP。
與其他廣泛使用的對(duì)象模型相比,AXIOM 已被證明更快速高效。有關(guān)對(duì) AXIOM 進(jìn)行的一些性能測(cè)試的信息,請(qǐng)參見(jiàn)參考資料。
可擴(kuò)展消息傳遞引擎
正如前面提到的,Axis2 是一個(gè)純 SOAP 處理器,并不依賴于任何 Java 特定的規(guī)范。例如,JAX-WS 將作為 Axis2 上的一個(gè)層實(shí)現(xiàn),而不會(huì)進(jìn)入核心部分中。
圖 2. 可擴(kuò)展消息傳遞引擎
引擎通過(guò)傳輸協(xié)議接收到消息后,將調(diào)用之前注冊(cè)的一系列攔截器(稱為處理程序)。處理程序通常處理 SOAP Header 內(nèi)的信息,不過(guò)并不限制同時(shí)對(duì)消息的其他部分進(jìn)行處理。隨后會(huì)將消息傳遞給消息接收者——消息的最終接收方。消息接收者同時(shí)也負(fù)責(zé)對(duì)消息進(jìn)行相應(yīng)的處理,大部分時(shí)候都會(huì)將此消息傳遞給服務(wù)實(shí)現(xiàn)類進(jìn)行處理。
Axis2 的管道模型
可以使用一組關(guān)系對(duì) Axis2 的核心消息處理部分進(jìn)行建模。Axis2 引擎的傳入消息會(huì)通過(guò)“In”管道。所有傳出消息都會(huì)通過(guò)“Out”管道。
圖 3. Axis2 的管道模型
 |
消息交換模式(Message Exchange Pattern,MEP)
讓我們看一下客戶機(jī)和服務(wù)器之間的消息交換。如果客戶機(jī)需要從服務(wù)器獲得股票報(bào)價(jià),則將向服務(wù)器發(fā)送請(qǐng)求消息,服務(wù)器將隨后向客戶機(jī)發(fā)送一條響應(yīng)消息。從服務(wù)器的角度而言,它將接收一個(gè)“In”消息,發(fā)送一個(gè)“Out”消息。這是用于請(qǐng)求-響應(yīng)方案的模式,名為 In-Out MEP。與此類似,客戶機(jī)可以向服務(wù)器發(fā)送 In-Only 消息來(lái)發(fā)出請(qǐng)求,例如訂閱郵件列表。
有關(guān)消息交換模式的更多信息,請(qǐng)參見(jiàn) W3C 網(wǎng)站。
|
|
通過(guò)組合使用不同數(shù)量的 In 和 Out 管道,Axis2 可以處理任何 MEP。例如,可以使用一個(gè) In 管道和一個(gè) Out 管道來(lái)支持進(jìn)行 In-out 交互。可以使用一個(gè) In 管道來(lái)支持 In-Only 交互。這些管道之間的連接由消息接受者進(jìn)行。
Axis2 可以處理 Web 服務(wù)描述語(yǔ)言(Web Services Description Language,WSDL)2.0 規(guī)范中定義的大部分 MEP,且可以擴(kuò)展為支持任何自定義 MEP。
階段
每個(gè) Axis2 管道內(nèi)部被邏輯劃分為名為階段 (Phase) 的區(qū)域。(階段是管道中的處理程序邏輯集。)將按特定的方式對(duì)這些階段進(jìn)行命名,以表示在該階段對(duì)消息的處理方式。例如,管道中的第一個(gè)階段是 TransportIn
階段,所有進(jìn)行傳輸信息處理的處理程序都可能位于此處。Dispatch
階段中的處理程序?qū)?biāo)識(shí)此消息的目標(biāo)服務(wù)和操作。
這些階段都會(huì)有用處,特別是嘗試部署新處理程序時(shí),因?yàn)槲覀兛梢灾付ㄌ幚沓绦蛐枰谀膫€(gè)階段中執(zhí)行。
上下文層次結(jié)構(gòu)
Axis2 環(huán)境需要在不同的級(jí)別保存信息。例如,整個(gè)引擎公用的信息應(yīng)該在系統(tǒng)級(jí)別進(jìn)行維護(hù),而消息級(jí)別的信息應(yīng)該保存在消息級(jí)別。有些信息是動(dòng)態(tài)的,而有些信息是靜態(tài)的。為了處理這些不同的需求,Axis2 提供了上下文層次結(jié)構(gòu)來(lái)在不同級(jí)別維護(hù)信息。
圖 4. 上下文層次結(jié)構(gòu)
層次結(jié)構(gòu)的左側(cè)包含所有動(dòng)態(tài)信息,而右側(cè)則包含靜態(tài)信息(大部分都是從文件中讀取的)。
MessageContext
包含與所處理的消息相關(guān)的信息,而 OperationContext
包含此消息所屬的特定 MEP 相關(guān)的信息。ConfigurationContext
包含系統(tǒng)級(jí)的動(dòng)態(tài)信息,而 AxisConfiguration
包含系統(tǒng)級(jí)的靜態(tài)信息(大部分都是從 axis2.xml 讀取的)。
調(diào)度
傳入 Axis2 引擎的每條消息都以特定服務(wù)和操作為目標(biāo)。標(biāo)識(shí)此服務(wù)/操作組合的過(guò)程稱為調(diào)度,Axis2 引擎提供了進(jìn)行此工作的四種基本方法:
- 基于請(qǐng)求 URI 進(jìn)行調(diào)度:有時(shí)候可以通過(guò)查看請(qǐng)求 URI 確定消息的目標(biāo)服務(wù)。例如,通過(guò)請(qǐng)求 URI“http://myip/axis2/service/StockQuoteService/getQuote”可以確定,該消息的目的地是
StockQuoteService
的 getQuote
操作。
- 傳輸信息:可以將
SOAPAction
HTTP Header 用于確定服務(wù)和操作。
- WS-Addressing Header:如果傳入消息包含 WS-Addressing Header,也可以將其用于進(jìn)行調(diào)度。
- 如果 SOAP 主體的第一個(gè)子項(xiàng)的 QName 是使用 RPC 規(guī)則定義的,則也可以使用此名稱。
這些是 Axis2 引擎的一些基本功能。我們現(xiàn)在將了解模塊如何為 Axis2 提供擴(kuò)展機(jī)制。
可插入模塊體系結(jié)構(gòu)
模塊為服務(wù)器提供了一個(gè)擴(kuò)展機(jī)制。Axis2 中的每個(gè)模塊都包含一組相關(guān)的處理程序。例如,WS-Addressing 模塊將包含一組為 Axis2 引擎提供 WS-Addressing 支持的處理程序。Axis2 管理員可以下載 WS-Addressing 模塊,并將其部署到 Axis2 引擎中,從而為 Axis2 引擎添加 WS-Addressing 支持。module.xml 文件包含指定處理程序應(yīng)屬于哪個(gè)管道和階段的規(guī)則。
圖 5. 可插入模塊體系結(jié)構(gòu)
模塊非常有用,因?yàn)樵谛枰С帜硞€(gè) WS-* 規(guī)范的情況下,可以下載并部署相應(yīng)的模塊,而不必?fù)?dān)心處理程序應(yīng)該歸入何處。模塊的擴(kuò)展名為 .mar,指示其為模塊存檔 (module archive)。以下是支持已經(jīng)構(gòu)建的 WS-* 規(guī)范的幾個(gè)模塊:
- 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í)別進(jìn)行,具體取決于特定要求:
- 系統(tǒng)級(jí)別:模塊將影響整個(gè)系統(tǒng),此模塊中的處理程序?qū)?yīng)用于傳入系統(tǒng)的所有消息。
- 服務(wù)級(jí)別:此模塊中的處理程序?qū)?yīng)用于以特定服務(wù)為目標(biāo)的消息。這些處理程序應(yīng)該始終部署在調(diào)度階段后。
- 操作級(jí)別:此模塊中的處理程序?qū)?yīng)用于以特定操作為目標(biāo)的消息。這些處理程序應(yīng)該始終部署在調(diào)度階段后。
部署服務(wù)后,可以通過(guò)在描述符中加入一個(gè)較小的條目來(lái)使模塊參與到服務(wù)中。
經(jīng)改進(jìn)的部署模型
Axis2 現(xiàn)在支持將服務(wù)熱部署到 Axis2 引擎中。這就允許用戶在不用重新啟動(dòng)服務(wù)器的情況下部署服務(wù)。服務(wù)應(yīng)該存檔為 ZIP 文件,且在文件名中使用 .aar(Axis2 存檔,Axis2 archive)作為擴(kuò)展名。服務(wù)存檔包含以下信息:
- 服務(wù)實(shí)現(xiàn)類
- Services.xml 文件描述其使用的消息接收者、所需的任何模塊和可用的操作
- 可選依賴庫(kù)打包在 lib 文件夾內(nèi)
可以將這些服務(wù)存檔文件復(fù)制到 Axis2 存儲(chǔ)庫(kù)中(其中包含所有服務(wù)和模塊),或通過(guò) Axis2 所屬的管理控制臺(tái)進(jìn)行更新。
新客戶機(jī) API
Axis2 可以采用兩種方式調(diào)用 Web 服務(wù)。ServiceClient
API 是最簡(jiǎn)單的方法,但為用戶提供的控制較少。OperationClient
API 在調(diào)用期間提供了大量的控制。這兩個(gè) API 都內(nèi)置了基本 In-Out 和 In-Only MEP。
Axis2 現(xiàn)在同時(shí)支持阻塞和非阻塞調(diào)用模型。非阻塞調(diào)用在設(shè)計(jì)用戶界面時(shí)以及服務(wù)調(diào)用非常費(fèi)時(shí)的情況下很有用。
用戶現(xiàn)在可以為調(diào)用的不同路徑選擇不同的傳輸方法。例如,對(duì)于 In-Out 調(diào)用,用戶可以按照以下方式進(jìn)行處理:
- 使用 HTTP 發(fā)送消息,并使用相同的 HTTP 通道接收響應(yīng)(使用一個(gè)雙向通道傳輸方法)
- 使用 HTTP 發(fā)送消息,但使用不同的 HTTP 通道接收響應(yīng)(使用兩個(gè)雙向通道傳輸方法)
- 使用 SMTP 發(fā)送消息,并使用 SMTP 接收響應(yīng)(兩個(gè)不同的傳輸方法)
這個(gè)功能可在選擇交互的恰當(dāng)傳輸時(shí)為用戶提供最大的控制。
可插入數(shù)據(jù)綁定
在純 SOAP 級(jí)別上工作有時(shí)候比較麻煩,因此大部分用戶更喜歡使用 Java 代碼,而讓框架處理 XML 和 Java 代碼間的轉(zhuǎn)換。這稱為數(shù)據(jù)綁定。有很多數(shù)據(jù)綁定框架可用,用戶會(huì)因?yàn)楦鞣N不同的原因而偏好使用某個(gè)框架。Axis2 支持目前可用的大部分?jǐn)?shù)據(jù)綁定框架,而且沒(méi)有任何限制。例如,Axis2 內(nèi)置了對(duì) XMLBeans、JAXB 和 JiBX 的支持,用戶可以選擇使用其中任何一個(gè)。任何其他數(shù)據(jù)綁定框架都可以方便地插入。
Axis2 還提供自己的簡(jiǎn)單數(shù)據(jù)綁定框架,稱為 Axis2 Data Binding (ADB)。這就允許用戶下載 Axis2 并使用它,而不用太多考慮數(shù)據(jù)綁定框架。由于 ADB 和 Axis2 內(nèi)部元素之間實(shí)現(xiàn)了緊密的集成,可以預(yù)見(jiàn),與其他框架相比,此框架的性能和生成代碼維護(hù)方面都更具優(yōu)勢(shì)。最近的 WS 互操作性研討會(huì)中對(duì) ADB 進(jìn)行了大量的測(cè)試(請(qǐng)參見(jiàn)參考資料)。
REST 支持
隨著 Web 2.0 的推出,代表性狀態(tài)傳輸(REpresentational State Transfer,REST)得到了認(rèn)可。一段時(shí)間以來(lái),REST 陣營(yíng)和 SOAP 陣營(yíng)一直在就使用哪個(gè)規(guī)范進(jìn)行激烈的爭(zhēng)論。我們嘗試在 Axis2 中同時(shí)支持二者,采用了 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。我們?cè)谧罱M(jìn)行的互操作性研討會(huì)中成功地進(jìn)行了初始互操作性測(cè)試。
- 工具支持:復(fù)雜操作始終需要使用工具來(lái)簡(jiǎn)化工作。Axis2 隨附了 WSDL2Java 和 Java2WSDL 工具,同時(shí)提供了與 Axis2 協(xié)同工作的 Eclipse 插件。通過(guò)在 Web 容器中部署管理控制臺(tái),可以更方便地對(duì) Axis2 引擎進(jìn)行遠(yuǎn)程管理。
- 各種傳輸協(xié)議支持: Axis2 支持 HTTP、SMTP、TCP 和 JMS。
- Spring 支持:Axis2 內(nèi)置了 Spring 服務(wù)支持。您可以編寫(xiě) Spring Bean,然后方便地使用 Axis2 將其作為 Web 服務(wù)公開(kāi)。
- WS-Policy 集成:Axis2 完全支持 WS-Policy,該規(guī)范已集成到了引擎的核心中。
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
討論
關(guān)于作者
 |

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