OSGI模組化的真相
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這種獨特的模組化設計思路為我們架構設計提供了一條新的選擇。
參考:
是什麼關係?是劃分標準不一樣還是粒度不一樣。
文中首先談論了眾多的架構定義:
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修改過]
相關文章
- 模組化與微服務比較 MircoService VS OSGI微服務
- 序列化模組,隨機數模組,os模組,sys模組,hashlib模組隨機
- 前端模組化的前世前端
- JavaScript 中的模組化JavaScript
- AppDelegate的模組化+瘦身APP
- iOS的元件化(模組化)之路iOS元件化
- Android模組化改造以及模組化通訊框架Android框架
- 序列化模組,subprocess模組,re模組,常用正則
- 前端模組化前端
- JS模組化JS
- JavaScript模組化JavaScript
- ES6 模組化與 CommonJS 模組化區別JS
- 關於模組化、元件化的理解元件化
- 純原生元件化-模組化的探索元件化
- Node.js 的 模組化Node.js
- 最全的前端模組化方案前端
- JavaScript模組化的演變JavaScript
- 前端模組化的前世今生前端
- 探索 JS 中的模組化JS
- 淺析前端的模組化前端
- Swift 專案的模組化Swift
- 模組化與MVC的VCMVC
- Python常用模組(random隨機模組&json序列化模組)Pythonrandom隨機JSON
- osgi.net框架框架
- Android模組化與元件化–多模組區分編譯Android元件化編譯
- 淺談模組化
- 分而治之-前端模組化前端
- Javascript 模組化指北JavaScript
- css模組化方案CSS
- Webpack之模組化優化Web優化
- Js模組化開發的理解JS
- Nodejs教程10:Nodejs的模組化NodeJS
- 模組化的一些小研究
- 模組化實現的好處
- 極簡實用的Asp.NetCore模組化框架新增CMS模組ASP.NETNetCore框架
- Java模組化的國際化實現- GunnarJava
- CSS 如何模組化,工程化CSS
- JS模組化系統JS
- 深聊Nodejs模組化NodeJS