1. 程式人生 > >WildFly評估之WildFly的模組化系統

WildFly評估之WildFly的模組化系統

Wildfly_logo

感謝朋友【吳傑】投遞本文。

WildFly,前身是JBoss AS,從V8開始為區別於JBoss EAP,更名為WildFly。Wildfly 8主要具備如下特性:

  • Java EE7的參考實現(2013年7月止尚未得到Java EE7相容認證)
  • 啟動速度更快,佔用記憶體更少
  • 模組化(JSR294)設計
  • 統一配置管理
  • 分散式domain管理

本文主要討論一下WildFly 8的模組化系統。

WildFly之所以啟動很快,模組化元件jboss-modules功不可沒。作為OSGi和Jigsaw(JSR 294 http://jcp.org/en/jsr/detail?id=294)“夾擊”之下的衍生物,與jboss-msc成為WildFly的全新核心。

jboss-modules解決什麼問題

JBoss Modules就是解決傳統的層級機制的ClassLoader所帶來的Jar Hell問題:

(1)     JAR被載入後不使用導致資源浪費。

(2)     同名JAR包的不同版本混在導致依賴衝突。

JBoss Modules使所有的jar都打包成為模組,一個jar再也不會看到依賴中有版本衝突的類,或者載入到一個不需要載入的資源。同時,按需載入模組可以明顯地提高大型應用的啟動時間。

圖 1 傳統的ClassLoading vs. jboss-modules的ClassLoading

傳統的ClassLoading vs. jboss-modules的ClassLoading

與Jigsaw(JSR 294)的關係

Jigsaw已經被延遲到Java SE 9。JBoss Modules會與JSR294相容,如果Jigsaw專案能夠穩定,並且成為OpenJDK的一部分,JBoss承諾將維護JBoss Modules的相容性。

與OSGi的關係

個人認為是互補的關係,通過Jboss-modules進行模組化的應用伺服器,使得OSGi的Bundle形式不再成為模組化的唯一方式,更加靈活。另外它更為小巧,沒有OSGi的Sevice層,或者其他OSGI提供的更高層次的功能,它只做一件事情,就是模組化。

圖 2 WildFly Architecture

WildFly Architecture

注:上圖中的Subsystems沒有列全,full-ha Profile的子系統如下圖:

圖 3 full-ha的子系統一覽

full-ha的子系統一覽

接下來簡單與Oracle的Java EE 7的RI,GlassFish V4.0做一個簡單的架構對比

圖 4 GlassFish V4.0與WildFly 8的系統棧圖

GlassFish V4.0與WildFly 8的系統棧圖

筆者觀點】GlassFish與WildFly在架構實現上最大區別在於模組系統的構成。

GlassFish的做法

採用OSGi的模組化作為GlassFish的模組化系統/基盤;用HK2替代了OSGi的服務層。

WildFly的做法

鑑於Jigsaw的難產,JBoss推出自己的模組化實現並作為WildFly的模組化系統/基盤;將JBoss MSC(Module Service Container)作為其服務容器。預設情況下將OSGi排除在WildFly系統棧之外(從8.0.0.Alpha3開始OSGi子系統已經從WildFly移除,今後將提供以add-on的形式與Wildfly整合。https://issues.jboss.org/browse/WFLY-1638),該點與GlassFish不同(GlassFish與OSGi執行時是緊耦合的)。

排除廠商利益因素,筆者更喜歡JBoss的設計,原因以下:

(1)     通過JBoss Modules將WildFly與OSGi解耦,並且相容Jigsaw。設計上更為優雅,且更具遠見。

(2)     OSGi在Java EE開發領域並沒有被廣泛接受(如下圖,來自於zeroturnaround),離真正落地尚需時日。JBoss的設計理念更貼近開發人員。

圖 5 2012年度Java標準的被接受度一覽

2012年度Java標準的被接受度一覽