簡體   English   中英

jetty、felix、bundles 和 webapps 的合適嵌入機制是什么

[英]What is the appropriate embedding mechanism for jetty, felix, bundles and webapps

找了半天也沒有找到好的答案,我來到了找到好的答案的地方。

我正在創建獨立應用程序(在 WAR 中建模為 WebApp)和這些 WebApp 可以使用的服務模塊(插件)的生態系統(建模為 OSGI 包)。 我很難理解如何使用 Apache Felix 和 Jetty 來構建這些元素。 我理解它的方式我有三種可能的方法,但我不知道每種方法的含義。

  1. 創建一個 felix 容器來啟動插件,並帶來最終啟動 WebApps 的碼頭。

  2. 創建一個帶有嵌入式 felix 的 jetty 服務器來提供插件,並使用 Jetty 的部署器來管理 WebApps。

  3. 使用比 OSGI 更簡單的框架創建一個 jetty 服務器來管理插件,並使用 Jetty 的部署器來管理 WebApps。

選項 1 似乎是一個非常正交的解決方案,一切都是 osgi 模塊(假設戰爭是一個模塊),管理整個事情只是創建 felix 基礎設施並啟動所有內容的問題。 從我早期的測試來看,在開發中管理所有這些 osgi 模塊並不是一件容易或快速的任務(但很可能我做錯了什么)。

選項 2 似乎可以工作(這是我設法從兩者中走得更遠的那個)並且更容易管理我的頭腦,因為 OSGI 僅限於管理插件基礎設施而不是應用程序或服務器。

選項 3 我什至還沒有開始探索。

我期待有幾個獨立的應用程序(WebApps)和許多插件(OSGI 模塊),我想聽聽您關於每個選項在可維護性和易於開發方面的優缺點。

這里的問題之一是 1 和 2 都是 osgi 框架的有效用例。

我建議詳細查看JBoss Fuse ,因為這是選項 1 的非常成熟的實現(忽略基於容器的 openshift 內容並專注於本地版本)。 它的基本原理是:

  • 單個 JVM 托管基於 Apache Felix 的 OSGI 容器。 (It's really Apache Camel , repackaged from Apache Servicemix , which uses Apache Karaf , which can either use felix or the Eclipse OSGi framework. Turtles all the way down).
  • 應用程序被打包為可以包含 servlet 引擎的 osgi 包。
  • 然后,servlet 引擎也可以利用 osgi 來運行插件/框架系統。

您可能不會對啟動和運行這些東西所需的大量紙牌工具,然后對其進行維護感到驚訝。 您不會受到類路徑依賴沖突的影響,但代價是創建和部署包的工具鏈極其復雜。 這也使得單元和組件測試非常困難。 其中一些只是由於保險絲的復雜程度,但試圖將不必要的復雜性與必要的復雜性分開是一個難題。

Fuse 上的 hello world,您正在挖掘平台的每個部分並真正了解正在發生的事情,可能需要一周時間。

撇開保險絲不談,選項 1 或 2 都有很多問題

  • 您仍然受到 JVM 及其線程的限制。 您需要注意確保一切協同工作,因為單個包或插件很容易愉快地消耗整個 CPU 並阻止其他應用程序工作。
  • 插件有一個需要管理的生命周期——啟動、停止、加載、重新加載、卸載。 有許多管理問題會立即出現 - 你如何強制停止插件? 什么時候放棄並重新啟動 JVM?
  • 誰在編寫插件,它們在哪里托管或構建,您如何信任它們等等。

OSGi 是非常成功的客戶端,但恕我直言,沒有太多真正知名的服務器端 OSGi 實現的原因是因為它真的很難管理大量線程和不可預測的請求流,而且人們只是沒有得到他們想要的結果 - 運行代碼來自不同配置的不同來源,由用戶決定 - 從使其工作的痛苦中。

那么有沒有其他成熟的插件框架能夠以簡單可靠的方式解決這些問題呢? 不是我知道的,在 github 和谷歌上有很多。 但他們最終總是在想出一種可靠的方式來管理插件並使它們與在 JVM 中運行的其他東西很好玩的同一塊石頭上失敗。

我更願意通過他們自己的 docker 容器保持獨立應用程序的獨立性,然后如果你真的需要能夠在運行時加載插件,可以看看 felix。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM