2010-10-21 39 views
2

嗨 我想設計和開發客戶端只使用 GWT大的企業應用程序開發模塊化的企業應用程序。 我想把這個企業應用程序分解成幾部分,我把它們的每個 稱爲一個模塊(或者包或者portlet或者其他)。 這些模塊可能彼此有關係,並可能會調用其他模塊(客戶端和服務器端)中存在的一些服務 。如何使用GWT只是

的問題是,這些模塊必須設計開發編譯獨立部署動態和它們將被放置並顯示 一起在一個上下文中,客戶端和上模塊之間的依賴 應該是可管理的(在客戶端和服務器端)。

我該怎麼辦?我可以用什麼樣的技術來構建這樣的企業應用程序?

當您開發的應用程序沒有被分爲幾部分時(在我提到的方式中),您可以在構建項目後輕鬆部署應用程序,但是當您在應用程序中更改一個窗體時,必須構建整個再次申請,並部署整個應用程序。

在這個應用程序,我不能停止服務器重新部署應用程序,我想改變和部署應用程序的那部分是需要被沒有改變整個應用程序!

當然,我已經搜索了我可以解決我的問題的方式! 我發現我可以在服務器端使用OSGI,因爲它在軟件構建級別提供模塊化功能,並幫助我管理模塊的生命週期以及您知道的許多其他好處! 我發現我可以在客戶端使用小工具。

您認爲如何?他們是不錯的選擇?

如果他們是不錯的選擇,我該如何開始?我知道我們有不同類型的OSGi實現,比如Apache Felix,Eclipse Equinox和Knopflerfish。哪一個適合這種選擇?

GWT和OSGi如何集成?他們如何與對方互動?

回答

2

我在兩年前就做了這樣的工作:OSGi和GWT沒有停工部署項目模塊。

判決:除非你確實需要,否則不要這樣做。

總之,OSGi是一個野獸和改造一個現有的應用程序,因爲它遠不是微不足道的。您不再製作.war文件(現在是.ear),不能使用之前使用過的標準JAR和Maven存儲庫。現在一切都需要成爲一個捆綁包。麻煩的是,很多東西(GWT,Spring,大量的庫)都不是捆綁的!而且您需要在企業軟件包信息庫中找到它們,或者更有趣的是,開始重新綁定第三方來源。更好的是,告訴其他開發者重寫所有使用他們最喜歡的lib的東西,因爲捆綁它會太複雜。

GWT部分沒有采取那麼多的工作。在gwt-servlet中處理模塊的上下文的方式必須進行修改,以便每個模塊都可以在服務器上找到它的上下文。我們還必須爲大多數GWT服務提供一種方法來在加載和發現服務上註冊/取消註冊,以便他們知道還有誰在那裏。

現在其他痛:項目爆炸

假設您有20個模塊需要獨立部署。那麼,首先他們可能會比你想要的更加耦合,所以最好花幾個星期把它們分解成獨立的Maven項目,並將通用部分推送到lib項目。但是現在,你需要大量的依賴來跟蹤。當有人調整你的lib項目時,你需要升級每個項目還是隻有7個?在經典的停止世界部署,你只有一個版本的所有代碼。現在,您需要決定是否忘記密碼錶單升級,還需要您升級索引頁面模塊。你將有大量的版本號來彌補和跟蹤。在我們的例子中,我們很快有55個Maven項目一直在我們的CI服務器中建立。這意味着一些檢查可能會觸發55個版本。伊克。

最後,JSON接口

我們使用了GWT RPC。它很神奇。編寫一個接口,一切正常。它也被串行化並且通過電線壓縮。真棒。但是,序列化策略依賴於在每個模塊編譯時構建的對象和字符串查找表。所以,項目A不能RPC來投影B. Boo。我們之所以選擇使用JSON是因爲優雅的降級,當對象上出現新的無法識別的屬性時,這並非失敗。這意味着您將再次需要一種方法將所有後端服務調用保持在他們期望並可以處理的JSON版本中一致。事先更好地模擬實時升級。

所以,最後的話:可能,但爲什麼? 您是否真的需要OSGi熱部署模塊,因爲您正在運行1000%正常運行時間的關鍵業務應用程序?或者你的老闆/架構師拒絕接受99.999%是否足夠好?您可能不需要正常運行時間,並且可以通過一個良好的代理實現接近100%的正常運行時間,以讓您將實例導入/導出平衡器池。另外,不要忘記,即使您可以實時升級您的項目,我也希望您有辦法在不丟失單個事務的情況下即時升級數據庫。

4

不幸的是,你想要做的並不完全可能與GWT。

OSGi是一個Java模塊化溶液,或者更準確的JVM。 GWT客戶端應用程序不在JVM上運行,它在JavaScript環境中的瀏覽器上運行。因此,OSGi不能用於創建運行時組裝的模塊化GWT應用程序。

GWT應用程序可以在源代碼級是模塊化的,但模塊必須在構建時組裝到應用程序中。由此產生的運行時間是單片的。

但是,使用OSGi來託管GWT servlet是完全可能的,您可以在服務器端使用OSGi運行時模塊化的全部功能。

作爲一種選擇,你可能想看看Vaadin。這是一個使用GWT提供小部件的Web框架,但應用程序的邏輯在服務器上運行。因此,它通過OSGi軟件包支持完整的運行時模塊化。但是,這種方法的代價是:您的Web應用程序非常瑣碎,瀏覽器和服務器之間的通信量要比GWT或傳統Web應用程序多得多。這種方法可能不會擴展到大量的用戶。

至於是否使用Equinox,Felix或Knopflerfish ......它並不重要。堅持規範,您可以輕鬆地在不同的實現之間切換。

+0

感謝您的回覆。 – Heidarzadeh 2010-10-23 12:04:26

+0

我知道OSGi只適用於服務器端! 我認爲我的大問題將在客戶端,有一個像客戶端的小工具容器容器將對我來說很難。 現在這個應用程序的所有部分都捆綁在一起,特別是在客戶端,我無法打開這條領帶!分別編譯和部署這個應用程序的不同部分! – Heidarzadeh 2010-10-23 12:13:17

1

我認爲你正在爲自己設置更多令人頭疼的事情,而不是值得。
我會去部署整個事情在流行。如果不是,你最終會得到不匹配的應用程序片斷,而這些應用程序片段彼此不同步。 GWT有客戶端和服務器組件,需要一起部署。如果您的宕機時間爲零,那麼您可能已經實現了負載平衡。
我會使用負載均衡軟件來部署新版本的應用程序。關閉一側(通過將所有通信轉移到另一側)部署到它,做一個快速的煙霧測試,將所有的交通切換到新的一側,並重復舊的一面。

+0

感謝您的回覆。 我認爲負載平衡有它自己的擔憂,我可能有其他問題。 以這種方式編譯時間又耗費時間,我必須再次構建整個應用程序。 有很多客戶,我必須複製所有這些客戶的整個應用程序,我會有帶寬問題。 當我編譯這個項目時,它大概是400MB,對於一個小問題,我必須複製整個文件! – Heidarzadeh 2010-10-26 10:40:15

+0

當然,我可以避免重新複製我在服務器端使用過的第三方庫,但這又耗費時間。請記住,這是一個有很多客戶的大型企業應用程序! 但是,如果我找到一種方法來編譯和部署我的應用程序,部分。我的意思是分別爲每個模塊,這將是一個很好的解決方案! – Heidarzadeh 2010-10-26 10:40:53

+0

您可以隨時分離出您的靜態內容並將其放在自己的Web服務器上。這對加載時間有幫助。 – 2010-10-26 10:42:18