軟體體系結構:二維分層、模組化和開放平臺

weixin_34279184發表於2011-05-22

先引出幾個問題。首先,對於分層,如何來分層?僅僅縱向分層是否夠用了?什麼是“二維分層”呢?一提到模組化,很多人會說“我們的系統就是基於模組化來構建”,稍微一多問,要麼和分層差不多,要麼就說我們是基於一個又一個的dll檔案來實現模組化的,那應該怎樣才算模組化呢?“開放平臺”怎麼回事?

關於“二維分層”軟體體系結構的提法比較少見。不過,對於分層軟體體系結構,估計是個傻子都知道。“模組化”也是傻子都知道的一個詞,軟體工程最經典之一的詞莫過於“高內聚、低耦合”。

在我個人看來,軟體體系結構不是套路,而是根據實際應用系統的需求來確認的,甚至有時候需要根據實際情況來組合使用經典的“三層”、“管道”等軟體體系結構風格。但不管怎樣,從最最抽象的角度來看待一個軟體系統時,軟體系統就可以抽象成如下的結構,即應用系統總是由一個又一個功能構成的,而每一個功能總是由一段又一段的程式碼來構成的。

image

在這裡每一個功能的程式碼段並不完全一致,當我們應用傳統的分層軟體體系結構來設計應用系統時,我們總是需要預想整個應用系統大致的程式碼,然後為大致的程式碼做一個歸類,從而制定每一個層次大致的功能及其規範,每一層次一般也就包含了相應功能的程式碼段,理想狀態下,這樣的體系結構可能如下。

image

聰明的你肯定看出來,為了使用統一的分層架構來設計所有功能,那麼在一個層次都必須包含了不同模組相似邏輯程式碼,那就有可能出現一種情況,就是一個層次在不同模組的編碼實現複雜度也不一定相同,比如在上圖的層N設計中,功能2的程式碼段N要比其它兩個模組的程式碼段簡單的多得多,如果這種異常情況在一個應用系統出現多次的話(特別是在大規模應用系統,這將是很常見的事情,就像原來我在Sybase工作時,資料管理、資料監控、資料複製等功能的複雜度都不一樣),為應用系統統一設計的分層在異常情況下就顯得特別的彆扭。因此,我覺得在這種情況下,僅關注程式碼縱向行為而設計的分層軟體體系結構是不夠的。除了考慮縱向程式碼行為,我們還需要關注軟體系統的整體功能。從“二維”的角度分解軟體,“二維”的核心就是:從橫向維度考慮軟體系統的功能組成,從縱向維度來考慮每一個功能的程式碼行為,將若干個功能組合在一起作為縱向分層的單元,即“將若干功能橫向切割成不同的模組,對每一個模組進行統一的分層架構”。

image

關注“二維”的分層軟體體系結構會使架構的設計更加適合實際應用系統,不過,需要注意的是,橫向維度關注的是應用系統的功能,因此,橫向切割必須以功能為單元來組織,這也就意味著,模組是由若干個功能構成的。這樣,構建的模組間的依賴也比較小。這話的意思,就是要強調,模組不是以縱向層次來劃分的,因為縱向層次具有很強的程式碼依賴關係,一般而言,上層是完全依賴於下層的。

關於分層的話題,本文就描述到這裡,歡迎大家能圍繞這個問題繼續展開。接下來,我們再來談一下模組化。

在我給客戶推薦OSGi模組化的優點時,很多客戶會說“我們的應用系統就是基於模組化來構建的”,好,那我們來交流一下模組化。一旦深入討論之後,就會發現不少客戶的模組化就是所謂的分層,或者所謂的程式集就是模組化。而一旦再深入討論模組的可複用性、隔離性、可維護性和隔離性時,客戶會簡單的說,我們拷貝程式碼或者拷貝dll過來就複用了。如果再深入問下去的話,會發現並不僅僅拷貝就解決了複用的問題,在拷貝的同時需要大量的修改。呵呵,這非常的有意思,:)。關於模組化,我非常推薦OSGi規範(我們也實現了OSGi.NET規範)提倡的模組化。在這裡的模組,是一個完全物理隔離,可以動態部署、動態更新、動態解除安裝、動態啟動與停止,所有的模組都可以躺在模組倉庫中,以備我們真正使用“搭積木”的方式構建系統。從OSGi的角度來看,我們可以為應用系統設計一個大致通用的企業級總體架構,如下所示。這個架構實際上,還可以設計的更加開放一些,可以適合於傳統軟體和目前流行的雲端計算軟體以及開放平臺軟體的構建。

image

在這個系統架構圖中,一個應用系統由客戶端、服務端、模組倉庫三部分構成。客戶端和服務端基於模組化構建,相應的模組稱為功能模組和服務模組,這裡面的模組均從模組化倉庫獲取,可以實現自動更新、遠端動態管理與部署、模組多版本並存。每一個功能模組按照要實現的功能複雜度進行個性化的模組體系結構設計。這是一種理想化的狀態,正如《未來10年:OSGi、Spring DM》作者羅時飛描述的OSGi提倡理念一樣。事實上,我的老僱主Sybase也是基於這樣的思路來構建Sybase Central和Sybase Control Centre產品的。

目前我團隊也在致力於在.NET平臺上實現這麼一個理想化的模組化平臺,並基於這個模組化平臺實現一個“大和”的統一開放平臺,目前已經取得了不錯的進展,該平臺的體系結構如下所示。

image

我們希望通過這個平臺來集中廣泛的開發者們的聰明才智,構建一個龐大的外掛倉庫,讓不同的開發者、不同的最終軟體客戶都可以從這個統一開放平臺受益。這樣構建的軟體系統才是我心目中最理想的真正的“模組化”!

當然,很多事情都是說起來容易,做起來困難,不過,這並不代表不可能,至少我們已經通過一點一滴實踐了這樣的模式。文中的描述也可能瘋狂或者有偏差,歡迎任何指正。

相關文章