用于軟件架構(gòu)的 C4 模型
軟件架構(gòu)圖可能是一個(gè)非常有用的溝通工具,但很多團(tuán)隊(duì)減少了圖表的創(chuàng)建,即使有創(chuàng)建圖表,也往往模糊不清。本文作者依據(jù)自己多年的軟件開(kāi)發(fā)和與團(tuán)隊(duì)合作的經(jīng)驗(yàn),提出了 C4 模型。C4 模型是由一系列分層的軟件架構(gòu)圖組成,這些架構(gòu)圖用于描述上下文、容器、組件和代碼。C4 模型的層次結(jié)構(gòu)提供了不同的抽象級(jí)別,每種抽象級(jí)別都與不同的受眾有關(guān)。同時(shí),C4 模型也是向軟件開(kāi)發(fā)團(tuán)隊(duì)介紹輕量級(jí)建模的一種方式。
軟件架構(gòu)圖是一種非常好的表達(dá)方式,可以用它們來(lái)表達(dá)你將如何構(gòu)建一個(gè)軟件系統(tǒng)(預(yù)先設(shè)計(jì))或者現(xiàn)有的軟件系統(tǒng)是如何工作的(回顧文檔、知識(shí)分享和學(xué)習(xí))。
然而,你所看到的大多數(shù)軟件架構(gòu)圖很可能只是由混亂的框和線(xiàn)組成。敏捷軟件開(kāi)發(fā)宣言 的一個(gè)副作用就是讓很多團(tuán)隊(duì)停止或縮減了他們的圖表和文檔工作,包括使用 UML。
現(xiàn)在,這些團(tuán)隊(duì)傾向于依靠他們?cè)诎装迳侠L制的臨時(shí)圖表,或者使用通用的圖表工具(如微軟的 Visio)。Ionut Balosin 在去年寫(xiě)了一篇叫作“軟件架構(gòu)圖的藝術(shù)”的文章,他在文章中描述了一些常見(jiàn)問(wèn)題,這些問(wèn)題與不可理解的符號(hào)和不明確的語(yǔ)義有關(guān)。
含糊不清的軟件架構(gòu)圖容易導(dǎo)致誤解,這可能會(huì)拖慢一個(gè)優(yōu)秀團(tuán)隊(duì)的前進(jìn)步伐。在我們的行業(yè)中,我們真的應(yīng)該努力創(chuàng)建出更好的軟件架構(gòu)圖。多年來(lái),我自己參與軟件開(kāi)發(fā),并與世界各地的團(tuán)隊(duì)合作,基于這些經(jīng)驗(yàn),我建立了一個(gè)稱(chēng)之為“C4 模型”的東西。C4 代表 上下文(Context)、容器(Container)、組件(Component) 和 代碼(Code)——一系列分層的圖表,可以用這些圖表來(lái)描述不同縮放級(jí)別的軟件架構(gòu),每種圖表都適用于不同的受眾。可以將其視為代碼的谷歌地圖。
要為你的代碼創(chuàng)建地圖,首先需要一組通用的抽象來(lái)創(chuàng)建一種無(wú)處不在的語(yǔ)言,用來(lái)描述軟件系統(tǒng)的靜態(tài)結(jié)構(gòu)。C4 模型使用 容器(應(yīng)用程序、數(shù)據(jù)存儲(chǔ)、微服務(wù)等)、組件 和 代碼 來(lái)描述一個(gè)軟件系統(tǒng)的靜態(tài)結(jié)構(gòu)。它還考慮到使用軟件系統(tǒng)的人。
一、第 1 層:系統(tǒng)上下文
第 1 層是系統(tǒng)上下文圖,它顯示了你正在構(gòu)建的軟件系統(tǒng),以及系統(tǒng)與用戶(hù)及其他軟件系統(tǒng)之間的關(guān)系。以下是一個(gè)系統(tǒng)上下文圖的示例,描述了一個(gè)互聯(lián)網(wǎng)銀行系統(tǒng)的系統(tǒng)上下文:
銀行的個(gè)人客戶(hù)使用互聯(lián)網(wǎng)銀行系統(tǒng)查看有關(guān)銀行賬戶(hù)的信息并進(jìn)行支付。互聯(lián)網(wǎng)銀行系統(tǒng)使用銀行現(xiàn)有的大型機(jī)銀行系統(tǒng)來(lái)執(zhí)行此操作,并使用銀行現(xiàn)有的電子郵件系統(tǒng)向客戶(hù)發(fā)送電子郵件。圖中的顏色表示哪些軟件系統(tǒng)已經(jīng)存在(灰色)以及待構(gòu)建的系統(tǒng)(藍(lán)色)。
二、第 2 層:容器
第 2 層是一個(gè)容器圖,將軟件系統(tǒng)放大,顯示組成該軟件系統(tǒng)的容器(應(yīng)用程序、數(shù)據(jù)存儲(chǔ)、微服務(wù)等)。技術(shù)決策也是該圖的關(guān)鍵部分。以下是互聯(lián)網(wǎng)銀行系統(tǒng)的容器圖示例。它顯示了互聯(lián)網(wǎng)銀行系統(tǒng)(虛線(xiàn)框)由五個(gè)容器組成:服務(wù)器端 Web 應(yīng)用程序、客戶(hù)端單頁(yè)面應(yīng)用程序、移動(dòng)應(yīng)用程序、服務(wù)器端 API 應(yīng)用程序和數(shù)據(jù)庫(kù)。
Web 應(yīng)用程序是一個(gè) Java/Spring MVC Web 應(yīng)用程序,它僅提供靜態(tài)內(nèi)容(HTML、CSS 和 JavaScript),包括組成單頁(yè)應(yīng)用程序的內(nèi)容。單頁(yè)面應(yīng)用程序是一個(gè)運(yùn)行在客戶(hù)網(wǎng)絡(luò)瀏覽器中的 Angular 應(yīng)用程序,提供所有的網(wǎng)上銀行功能。或者,客戶(hù)可以使用跨平臺(tái) Xamarin 移動(dòng)應(yīng)用程序訪問(wèn)互聯(lián)網(wǎng)銀行的部分功能。單頁(yè)應(yīng)用程序和移動(dòng)應(yīng)用程序都調(diào)用 JSON/HTTPS API,這是由服務(wù)器端運(yùn)行的另一個(gè) Java/Spring MVC 應(yīng)用程序提供的。API 應(yīng)用程序從數(shù)據(jù)庫(kù)中獲取用戶(hù)信息(關(guān)系數(shù)據(jù)庫(kù)模式)。API 應(yīng)用程序還使用專(zhuān)有的 XML/HTTPS 接口與現(xiàn)有的大型機(jī)銀行系統(tǒng)進(jìn)行通信,以獲取有關(guān)銀行賬戶(hù)或交易的信息。如果需要向客戶(hù)發(fā)送電子郵件,API 應(yīng)用程序還會(huì)調(diào)用現(xiàn)有的電子郵件系統(tǒng)。
三、第 3 層:組件
第 3 層是組件圖,將單個(gè)容器放大,以顯示其中的組件。這些組件映射到代碼庫(kù)中的真實(shí)抽象(例如一組代碼)。下面是一個(gè)虛擬的網(wǎng)上銀行系統(tǒng)的組件圖示例,顯示了 API 應(yīng)用程序中的一些組件(而不是全部)。
兩個(gè) Spring MVC REST 控制器為 JSON/HTTPS API 提供訪問(wèn)點(diǎn),每個(gè)控制器隨后使用其他組件訪問(wèn)數(shù)據(jù)庫(kù)和大型機(jī)銀行系統(tǒng)中的數(shù)據(jù)。
四、第 4 層:代碼
最后,如果你確實(shí)想要,或者說(shuō)有這個(gè)必要,可以放大個(gè)別組件,以顯示該組件的實(shí)現(xiàn)方式。以下是一個(gè)虛擬的網(wǎng)上銀行系統(tǒng)的 UML 類(lèi)圖示例(部分),顯示了組成 MainframeBankingSystemFacade 組件的代碼元素(接口和類(lèi))。
它表明該組件由很多類(lèi)組成,實(shí)現(xiàn)細(xì)節(jié)直接反映了代碼。我并不建議創(chuàng)建在這種詳細(xì)程度的圖表,有時(shí)候你可以直接從大多數(shù) IDE 中獲取它們。
五、符號(hào)
C4 模型沒(méi)有預(yù)定義任何特定的符號(hào),你在這些示例圖中看到的是一個(gè)個(gè)簡(jiǎn)單的符號(hào),適用于白板、紙張、便簽、索引卡片和各種圖表工具。你也可以使用 UML 作為符號(hào),并適當(dāng)使用包、組件和原型。無(wú)論你使用哪種符號(hào),我都會(huì)建議讓每個(gè)元素都包含名稱(chēng)、元素類(lèi)型(即“人”、“軟件系統(tǒng)”,“容器”或“組件”)、技術(shù)選型(如果有的話(huà)),以及一些描述性文字。在圖表中包含如此多的文本可能看起來(lái)很不尋常,但這些附加文本有助于消除軟件架構(gòu)圖中通常會(huì)出現(xiàn)的不明確的表示。
即使符號(hào)對(duì)你來(lái)說(shuō)是顯而易見(jiàn)的,仍然要確保為這些符號(hào)提供圖例。圖例中應(yīng)該包括顏色、形狀、首字母縮略詞、線(xiàn)條樣式、邊框、尺寸等。理想情況下,符號(hào)應(yīng)該在每個(gè)細(xì)節(jié)層次上保持一致。下面是前面顯示的容器圖的圖例。
最后,不要忘記了標(biāo)題,它應(yīng)該出現(xiàn)在每個(gè)圖表上,以明確地描述每個(gè)圖表的類(lèi)型和范圍(例如,“網(wǎng)上銀行系統(tǒng)的系統(tǒng)上下文圖表”)。
六、更多信息
C4 模型是一種在不同抽象層次上交流軟件架構(gòu)的簡(jiǎn)單方法,可以向不同的受眾講述不同的故事。這也是向軟件開(kāi)發(fā)團(tuán)隊(duì)介紹(通常是重新引入)嚴(yán)謹(jǐn)和輕量級(jí)建模的一種方式。有關(guān) C4 模型的更多信息,以及補(bǔ)充圖(運(yùn)行時(shí)和部署)的示例、符號(hào)清單、常見(jiàn)問(wèn)題解答、會(huì)議講座視頻和工具選項(xiàng),請(qǐng)參閱 http://c4model.com/。
七、關(guān)于作者
Simon Brown 是一位專(zhuān)門(mén)從事軟件架構(gòu)的獨(dú)立顧問(wèn),也是“Software Architecture for Developers”(面向開(kāi)發(fā)人員的軟件架構(gòu)、技術(shù)領(lǐng)導(dǎo)力和敏捷性平衡的指南)的作者。他還是 C4 軟件架構(gòu)模型的創(chuàng)建者,這是一種創(chuàng)建代碼映射的簡(jiǎn)單方法。Simon 在國(guó)際軟件開(kāi)發(fā)會(huì)議上經(jīng)常發(fā)表演講,并在世界各地旅行,以幫助組織可視化和記錄他們的軟件架構(gòu)。