引言
Apache Axis2(主要的開源 Web 服務平臺之一)提供了一系列新功能,最為可貴的是,其中的很多功能都對向開發人員提供更為用戶友好的方法起到了促進作用。在之前的 Axis 版本中,并不十分重視用戶友好性。例如,在 Axis1 中,用戶必須手動調用管理客戶機并更新服務器類路徑,然后重新啟動服務器以應用更改。這個有點麻煩的部署模型對新手肯定是一道障礙。因此,Axis2 經過了精心的設計,能夠克服此缺點,并提供更為靈活、可方便進行配置的部署模型。
Axis2 部署新功能
Axis2 部署模型將一系列新功能引入了 Apache Web 服務堆棧中(其中一些功能對于 Web 服務范式并非新事物)。以下列出了最為重要的主要更改和新功能:
- 類似于 Java™ 2 Platform Enterprise Edition (J2EE) 的部署機制(基于存檔)
- 熱部署和熱更新
- 存儲庫(可以在其中放置服務和模塊)
- 處理程序(模塊)部署的更改
- 新部署描述符
- 多個部署選項
在下面的內容中,我們將逐個對每個方面進行詳細討論。
回頁首
類似于 J2EE 的部署機制
在任何 J2EE 應用服務器中,都可以將應用程序作為自包含包部署,可以將所有的資源、配置文件和二進制文件打包為一個文件并進行部署。這顯然非常實用,而也正是因為如此,Axis2 也引入了相同的機制來更方便地部署服務(和模塊)。
考慮這樣的情況,假如您有一個存在多個第三方依賴關系和一組屬性文件的服務,同時假定沒有類似于 J2EE 的部署機制。必須手動將所有這些依賴 JAR 文件和屬性文件放入類路徑中。如果有一個或兩個服務器,這項工作的量將翻倍!在存在數百副本的集群環境中,將依賴 JAR 文件和其他資源添加到類路徑中的做法并不實際。有了類似于 J2EE 的部署機制后,就沒有這些問題了,只需要將服務放入副本中,而不需要進行任何其他工作了。
Axis2 自包含包(或存檔文件)的內部結構如圖 1 中所示。兩種 Axis2 服務(存檔和模塊存檔)非常相似。二者之間的細微差別包括:
- 對于 Axis 服務,描述符文件是 services.xml;而對于 Axis 模塊,描述符文件是 module.xml。
- Axis2 服務的文件擴展名是 .aar(服務的文件名將為 foo.aar),模塊的文件擴展名為 .mar(模塊的文件名將為 foo.mar)。
圖 1. 存檔文件的結構
回頁首
熱部署和熱更新
對于企業級應用程序,可用性是一個大問題。即使短時間的停機都可能帶來很大損失,因此重新啟動服務器并不是一個較好的做法。需要在不用關閉系統的情況下對其進行更新。而這就是熱部署和熱更新的用武之地。熱部署和熱更新是 Apache Web 服務堆棧(如 Axis 和 Axis2)中的新功能。這兩個新功能如下所述:
- 熱部署是指在系統啟動并運行的情況下部署新服務的能力。例如,假定您有兩個服務——service1 和 service2——已啟動并運行,現在要在不用關閉系統的情況下部署名為 service3 的新服務。部署 service3 就是一個熱部署場景。作為系統管理員,如果不喜歡服務的熱部署,則可以通過更改名為 axis2.xml 的 Axis2 全局配置文件,將全局配置參數更改為以下所示,從而關閉此功能:
<parameter name="hotdeployment">false</parameter>
。 - 熱更新是指在不關閉系統的情況下更改現有 Web 服務的能力。這是一個重要的特性,是測試環境中需要的一個功能。不過,在實時系統中使用熱更新并不明智,因為這可能導致系統進入未知狀態。此外,還可能會丟失該服務的現有服務數據。為了防止出現這種情況,Axis2 缺省將熱更新參數設置為 FALSE。如果希望使用此功能,請按照以下所示更改配置參數,從而啟用此功能:
<parameter name="hotupdate">true</parameter>
。
回頁首
存儲庫
Axis2 存儲庫實際上就是文件系統中具有特定結構的目錄。它可以位于本地,也可以位于遠程計算機上。之所以引入存儲庫概念,目的是為了方便地支持基于存檔的熱部署功能。
存儲庫目錄包含兩個主要子目錄,分別名為 services 和 modules。還可能有一個可選的子目錄,名為 lib。如果希望部署服務,需要將服務存檔文件放入 services 目錄中。類似地,如果希望部署模塊,請將模塊存檔文件放入 modules 目錄。對于 lib 目錄,要將其作為放置對服務和模塊公用的第三方庫的位置。圖 2 顯示了存儲庫的圖形表示形式。
圖 2. Axis2 存儲庫
注意:如果 modules 目錄中的部分或全部模塊希望共享某些資源,可以將這些資源添加到 modules 目錄中的 lib 目錄內。類似地,如果 services 目錄中的全部或部分服務希望共享公共資源,恰當的位置是在 services 目錄內的 lib 目錄。
回頁首
處理程序(模塊)部署的更改
服務擴展(或模塊)的概念是 Apache Axis 范式的一個新功能。其基本思想是對系統的核心功能進行擴展或提供服務質量保證。對于 Axis1,如果希望擴展其核心功能,則需要編寫處理程序(執行鏈中的最小單位),更改全局配置文件添加該處理程序,最后要重新啟動系統。
模塊進行相同的工作,但會減少所需進行的工作量。同時,模塊可以通過使用模塊描述文件 modul.xml 來包含一個或多個處理程序。大多數情況下,模塊是特定 WS 規范的實現,例如 Axis2 addressing 模塊就是 WS-Addressing 的實現。
如前面提到的,可以將模塊作為存檔文件部署。模塊存檔文件的結構如圖 3 中所示。
圖 3. 模塊存檔文件的結構
回頁首
新部署描述符
Axis2 的靈活性和可擴展性的重點是其部署描述符。將不再僅處理一個配置文件,而是針對不同的配置級別有不同的配置文件。例如,如果希望向系統添加處理程序,則沒有必要更改全局配置;可以通過僅更改模塊配置文件來完成此工作。Axis2 中有三種類型的描述符或配置文件:
- 全局描述符 (axis2.xml)
- 服務描述符 (services.xml)
- 模塊描述符 (module.xml)
在全局描述符中,所有系統級的配置都在 axis2.xml 中給出,包括以下內容:
Axis2 提供了缺省 axis2.xml。其中包含啟動 Axis2 所需的最小配置,但可以自由對其進行更改,從而使用您自己的 axis2.xml 啟動 Axis2。務必注意,如果對 axis2.xml 進行了任何更改,則必須重新啟動系統,以使這些更改生效。
在服務描述符中,由 services.xml 給出關于服務的配置。為了使服務有效,需要在服務存檔文件中包含 services.xml 文件。服務配置文件包含以下內容:
- 服務級別的參數
- 服務的描述
- 消息接收方
- 需要作為 Web 操作(服務中的操作)公開的操作
- 服務級別的模塊
模塊描述符文件 (module.xml) 包含將模塊插入到系統中所需的配置數據。主要配置包括以下方面:
務必注意,module.xml 還可能包含以下元素:
- 關于模塊的描述(及其實現的規范)
- 端點(對于可靠消息傳遞的情況,就是類似于 create sequence 的端點)
回頁首
Axis2 中可用的部署方法
在 Axis2 中,可采用三種主要方式部署服務:
- 將服務存檔文件放入存儲庫中。
- 使用存檔文件以編程方式創建服務。
- 將服務作為傳統 Java 對象(Plain Old Java Object,POJO)部署。
在 Axis2 中,部署服務的最常用方法是直接將服務存檔文件復制或放置到存儲庫中(services 目錄)。如果使用基于 Axis2 WAR 文件的分發版本,則有兩個選擇:
- 手動將存檔文件放置到存儲庫中。
- 使用 Web 控制臺上載服務。
以編程方式部署并非用戶需求,而是模塊創建者的需求,因為某些模塊要求 Web 服務的部署提供模塊的全部功能。若要以編程方式創建服務,需要使用 services.xml、類加載器(可用于加載您的類文件)和 AxisConfiguration
。此方法的優勢在于,您并不需要將服務存檔文件復制到存儲庫中,而且僅在運行時服務才可見。清單 1 可幫助您形成對編程服務部署方法的基本認識。
清單 1. 編程服務部署
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 類部署服務是 Axis2 中提供的一項使用非常方便的功能,在這種情況下沒有必要生成服務存檔文件或 services.xml。唯一的要求是,必須在創建服務前將 Java 類放入類路徑中。在運行時,可以由模塊或服務創建新服務并進行部署。在 Axis2 中部署 POJO 僅需要三行代碼,如清單 2 中所示。
清單 2. 在 Axis2 中部署 POJO
AxisService service = AxisService.createService( MyService.class.getName(), axisConfig, RPCMessageReceiver.class); axisConfig.addService(service); |
回頁首
總結
Axis2 在這里并不是證明 Web 服務概念,而是提供更好的 SOAP 處理模型,且相對于 Axis1 及其他現有 Web 服務引擎而言,此模型在速度和內存方面性能有了很大的改善。此外,它還提供了方便的部署機制。現在已經進入 Axis2 的時代了!