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