2010-03-14 55 views
2

我們當前的應用程序運行在單個JVM中。允許模塊化開發,同時仍在同一個JVM中運行?

我們現在將應用程序拆分爲單獨的邏輯服務,其中每個服務都在其自己的JVM中運行。

正在進行拆分以允許在不影響整個系統的情況下修改和部署單個服務。這減少了對整個系統的QA需求 - 只需要QA與正在改變的服務的交互。

對於服務間通信,我們使用REST,MQ系統總線和數據庫視圖的組合。

我不喜歡這個:

  • REST意味着我們必須從XML元帥數據/
  • DB意見夫婦的系統連接在一起,其違背了獨立服務的整個概念
  • MQ /系統總線增加了複雜性
  • 服務之間不可避免地存在一些代碼重複
  • 您已經設置了n個JBoss服務器配置,我們必須執行n個部署,n numb呃建立腳本等等等

有沒有更好的方式來構建一個內部應用程序以允許模塊化開發和部署,同時允許應用程序在單個JVM中運行(並實現相關優勢)?

回答

3

我有點困惑,你真的在​​這裏問什麼。如果將應用程序分爲跨網絡運行的不同服務,則數據編組必須發生在某處。

話雖如此,你有沒有調查過OSGi?您可以將不同的bundles(基本上是帶有定義接口的額外元數據的jar文件)部署到同一個OSGi服務器中,並且服務器將透明地促進這些bundle之間的通信,因爲所有內容都在相同的JVM中運行 - 即您調用不同的捆綁包就像你通常那樣。

OSGi服務器將允許在運行時卸載和升級軟件包,並且應用程序應該正常運行(如果以降級方式),只要OSGi bundle lifecycle狀態得到遵守。

+0

感謝您的回覆。服務器如何「促進軟件包之間的通信」? – 2010-03-14 21:00:41

+0

我已在編輯的回覆中對此進行了擴展。您只需調用所需的方法即可。 – 2010-03-14 21:02:22

+0

我得到的是怎樣才能不把應用程序分開?爲了讓它運行在同一個JVM中,但它的設計使您可以單獨部署應用程序的單獨「模塊」。通過這樣做,您可以確信應用程序中唯一發生變化的部分是「模塊A」,您只需「模塊A」和其他應用程序之間的通信即可進行QA。而且這也會降低更改進入另一個模塊的風險,並且當您要部署的所有內容都是「模塊A」時會導致一些問題。 – 2010-03-14 21:04:30

0

聽起來您的團隊有一個手動QA流程,真正的問題是自動執行迴歸測試,以便您可以快速且有信心地部署新版本。將代碼分解爲單獨的服務器是解決方法。

如果您願意重新啓動服務器,那麼一種方法可能是將代碼編譯爲單獨的jar文件,然後通過放入新jar並重新啓動來部署模塊。這在很大程度上是構建代碼庫的一個問題,以便不良依賴不會蔓延,並且通過不改變的接口來創建jar之間的調用。 (或者,也可以使用抽象類,以便您可以添加一個默認實現的新方法。)您的構建系統可以通過確保單獨部署的模塊只能依賴於通用接口並且其他任何情況都是編譯錯誤來提供幫助。但是請注意,當你在沒有編譯的jar包中交換時,你的編譯器不會幫助你檢測到不兼容的情況,所以我不確定這是否真的避免了一個好的QA過程。

如果要在不重新啓動JVM的情況下部署新代碼,那麼OSGI是實現該目標的標準方法。 (但是我對此知之甚少)

相關問題