作者 | 崔皓
審校 | 孫淑娟
做過軟件架構設計的同學都清楚,軟件架構要解決的核心問題就是對不同的軟件應用使用重復的軟件架構模式,說白了就是達到架構級別的重用。也就是說,在不同的軟件系統中,使用不同類型的軟件架構,將軟件架構的使用進行抽象,再對其分類,用這些歷經時間打磨的軟件架構套用不同的應用場景,也就是架構師常說的架構套路。這個套路就是今天我們要說的軟件架構風格。
一、軟件架構風格
軟件架構風格是描述某一特定應用領域中系統組織方式的慣用模式( idiomatic paradigm)。
架構風格包括四個要素:
- 一個詞匯表。其中包含構件和連接件類型。
- 一套配置規則。描述了如何將構件和連接件進行組合。
- 一套語義解釋原則。用來解釋系統中的構件和連接關系。
- 定義對基于風格的系統的分析。針對不同類型軟件系統,如何進行分析。
二、最終目的:軟件架構的復用
對軟件架構風格的研究和實踐促進了對設計的重用,一些經過實踐證實的解決方案也可以可靠地用于解決新的問題。架構風格不變的部分使不同的系統可以共享同一個實現代碼。
軟件架構風格的分類
說完了軟件架構風格的定義,接下來看看它的分類。由于軟件的應用場景眾多,對其軟件架構的抽象也不在少數。我們需要對軟件架構進行分類,甚至在分類的基礎上建立子類。
如下是對軟件架構風格的基本分類:
- 數據流風格:它是對數據流進行處理的軟件架構風格,分為批處理序列和管道-過濾器兩類,前者側重大批量的數據處理,后者更關注數據處理過程。
- 返回調用風格:應用程序會調用對應的模塊并且返回需要的值。它包括主程序/子程序風格、面向對象風格和層次結構風格。
- 獨立構件風格:假設系統中的模塊或者服務都是獨立存在,通過事件和通信完成相互調用。包括進程通信和事件驅動兩種風格。
- 虛擬機風格:包括解釋器風格和基于規則的系統風格。前者在虛擬機中應用廣泛,后者會在人工智能領域出現。
- 倉庫風格:包括數據庫架構、黑板系統和超文本系統三種風格。
- 控制環路風格:讓組建之間形成反饋循環,通過接受一定的輸入,確定一系列的輸出,最終使環境達到一個新的狀態。
雖然架構風格多種多樣,在不同的應用場景我們會選擇不同的架構風格與之對應,接下來我們會舉一個實際的例子,通過對例子的分析引出架構風格的應用。
三、軟件架構風格應用舉例
前面描述了軟件架構風格的分類,多是定義略顯枯燥,這里會應用一個車輛定速巡航的例子看看如何應用軟件架構的風格。
如下圖所示,如果要開發一套定速巡航系統,從而確保車輛能夠隨時調整其行進的速度。
如上圖所示,巡航控制系統有多個輸入和一個輸出,系統想要達到的目的就是通過這些輸入參數去調整油門這個輸出參數,也就是控制油門,最終達到保持車速的目的。說白了,就是不過輸入參數如何改變,車輛都保持一定的速度,因此油門就要隨之調整。
一起來看看這些輸入/輸出要素的定義:
- 系統開關:開啟/關閉巡航控制系統
- 引擎開關:開啟/關閉汽車引擎(引擎開啟時,巡航控制系統處于就緒狀態)
- 車輪脈沖:車輪每轉一次,相應地發出一次脈沖
- 剎車:當剎車被踩下時,定速巡航控制系統會臨時恢復到人工控制
- 增/減速:增加或減慢當前車速(僅在定速巡航控制系統處于開啟的狀態下可用)
- 恢復速度:恢復原來保持的車速(僅在定速巡航控制系統處于開啟的狀態下可用)
- 時鐘:每毫秒定時脈沖
1.架構風格場景分析
既然有了具體的案例,就需要通過具體的使用場景來分析使用哪種架構風格?
適合面向對象架構風格的應用場景:
- 首先需要設置一個汽車行駛的預期速度,然后保持這個速度行駛。司機需要調整計速器來達到預期的速度,此時會觸發事件把增加或者減少速度的消息發送給計速器。計速器也會將車子的速度消息傳送給油門,告訴車子加速還是減速。
- 同時遇到障礙物需要剎車,也會發送消息給剎車系統,并退出巡航控制系統。
上面描述的正是一個典型的事件驅動場景,適合于面向對象風格。面向對象架構風格的特征是將數據標識和基本操作封裝在對象中。這種模式的構件是對象,對象維護自身表示的完整性,對象之間通過消息機制進行通信,對象交互時需要知道彼此的標識,通過對象之間的協作完成計算過程。
再換一個角度,適合面向控制環路架構風格的應用場景:
司機通過調整計速器達到了預期速度之后,系統維持恒定速度行駛,但是在行駛過程中會遇到路面顛簸、拐彎等情況,車輛速度不可能一直保持恒定,在上述情況下車輛速度會降低。降低的車速實際是整個系統的輸出,這個輸出會作為輸入再次返回到系統中,系統會將這個速度與預期的速度進行比較,如果低于預期的速度,會進行加速的操作。同理,如果超過了預期的速度就會執行減速的操作。
這是一個典型的閉環控制的情景,系統需要在外界情況不斷發生變化的情況下進行調整,使得系統狀態盡可能接近期望狀態。
過程控制環路(閉環):是將過程輸出的指定屬性維護在一個特定的參考值(設定值),將事務處理看成輸入、加工、輸出、反饋、再輸入的一個持續的過程模型。
這里的輸入就是車輛的當前速度,加工就是求得預期速度與當前速度的差,反饋就是進行增速還是減速,再將得到數據給到輸入,不斷循環。
有了對應用場景的分析之后,再從面向對象和控制環路兩種風格如何,看如何設計架構。
2.面向對象架構風格分析
對于系統的增減速功能,采用面向對象風格的巡航控制系統首先會定義司機、油門、時鐘、速度計和車輪等構件。
整個計算的主要過程如上圖所示:
- 司機進行增/減速操作設置期望速度,該期望速度以消息的形式傳遞給速度計;
- 速度計通過向車輪和時鐘發送消息獲取車輪轉速和時鐘值,得到當前速度;
- 速度計計算當前速度和期望速度的速度差值;
- 該差值以消息的形式發送給油門,油門通過速度差值調節自身狀態。
整個過程在時鐘的控制下定期向速度計發送消息,重復執行2~4。
3.控制環路架構風格分析
控制環路的架構風格以控制器為核心,期望速度、車輪脈沖、時鐘和油門等作為構件。
具體的計算過程如上圖所示:
- 司機進行增/減速操作設置期望速度值
- 將設定值置為期望速度值,并將其交給比較器
- 比較器會采集車輪脈沖和時鐘值,計算出當前速度,連同預期速度都交給控制器;
- 控制器比較期望速度和當前速度,計算速度差值,控制油門,執行加速或者不加速的動作,并將速度這個被控對象反饋給比較器。
反復執行3和4形成速度的反饋閉環。
四、總結
所謂架構風格就是經過時間考驗的架構分析的套路,針對不同的應用場景可以利用不同的架構風格,說到底就是對軟件架構的復用,讓前人設計的架構能夠被反復使用。架構風格分為:數據流、返回調用、獨立構件、虛擬機、倉庫、控制環路等多種。
文中我們通過汽車定速巡航的例子,引出了面向對象和控制環路的兩種架構風格,告訴大家如何從應用場景的定義選擇適合的架構風格。并且,針對兩種不同的架構風格,給出了架構分析的具體方法。
作者介紹
崔皓,51CTO社區編輯,資深架構師,擁有18年的軟件開發和架構經驗,10年分布式架構經驗。曾任惠普技術專家。樂于分享,撰寫了很多熱門技術文章,閱讀量超過60萬?!斗植际郊軜嬙砼c實踐》作者。