Web 應用程式和 OSGi

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

自 Spring Dynamic Modules 的第一個里程碑以來,開始收到在 OSGi 中執行 Web 應用程式的請求。 它可能是最受歡迎的功能之一,而且毫無疑問,一旦發布 1.0 正式版,Web 支援已成為 1.1 分支的主要重點。 我很高興地報告,隨著剛發布的 M2,正如 Juergen 暗示的那樣,Spring-DM 不僅支援普通的 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 檔,也可以將 Web 容器(以某種服務的形式)部署在 OSGi 平台內。 更多關於這方面的資訊,將在以後的文章中介紹。

這項可選服務提供了一個簡單的 API 用於註冊Servlet和靜態資源,這些資源被映射到傳入的 HTTP 請求。 為了在 OSGi 內部

serving requests inside OSGi, one must programmatically create theServlet提供請求,必須以程式方式建立Servlet實例,並通過上述 API 註冊它。 此外,Http Service 僅支援Servlet2.1 規範,這可能非常不方便,因為過濾器和監聽器(今天幾乎所有 Web 框架都使用)不可用。 今天可用的大多數(如果不是全部)在 OSGi 中運行 Web 應用程式的解決方案都依賴於 Http Service 的功能。 其中一些使用以下技術之一解決上述問題(據我所知):

  • 通過強制執行新的或翻譯現有的宣告式方法(例如web.xml)到 Http Service 的呼叫來消除對程式碼的需求
  • 通過在 2.1 API 的基礎上構建(例如,過濾器可以通過裝飾Servlet實例)或通過擴展標準 API 來提供 2.1+ 功能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 Transaction Manager 或 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 社群中所有即將舉行的活動。

查看全部