OSGI模組化的真相

banq發表於2009-09-17
OSGI帶來了模組化的討論,原來我們認為架構是基於元件的架構,Modularity & Architecture(模組化和架構)一文談論了基於模組化的架構,這不僅讓我個人有些疑惑,元件不等於模組化?元件和模組化
是什麼關係?是劃分標準不一樣還是粒度不一樣。

文中首先談論了眾多的架構定義:
1.軟體系統組織重要的結構元素
2.是一些元件和元件之間的關係
3.TOGAF定義:構件級別指導實施的計劃,代表元件的結構
4.是一種體系結構中關鍵的設計決策,能夠減輕以後因為變化帶來的成本。

架構的目標是減少因為變化擴充帶來的成本,實現這一目標是透過提高靈活性,同時馴服複雜性達到的。

物件導向設計中的開閉原則:禁止修改,鼓勵擴充繼承。我們可以透過不斷的繼承和抽象,但是帶來的問題是複雜性,不斷增多的之類和父子家族?如何組織管理他們?

文章提出一個系統是由模組和連線體joints組成的,連線體就是跨越模組之間的設計。變化被隔離封裝在一個模組中,這樣變化帶來的影響就變得很小。也就是說,不要讓變化跨越模組。雖然很難做到,但是這應該是架構設計的目標。

基於元件化的SOA好像是另外一種思路,將一定功能封裝在元件中,元件以服務形式向外提供介面,透過對不同服務的多樣化呼叫流程組合實現不同的業務。這也是一種開閉原則。

直覺告訴我:這兩種開閉原則好像正好相反,一個是在模組中封裝變化,讓變化不要跨越模組;一個是在元件中封裝不變性,透過跨越元件的不同呼叫應付變化。

我們可以從OSGI具體模組化實現來看,也驗證了這樣設計思路,在META-INF/MANIFEST.MF中需要指定當前包的依賴包,試想想:如果依賴包關係經常變化,那不是要經常更改META-INF/MANIFEST.MF,有幾百個,不是改得頭暈眼花,形成閉環依賴?頭大啊。

所以,使用OSGI前提就是:依賴關係不經常變,變化的是bundle中的類,可以在執行時,動態插拔一個物件。

進一步設想:我們使用IOC/DI就是為解決類的依賴關係變化帶來的麻煩,由IOC框架幫助我們自動解決依賴,而OSGI和IOC這種解決類依賴目的的模式正好相反哦。

看來:模組化的OSGI從另外一個架構思路為我們解決問題提供可選方案。當初OSGI誕生於微系統,因為微系統因為資源有限,不可能有太多元件或類,所以,包之間的依賴關係不復雜,可以看成是不變的,而將在微系統中執行的內容元件看成是變化的。

結論:OSGI模組化最大的特點是其開閉原則的獨特性,OSGI優勢不是在動態插拔,XML/類動態載入/AOP都可以在執行時動態插拔,我想後者是很多吹捧OSGi優點的一個誤區。

OSGI這種獨特的模組化設計思路為我們架構設計提供了一條新的選擇。

參考:

The Two Faces of Modularity & OSGi

[該貼被banq於2009-09-17 17:31修改過]

[該貼被banq於2009-09-17 17:32修改過]

相關文章