Web 應用程式和 OSGi

工程 | Costin Leau | 2008 年 4 月 29 日 | ...

自從 Spring Dynamic Modules 的第一個里程碑版本以來,就不斷有關於在 OSGi 中執行 Web 應用程式的請求。 這可能是最受請求的功能之一,毫不奇怪,一旦 1.0 最終版釋出,Web 支援就成為 1.1 分支的主要關注點。 我很高興地報告,隨著剛剛釋出的 M2,正如 Juergen 已經暗示的那樣,Spring-DM 不僅支援 vanilla war 檔案(自 1.1.0 M1 起可用),還支援在 OSGi 中執行的 Spring-MVC 應用程式。 在這篇文章中,我想簡要討論典型的 OSGi Web 場景和 Spring-DM 的方法。 但首先,

為什麼要在 OSGi 中部署 WAR 檔案?

簡單的問題:OSGi *原生*提供版本控制、包連線和熱過載。 想象一下在你的應用程式中利用這些特性:你可以停止嵌入庫在WEB-INF/lib並開始在你的 Web 應用程式之間共享它們,避免 taglibs 的重複(同時保持多個版本執行),並在執行時只更新應用程式的某些部分。 這特別有用,因為 Web 應用程式往往是分層的,因此在其生命週期內會受到大量更改。

為什麼 OSGi 中的 Web 應用程式存在問題?

Servlet 規範圍繞 *Web 容器* 的概念展開:Web 元件的執行時環境,提供標準服務,如生命週期管理(物件建立和銷燬,執行緒分配)、併發、HTTP 請求處理等。 另一方面,OSGi 平臺也充當一個託管環境,具有其服務登錄檔、包連線和版本控制(僅舉幾個例子)。 為了解決這個問題,OSGi 委員會設計了組合規範的一部分,即 Http Service

順便說一句,當處理兩個託管環境時,人們面臨一個有趣的問題:使用什麼部署模型? 也就是說,哪個是引導平臺,哪個是嵌入的? 在我們的例子中,可以部署 OSGi 平臺作為一個 WAR 檔案,或者在 OSGi 平臺內部部署 Web 容器(以某種服務形式)。 不過,更多關於這方面的內容將在以後的文章中介紹。

這個可選服務提供了一個簡單的 API 用於註冊Servlet和對映到傳入 HTTP 請求的靜態資源。 為了有一個Servlet在 OSGi 內部提供服務的例項,必須以程式設計方式建立Servlet例項並透過上述 API 註冊它。 此外,Http 服務僅支援Servlet2.1 規範,這可能非常不方便,因為過濾器和監聽器(今天幾乎所有 Web 框架都在使用)都不可用。 目前可用的(據我所知)在 OSGi 中執行 Web 應用程式的大多數(如果不是全部)解決方案都依賴於 Http Service 的功能。 一些人使用以下技術之一(據我所知)解決了上述問題

  • 透過強加新的或翻譯現有的宣告式方法(例如web.xml)到對 Http Service 的呼叫中,從而消除對程式碼的需求
  • 提供Servlet透過構建在 2.1 API 之上(例如,過濾器可以透過裝飾一個Servlet例項)或透過擴充套件標準 API,提供 2.1+ 功能
這兩種方法都可以成功並取得很大進展,但在 Spring-DM 中,我們選擇了一種不同的、獨特的方法,透過

直接與 Web 容器整合

在 Spring-DM 中,OSGi 和容器空間被橋接:WAR 檔案像往常一樣部署到 Web 容器,使用 OSGi 空間進行其類路徑和資源查詢。 這種方法的主要優點是,對於 OSGi 平臺和 Web 容器來說,沒有什麼大的變化——這只是“一切照常”。

使用 Spring-DM,你可以獲得

  • 完整的 Servlet 2.4/2.5、JSP 2.0/2.1 規範支援
  • 容器功能的可用性(阻塞與非阻塞 IO,執行緒池中分配的執行緒等等)
  • 完全訪問web.xml語法,無論是關於過濾器、監聽器、對映宣告、安全性,甚至是 jndi 引用。 這在容器與 JTA 事務管理器或 JMS 佇列整合的情況下尤其有用。 請注意,Spring-DM 不進行解析(我們認為容器在這方面做得比我們好得多)
  • 容器特定的配置檔案(例如 Tomcat 的META-INF/context.xml)

以上所有以及更多都是可能的,因為 Spring-DM 將 bundles **原生** 部署到所選的 Web 容器(目前開箱即支援 Apache Tomcat 5.5.x/6.0.x 和 Jetty 6.1.x+)。 這意味著 Web 容器例項化和管理 Web 應用程式,因此容器支援的幾乎所有內容都可供 OSGi bundles 使用。

雖然 1.1 尚未最終釋出,但我鼓勵您嘗試一下 M2API 幾乎是穩定的,並且新功能已經記錄(隨著我們接近 GA 版本,會有更多內容) - 如果您需要幫助,請檢視 Spring-DM 論壇(是的,我們終於有了一個)和郵件列表。 此外,如果您恰好在 JavaOne,請到 SpringSource 展位,您將從源頭獲得答案。

獲取 Spring 新聞簡報

透過 Spring 新聞簡報保持聯絡

訂閱

取得領先

VMware 提供培訓和認證來加速您的進步。

瞭解更多

獲得支援

Tanzu Spring 在一個簡單的訂閱中提供 OpenJDK™、Spring 和 Apache Tomcat® 的支援和二進位制檔案。

瞭解更多

即將舉行的活動

檢視 Spring 社群中所有即將舉行的活動。

檢視全部