用於軟件架構的C4模型

關鍵要點

  • 由於向敏捷轉型,軟件架構圖的使用規模已經大幅縮減。即使有在使用軟件架構圖,它們往往也混淆不清。
  • C4模型由一系列分層的軟件架構圖組成,這些架構圖用於描述上下文、容器、組件和代碼。C4圖的層次結構提供了不同的抽象級別,每種抽象級別都與不同的受衆有關。
  • 爲了避免出現含糊不清的情況,可以在圖中包含足夠數量的文本和關鍵的圖例。

軟件架構圖是一種非常好的表達方式,可以用它們來表達你將如何構建一個軟件系統(預先設計)或者現有的軟件系統是如何工作的(回顧文檔、知識分享和學習)。

然而,你所看到的大多數軟件架構圖很可能只是由混亂的框和線組成。敏捷軟件開發宣言的一個副作用就是讓很多團隊停止或縮減了他們的圖表和文檔工作,包括使用UML。

現在,這些團隊傾向於依靠他們在白板上繪製的臨時圖表,或者使用通用的圖表工具(如微軟的Visio)。Ionut Balosin在去年寫了一篇叫作“軟件架構圖的藝術”的文章,他在文章中描述了一些常見問題,這些問題與不可理解的符號和不明確的語義有關。



含糊不清的軟件架構圖容易導致誤解,這可能會拖慢一個優秀團隊的前進步伐。在我們的行業中,我們真的應該努力創建出更好的軟件架構圖。多年來,我自己參與軟件開發,並與世界各地的團隊合作,基於這些經驗,我建立了一個稱之爲“C4模型”的東西。C4代表上下文(Context)、容器(Container)、組件(Component)代碼(Code)——一系列分層的圖表,可以用這些圖表來描述不同縮放級別的軟件架構,每種圖表都適用於不同的受衆。可以將其視爲代碼的谷歌地圖。



要爲你的代碼創建地圖,首先需要一組通用的抽象來創建一種無處不在的語言,用來描述軟件系統的靜態結構。C4模型使用容器(應用程序、數據存儲、微服務等)、組件代碼來描述一個軟件系統的靜態結構。它還考慮到使用軟件系統的人。



第1層:系統上下文

第1層是系統上下文圖,它顯示了你正在構建的軟件系統,以及系統與用戶及其他軟件系統之間的關係。以下是一個系統上下文圖的示例,描述了一個互聯網銀行系統的系統上下文:



銀行的個人客戶使用互聯網銀行系統查看有關銀行賬戶的信息並進行支付。互聯網銀行系統使用銀行現有的大型機銀行系統來執行此操作,並使用銀行現有的電子郵件系統向客戶發送電子郵件。圖中的顏色表示哪些軟件系統已經存在(灰色)以及待構建的系統(藍色)。

第2層:容器

第2層是一個容器圖,將軟件系統放大,顯示組成該軟件系統的容器(應用程序、數據存儲、微服務等)。技術決策也是該圖的關鍵部分。以下是互聯網銀行系統的容器圖示例。它顯示了互聯網銀行系統(虛線框)由五個容器組成:服務器端Web應用程序、客戶端單頁面應用程序、移動應用程序、服務器端API應用程序和數據庫。



Web應用程序是一個Java/Spring MVC Web應用程序,它僅提供靜態內容(HTML、CSS和JavaScript),包括組成單頁應用程序的內容。單頁面應用程序是一個運行在客戶網絡瀏覽器中的Angular應用程序,提供所有的網上銀行功能。或者,客戶可以使用跨平臺Xamarin移動應用程序訪問互聯網銀行的部分功能。單頁應用程序和移動應用程序都調用JSON/HTTPS API,這是由服務器端運行的另一個Java/Spring MVC應用程序提供的。API應用程序從數據庫中獲取用戶信息(關係數據庫模式)。API應用程序還使用專有的XML/HTTPS接口與現有的大型機銀行系統進行通信,以獲取有關銀行賬戶或交易的信息。如果需要向客戶發送電子郵件,API應用程序還會調用現有的電子郵件系統。

第3層:組件

第3層是組件圖,將單個容器放大,以顯示其中的組件。這些組件映射到代碼庫中的真實抽象(例如一組代碼)。下面是一個虛擬的網上銀行系統的組件圖示例,顯示了API應用程序中的一些組件(而不是全部)。



兩個Spring MVC REST控制器爲JSON/HTTPS API提供訪問點,每個控制器隨後使用其他組件訪問數據庫和大型機銀行系統中的數據。

第4層:代碼

最後,如果你確實想要,或者說有這個必要,可以放大個別組件,以顯示該組件的實現方式。以下是一個虛擬的網上銀行系統的UML類圖示例(部分),顯示了組成MainframeBankingSystemFacade組件的代碼元素(接口和類)。



它表明該組件由很多類組成,實現細節直接反映了代碼。我並不建議創建在這種詳細程度的圖表,有時候你可以直接從大多數IDE中獲取它們。

符號

C4模型沒有預定義任何特定的符號,你在這些示例圖中看到的是一個個簡單的符號,適用於白板、紙張、便籤、索引卡片和各種圖表工具。你也可以使用UML作爲符號,並適當使用包、組件和原型。無論你使用哪種符號,我都會建議讓每個元素都包含名稱、元素類型(即“人”、“軟件系統”,“容器”或“組件”)、技術選型(如果有的話),以及一些描述性文字。在圖表中包含如此多的文本可能看起來很不尋常,但這些附加文本有助於消除軟件架構圖中通常會出現的不明確的表示。

即使符號對你來說是顯而易見的,仍然要確保爲這些符號提供圖例。圖例中應該包括顏色、形狀、首字母縮略詞、線條樣式、邊框、尺寸等。理想情況下,符號應該在每個細節層次上保持一致。下面是前面顯示的容器圖的圖例。



最後,不要忘記了標題,它應該出現在每個圖表上,以明確地描述每個圖表的類型和範圍(例如,“網上銀行系統的系統上下文圖表”)。

更多信息

C4模型是一種在不同抽象層次上交流軟件架構的簡單方法,可以向不同的受衆講述不同的故事。這也是向軟件開發團隊介紹(通常是重新引入)嚴謹和輕量級建模的一種方式。有關C4模型的更多信息,以及補充圖(運行時和部署)的示例、符號清單、常見問題解答、會議講座視頻和工具選項,請參閱c4model.com

關於作者

Simon Brown 是一位專門從事軟件架構的獨立顧問,也是“Software Architecture for Developers”(面向開發人員的軟件架構、技術領導力和敏捷性平衡的指南)的作者。他還是C4軟件架構模型的創建者,這是一種創建代碼映射的簡單方法。Simon在國際軟件開發會議上經常發表演講,並在世界各地旅行,以幫助組織可視化和記錄他們的軟件架構。

查看英文原文The C4 Model for Software Architecture

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章