原帖地址:http://www.ibm.com/developerworks/cn/webservices/ws-axis2soap/
2007 年 4 月 27 日
您是否因?yàn)樾枰〞r(shí)間部署多個(gè)服務(wù)而感到倦怠了呢?是不是每次進(jìn)行更改后都必須重新啟動(dòng)服務(wù)器?Apache Axis2 可以幫您擺脫這些煩惱。Axis2 是干凈的可擴(kuò)展開源 Web 服務(wù)平臺(tái),正逐漸受到廣泛的接受。Axis2 集中了 Apache SOAP 家族的大量?jī)?yōu)勢(shì),而且進(jìn)行了一些重大改進(jìn)。通過(guò)本文可了解 Axis2 部署模型最值得關(guān)注的新功能,正是這些功能使得 Axis2 部署模型比 Axis1 方便易用了許多。
引言
Apache Axis2(主要的開源 Web 服務(wù)平臺(tái)之一)提供了一系列新功能,最為可貴的是,其中的很多功能都對(duì)向開發(fā)人員提供更為用戶友好的方法起到了促進(jìn)作用。在之前的 Axis 版本中,并不十分重視用戶友好性。例如,在 Axis1 中,用戶必須手動(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 部署新功能
Axis2 部署模型將一系列新功能引入了 Apache Web 服務(wù)堆棧中(其中一些功能對(duì)于 Web 服務(wù)范式并非新事物)。以下列出了最為重要的主要更改和新功能:
- 類似于 Java™ 2 Platform Enterprise Edition (J2EE) 的部署機(jī)制(基于存檔)
- 熱部署和熱更新
- 存儲(chǔ)庫(kù)(可以在其中放置服務(wù)和模塊)
- 處理程序(模塊)部署的更改
- 新部署描述符
- 多個(gè)部署選項(xiàng)
在下面的內(nèi)容中,我們將逐個(gè)對(duì)每個(gè)方面進(jìn)行詳細(xì)討論。
類似于 J2EE 的部署機(jī)制
在任何 J2EE 應(yīng)用服務(wù)器中,都可以將應(yīng)用程序作為自包含包部署,可以將所有的資源、配置文件和二進(jìn)制文件打包為一個(gè)文件并進(jìn)行部署。這顯然非常實(shí)用,而也正是因?yàn)槿绱耍珹xis2 也引入了相同的機(jī)制來(lái)更方便地部署服務(wù)(和模塊)。
考慮這樣的情況,假如您有一個(gè)存在多個(gè)第三方依賴關(guān)系和一組屬性文件的服務(wù),同時(shí)假定沒(méi)有類似于 J2EE 的部署機(jī)制。必須手動(dòng)將所有這些依賴 JAR 文件和屬性文件放入類路徑中。如果有一個(gè)或兩個(gè)服務(wù)器,這項(xiàng)工作的量將翻倍!在存在數(shù)百副本的集群環(huán)境中,將依賴 JAR 文件和其他資源添加到類路徑中的做法并不實(shí)際。有了類似于 J2EE 的部署機(jī)制后,就沒(méi)有這些問(wèn)題了,只需要將服務(wù)放入副本中,而不需要進(jìn)行任何其他工作了。
Axis2 自包含包(或存檔文件)的內(nèi)部結(jié)構(gòu)如圖 1 中所示。兩種 Axis2 服務(wù)(存檔和模塊存檔)非常相似。二者之間的細(xì)微差別包括:
- 對(duì)于 Axis 服務(wù),描述符文件是 services.xml;而對(duì)于 Axis 模塊,描述符文件是 module.xml。
- Axis2 服務(wù)的文件擴(kuò)展名是 .aar(服務(wù)的文件名將為 foo.aar),模塊的文件擴(kuò)展名為 .mar(模塊的文件名將為 foo.mar)。
圖 1. 存檔文件的結(jié)構(gòu)
熱部署和熱更新
對(duì)于企業(yè)級(jí)應(yīng)用程序,可用性是一個(gè)大問(wèn)題。即使短時(shí)間的停機(jī)都可能帶來(lái)很大損失,因此重新啟動(dòng)服務(wù)器并不是一個(gè)較好的做法。需要在不用關(guān)閉系統(tǒng)的情況下對(duì)其進(jìn)行更新。而這就是熱部署和熱更新的用武之地。熱部署和熱更新是 Apache Web 服務(wù)堆棧(如 Axis 和 Axis2)中的新功能。這兩個(gè)新功能如下所述:
- 熱部署是指在系統(tǒng)啟動(dòng)并運(yùn)行的情況下部署新服務(wù)的能力。例如,假定您有兩個(gè)服務(wù)——service1 和 service2——已啟動(dòng)并運(yùn)行,現(xiàn)在要在不用關(guān)閉系統(tǒng)的情況下部署名為 service3 的新服務(wù)。部署 service3 就是一個(gè)熱部署場(chǎng)景。作為系統(tǒng)管理員,如果不喜歡服務(wù)的熱部署,則可以通過(guò)更改名為 axis2.xml 的 Axis2 全局配置文件,將全局配置參數(shù)更改為以下所示,從而關(guān)閉此功能:
<parameter name="hotdeployment">false</parameter>
。
- 熱更新是指在不關(guān)閉系統(tǒng)的情況下更改現(xiàn)有 Web 服務(wù)的能力。這是一個(gè)重要的特性,是測(cè)試環(huán)境中需要的一個(gè)功能。不過(guò),在實(shí)時(shí)系統(tǒng)中使用熱更新并不明智,因?yàn)檫@可能導(dǎo)致系統(tǒng)進(jìn)入未知狀態(tài)。此外,還可能會(huì)丟失該服務(wù)的現(xiàn)有服務(wù)數(shù)據(jù)。為了防止出現(xiàn)這種情況,Axis2 缺省將熱更新參數(shù)設(shè)置為 FALSE。如果希望使用此功能,請(qǐng)按照以下所示更改配置參數(shù),從而啟用此功能:
<parameter name="hotupdate">true</parameter>
。
存儲(chǔ)庫(kù)
Axis2 存儲(chǔ)庫(kù)實(shí)際上就是文件系統(tǒng)中具有特定結(jié)構(gòu)的目錄。它可以位于本地,也可以位于遠(yuǎn)程計(jì)算機(jī)上。之所以引入存儲(chǔ)庫(kù)概念,目的是為了方便地支持基于存檔的熱部署功能。
存儲(chǔ)庫(kù)目錄包含兩個(gè)主要子目錄,分別名為 services 和 modules。還可能有一個(gè)可選的子目錄,名為 lib。如果希望部署服務(wù),需要將服務(wù)存檔文件放入 services 目錄中。類似地,如果希望部署模塊,請(qǐng)將模塊存檔文件放入 modules 目錄。對(duì)于 lib 目錄,要將其作為放置對(duì)服務(wù)和模塊公用的第三方庫(kù)的位置。圖 2 顯示了存儲(chǔ)庫(kù)的圖形表示形式。
圖 2. Axis2 存儲(chǔ)庫(kù)
注意:如果 modules 目錄中的部分或全部模塊希望共享某些資源,可以將這些資源添加到 modules 目錄中的 lib 目錄內(nèi)。類似地,如果 services 目錄中的全部或部分服務(wù)希望共享公共資源,恰當(dāng)?shù)奈恢檬窃?services 目錄內(nèi)的 lib 目錄。
處理程序(模塊)部署的更改
服務(wù)擴(kuò)展(或模塊)的概念是 Apache Axis 范式的一個(gè)新功能。其基本思想是對(duì)系統(tǒng)的核心功能進(jìn)行擴(kuò)展或提供服務(wù)質(zhì)量保證。對(duì)于 Axis1,如果希望擴(kuò)展其核心功能,則需要編寫處理程序(執(zhí)行鏈中的最小單位),更改全局配置文件添加該處理程序,最后要重新啟動(dòng)系統(tǒng)。
模塊進(jìn)行相同的工作,但會(huì)減少所需進(jìn)行的工作量。同時(shí),模塊可以通過(guò)使用模塊描述文件 modul.xml 來(lái)包含一個(gè)或多個(gè)處理程序。大多數(shù)情況下,模塊是特定 WS 規(guī)范的實(shí)現(xiàn),例如 Axis2 addressing 模塊就是 WS-Addressing 的實(shí)現(xiàn)。
如前面提到的,可以將模塊作為存檔文件部署。模塊存檔文件的結(jié)構(gòu)如圖 3 中所示。
圖 3. 模塊存檔文件的結(jié)構(gòu)
新部署描述符
Axis2 的靈活性和可擴(kuò)展性的重點(diǎn)是其部署描述符。將不再僅處理一個(gè)配置文件,而是針對(duì)不同的配置級(jí)別有不同的配置文件。例如,如果希望向系統(tǒng)添加處理程序,則沒(méi)有必要更改全局配置;可以通過(guò)僅更改模塊配置文件來(lái)完成此工作。Axis2 中有三種類型的描述符或配置文件:
- 全局描述符 (axis2.xml)
- 服務(wù)描述符 (services.xml)
- 模塊描述符 (module.xml)
在全局描述符中,所有系統(tǒng)級(jí)的配置都在 axis2.xml 中給出,包括以下內(nèi)容:
- 參數(shù)
- 傳輸發(fā)送方
- 傳輸偵聽器
- 階段
- 全局模塊
Axis2 提供了缺省 axis2.xml。其中包含啟動(dòng) Axis2 所需的最小配置,但可以自由對(duì)其進(jìn)行更改,從而使用您自己的 axis2.xml 啟動(dòng) Axis2。務(wù)必注意,如果對(duì) axis2.xml 進(jìn)行了任何更改,則必須重新啟動(dòng)系統(tǒng),以使這些更改生效。
在服務(wù)描述符中,由 services.xml 給出關(guān)于服務(wù)的配置。為了使服務(wù)有效,需要在服務(wù)存檔文件中包含 services.xml 文件。服務(wù)配置文件包含以下內(nèi)容:
- 服務(wù)級(jí)別的參數(shù)
- 服務(wù)的描述
- 消息接收方
- 需要作為 Web 操作(服務(wù)中的操作)公開的操作
- 服務(wù)級(jí)別的模塊
模塊描述符文件 (module.xml) 包含將模塊插入到系統(tǒng)中所需的配置數(shù)據(jù)。主要配置包括以下方面:
- 處理程序及其階段規(guī)則
- 模塊參數(shù)
務(wù)必注意,module.xml 還可能包含以下元素:
- 關(guān)于模塊的描述(及其實(shí)現(xiàn)的規(guī)范)
- 端點(diǎn)(對(duì)于可靠消息傳遞的情況,就是類似于 create sequence 的端點(diǎn))
Axis2 中可用的部署方法
在 Axis2 中,可采用三種主要方式部署服務(wù):
- 將服務(wù)存檔文件放入存儲(chǔ)庫(kù)中。
- 使用存檔文件以編程方式創(chuàng)建服務(wù)。
- 將服務(wù)作為傳統(tǒng) Java 對(duì)象(Plain Old Java Object,POJO)部署。
在 Axis2 中,部署服務(wù)的最常用方法是直接將服務(wù)存檔文件復(fù)制或放置到存儲(chǔ)庫(kù)中(services 目錄)。如果使用基于 Axis2 WAR 文件的分發(fā)版本,則有兩個(gè)選擇:
- 手動(dòng)將存檔文件放置到存儲(chǔ)庫(kù)中。
- 使用 Web 控制臺(tái)上載服務(wù)。
以編程方式部署并非用戶需求,而是模塊創(chuàng)建者的需求,因?yàn)槟承┠K要求 Web 服務(wù)的部署提供模塊的全部功能。若要以編程方式創(chuàng)建服務(wù),需要使用 services.xml、類加載器(可用于加載您的類文件)和 AxisConfiguration
。此方法的優(yōu)勢(shì)在于,您并不需要將服務(wù)存檔文件復(fù)制到存儲(chǔ)庫(kù)中,而且僅在運(yùn)行時(shí)服務(wù)才可見。清單 1 可幫助您形成對(duì)編程服務(wù)部署方法的基本認(rèn)識(shí)。
清單 1. 編程服務(wù)部署
AxisConfiguration axisConfig;
// you need to have reference to AxisConfiguration
File file = new File("Location of the file"");
ClassLoader clsLoader = new URLClassLoader(new URL[]{file.toURL()});
InputStream in = new FileInputStream("location of service.xml");
AxisService service = DeploymentEngine.buildService(in, clsLoader, axisConfig);
|
使用 Java 類部署服務(wù)是 Axis2 中提供的一項(xiàng)使用非常方便的功能,在這種情況下沒(méi)有必要生成服務(wù)存檔文件或 services.xml。唯一的要求是,必須在創(chuàng)建服務(wù)前將 Java 類放入類路徑中。在運(yùn)行時(shí),可以由模塊或服務(wù)創(chuàng)建新服務(wù)并進(jìn)行部署。在 Axis2 中部署 POJO 僅需要三行代碼,如清單 2 中所示。
清單 2. 在 Axis2 中部署 POJO
AxisService service = AxisService.createService(
MyService.class.getName(), axisConfig, RPCMessageReceiver.class);
axisConfig.addService(service);
|
總結(jié)
Axis2 在這里并不是證明 Web 服務(wù)概念,而是提供更好的 SOAP 處理模型,且相對(duì)于 Axis1 及其他現(xiàn)有 Web 服務(wù)引擎而言,此模型在速度和內(nèi)存方面性能有了很大的改善。此外,它還提供了方便的部署機(jī)制。現(xiàn)在已經(jīng)進(jìn)入 Axis2 的時(shí)代了!
參考資料
學(xué)習(xí)
獲得產(chǎn)品和技術(shù)
- 使用 IBM 試用軟件開發(fā)您的下一個(gè)項(xiàng)目,可下載或索取 DVD 光盤。
討論
關(guān)于作者
 |

|
 |
Deepal Jayasinghe 是 Apache PMC 成員和 Apache Committer,目前在從事 Apache Axis2 和 Apache Synapse 的體系結(jié)構(gòu)設(shè)計(jì)和開發(fā)工作。他從一開始就擔(dān)任 Apache Axis2 項(xiàng)目的核心架構(gòu)師和核心開發(fā)人員。他專長(zhǎng)于分布式計(jì)算、容錯(cuò)系統(tǒng)和 Web 服務(wù)相關(guān)技術(shù)。
|