標籤:

複雜軟體系統的簡化方式

隨著業務發展,軟體規模越來越大,各種各樣的需求層出不窮,新業務的開發和老業務的維護會變得越來越艱難。成熟的軟體系統總是趨向於增加複雜度,就像是熵只增不減一樣,這是一個不可逆的過程。

正如《人月神話》中所說,軟體的擴展並非相同元素的重複添加,而且這些元素之間的交互又以非線性的方式持續增長。通常情況下,單純增加人力投入並不能取得同等的線性效果,複雜業務的開發面臨很多挑戰。

分散式和微服務是軟體系統解耦的常用方案。通過一定程度的拆分,達到各個部分之間進行介面調用,只關注介面定義,不再關心介面的具體實現,進而實現軟體系統多個部分之間的解耦。

解耦之後,不同部分由不同的團隊維護,實現代碼上的隔離,降低複雜度。同時,基於介面定義的調用,還能顯著提高軟體的復用度,把不同業務方的多種需求實現統一。目前已經有非常成熟的分散式方案 HSF、dubbo、spring cloud 和微服務方案 REST 被廣泛應用。

在分散式的基礎上,進一步抽象可以在軟體架構上進行分層來降低複雜度。以淘寶的一個系統為例,如下圖所示,總體上可以分為業務系統、核心業務服務、基礎業務服務、持久層四個層次,在每個層次中又有多個子系統。

每個層次的子系統都可以被上一層的多個子系統復用,通過 hsf 提供服務有效地屏蔽了本層次的業務實現,並且,通過天梭、鷹眼、紅警等監控工具可以有效地追蹤一個請求在多個子系統之間的傳遞。

業務分層帶來的是軟體複雜度的極大降低,使得整個架構易於理解,每個部門和團隊都可以集中精力在自己負責的層次和子系統上,形成工業流水線的工程效果。

具體到一個子系統的實現上,需要進一步進行模塊劃分。劃分模塊的基本原則是高內聚低耦合。劃分模塊形成黑盒效果,能夠有效降低複雜度,提高開發效率。

模塊化的經典案例是 spring 的架構設計。在 spring 中 Core 提供了最基本的 IOC 服務和各種工具類,Context 提供了上下文服務,AOP 模塊專註於面向切面編程的實現,Web、Web MVC 專註於 Web 應用的開發。各個模塊各司其職互不干擾,模塊內部聚焦於模塊功能的實現,模塊間存在調用關係但並不關心具體實現。

在軟體的設計中,需要把盡量多的配置內容剝離出來,形成配置文件。代碼本身只實現業務的流程,關注業務的邏輯。而配置文件中的各種配置,用於控制業務的流動。在開發中,既要充分利用 spring 等開源框架的配置文件,也要考慮軟體自身業務形成配置文件,提高代碼的復用度和靈活性。

在阿里,為了便於配置文件的管理,已經形成了專門管理配置的 diamond 服務。diamond 提供配置的持久化,客戶端通過訂閱配置來獲取配置內容,能夠在運行時感知 diamond 配置變化實現更新。有了 diamond 管理配置,程序員可以專註於業務邏輯的梳理和實現,開發出通用性更好的程序代碼。

每周 3 篇學習筆記或技術總結,面向有一定基礎的 Java 程序員,內容涉及 Java 進階、虛擬機、MySQL、NoSQL、分散式計算、開源框架等多個領域。關注作者或微信公眾號 後端開發那點事兒 第一時間獲取最新內容。

推薦閱讀:

Specification的寫法問題
淺談高內聚低耦合
PCIE匯流排的地址問題
守弱的內涵和外延

TAG:軟體架構 |