《程序員必讀之軟件架構(gòu)》- C4模型

日常軟件開發(fā)中,總是能看到一些詮釋項目軟件結(jié)構(gòu)的圖表。

圖表主要的主要作用是幫助項目上的人員能夠理解正在構(gòu)建的軟件架構(gòu),建立一個共同的愿景云矫。當(dāng)我們開發(fā)一個新功能時,能夠參考已經(jīng)建立起來的架構(gòu)汗菜,以后的開發(fā)過程中向原有的架構(gòu)靠攏让禀。圖表的存在也可以讓新人快速理解項目架構(gòu),也能夠幫助向非開發(fā)人員解釋項目架構(gòu)陨界。

但是常常在圖表中會有一些不容易理解的點巡揍,例如不同的顏色,不同的線條菌瘪,不同的線框腮敌,分別代表了什么意思。

所以用圖表來可視化軟件俏扩,需要注意下面這些:

  • 清晰明確的表示圖表中每一種顏色代表的意思糜工。

  • 清晰明確的表示不同的圖表元素的意義,例如不同形狀的元素动猬、虛線啤斗、實線、各種線框等等赁咙。

  • 清晰明確的表示圖表元素之間的關(guān)系钮莲,不要遺漏了。

  • 不要使用模糊或太過抽象的術(shù)語彼水。

  • 不要遺漏了技術(shù)選擇崔拥。

  • 層次不要太混亂。

  • 不要包含太多的細(xì)節(jié)凤覆。

  • 不要遺漏了語境或邏輯起點链瓦。

為了清晰明了的表達(dá)圖表的含義,給圖表添加一個簡單的圖例(解釋顏色編碼盯桦、線條樣式慈俯、形狀等)是很有用的辦法,圖例的主要意義就是讓團(tuán)隊保持一致的標(biāo)記拥峦,避免歧義贴膘。

簡單模型 - 適用于面向?qū)ο笳Z言編程的軟件系統(tǒng)

image.png

面向?qū)ο笳Z言編程的軟件系統(tǒng)一般由多個容器構(gòu)成,一個容器又由多個組件構(gòu)成略号,一個組件由一個或多個類實現(xiàn)刑峡。

對于類/組件/容器/系統(tǒng)的解釋:

  • 類:在面向?qū)ο笙到y(tǒng)中洋闽,類是軟件系統(tǒng)中的最小單元。
  • 組件:組件是由至少一個類組成的邏輯群組突梦。
  • 容器:容器指的是能夠在它內(nèi)部執(zhí)行組件或者駐留數(shù)據(jù)的東西诫舅,一般容器都是可執(zhí)行文件,容器和容器之間的通信需要遠(yuǎn)程接口宫患,例如SOAP網(wǎng)絡(luò)服務(wù)刊懈、RESTful接口等等。
  • 系統(tǒng):系統(tǒng)是能夠提供價值的最高抽象層次娃闲。

通過一個簡單模型來了解系統(tǒng)以后俏讹,要如何在項目中更加精確的表示整個架構(gòu),就可以采用C4模型畜吊。

C4模型

C4 分別是上下文(Context)泽疆、容器(Container)、組件(Component)和代碼(Code)層次的圖表玲献,可以用這些圖表來描述不同級別的軟件架構(gòu)殉疼,每種圖表都有著不同的受眾。這個就有點像世界地圖捌年、國家地圖瓢娜、省地圖、市區(qū)街道地圖礼预,逐層遞進(jìn)眠砾,展示里面的內(nèi)容,而每種地圖的關(guān)注點也不同托酸。

語境圖/上下文 (Context)

語境圖(有些參考文章里面翻譯的是上下文)褒颈,它展示的是系統(tǒng)大局景觀的廣角視圖,主要包括關(guān)鍵的系統(tǒng)依賴和參與者励堡,關(guān)注的重點是人和系統(tǒng)谷丸。

在畫語境圖時,要明確的標(biāo)出:

  • 我們構(gòu)建的軟件系統(tǒng)是什么应结?
  • 誰用這個系統(tǒng)刨疼?
  • 如何融入已有的IT環(huán)境?

例子:
銀行的個人客戶使用互聯(lián)網(wǎng)銀行系統(tǒng)查看有關(guān)銀行賬戶的信息并進(jìn)行支付鹅龄】剑互聯(lián)網(wǎng)銀行系統(tǒng)使用銀行現(xiàn)有的大型機銀行系統(tǒng)來執(zhí)行此操作,并使用銀行現(xiàn)有的電子郵件系統(tǒng)向客戶發(fā)送電子郵件扮休。
圖中的顏色表示哪些軟件系統(tǒng)已經(jīng)存在(灰色)以及待構(gòu)建的系統(tǒng)(藍(lán)色)迎卤。【此例子來源于網(wǎng)絡(luò)

image.png

容器圖(Container)

首先明確容器的概念肛炮,容器指的是組成軟件系統(tǒng)的邏輯上的可執(zhí)行文件或者過程止吐。容器之間的通信一般是進(jìn)程間的通信。

所以畫一個容器的時候要包含:

  • 名稱:容器的邏輯名稱(如“面向互聯(lián)網(wǎng)的Web服務(wù)器”侨糟、“數(shù)據(jù)庫”等)碍扔。
  • 技術(shù):容器的技術(shù)選擇(如ApacheTomcat7等)。
  • 職責(zé):容器職責(zé)的高層次聲明或清單秕重。

之后就是畫各個容器之間的通信:

  • 容器之間交互的目的(如“讀/寫數(shù)據(jù)”不同、“發(fā)送報告“等);
  • 容器之間的通信方法(如Web服務(wù)溶耘、REST二拐、Java遠(yuǎn)程方法調(diào)用、Java消息服務(wù))凳兵;
  • 容器之間的通信方式(如同步百新、異步、批量等)庐扫;
  • 容器之間的協(xié)議和端口號(如HTTP饭望、HTTPS、SOAP/HTTP形庭、SMTP铅辞、FTP等)。

例子:
互聯(lián)網(wǎng)銀行系統(tǒng)(虛線框)由五個容器組成:服務(wù)器端 Web 應(yīng)用程序萨醒、客戶端單頁面應(yīng)用程序斟珊、移動應(yīng)用程序、服務(wù)器端 API 應(yīng)用程序和數(shù)據(jù)庫富纸。
Web 應(yīng)用程序是一個 Java/Spring MVC Web 應(yīng)用程序囤踩,它僅提供靜態(tài)內(nèi)容(HTML、CSS 和 JavaScript)晓褪,包括組成單頁應(yīng)用程序的內(nèi)容高职。
單頁面應(yīng)用程序是一個運行在客戶網(wǎng)絡(luò)瀏覽器中的 Angular 應(yīng)用程序,提供所有的網(wǎng)上銀行功能辞州。
或者怔锌,客戶可以使用跨平臺 Xamarin 移動應(yīng)用程序訪問互聯(lián)網(wǎng)銀行的部分功能。單頁應(yīng)用程序和移動應(yīng)用程序都調(diào)用 JSON/HTTPS API变过,這是由服務(wù)器端運行的另一個 Java/Spring MVC 應(yīng)用程序提供的埃元。
API 應(yīng)用程序從數(shù)據(jù)庫中獲取用戶信息(關(guān)系數(shù)據(jù)庫模式)。API 應(yīng)用程序還使用專有的 XML/HTTPS 接口與現(xiàn)有的大型機銀行系統(tǒng)進(jìn)行通信媚狰,以獲取有關(guān)銀行賬戶或交易的信息岛杀。如果需要向客戶發(fā)送電子郵件,API 應(yīng)用程序還會調(diào)用現(xiàn)有的電子郵件系統(tǒng)崭孤±噜停【此例子來源于網(wǎng)絡(luò)

image.png

通過上面這個容器圖可以讓人了解高層次的技術(shù)選擇糊肠,了解不同容器之間的交互,展示了之前的語境圖和之后的組件圖的連接遗锣,對軟件開發(fā)者和支持/運營人員很有用货裹。

組件圖(Component)

組件圖就是將單個容器放大,它可以讓你清晰的看到容器的關(guān)鍵邏輯組件精偿、組件之間的層級關(guān)系和依賴弧圆。
所以組件圖要標(biāo)明:

  • 名稱:組件的名稱
  • 技術(shù):對組件的技術(shù)選擇
  • 職責(zé):對組件職責(zé)的高層次的聲明

例子:
下面是一個虛擬的網(wǎng)上銀行系統(tǒng)的組件圖示例,顯示了 API 應(yīng)用程序中的一些組件(而不是全部)笔咽。兩個 Spring MVC REST 控制器為 JSON/HTTPS API 提供訪問點搔预,每個控制器隨后使用其他組件訪問數(shù)據(jù)庫和大型機銀行系統(tǒng)中的數(shù)據(jù)∫蹲椋【此例子來源于網(wǎng)絡(luò)

image.png

類圖/代碼(Code)

類圖是一個可選的細(xì)節(jié)層次拯田。如果想解釋某個組件被怎樣實現(xiàn),可以畫少量高層次UML類的圖甩十。一般是出于軟件的復(fù)雜性勿锅,團(tuán)隊的規(guī)模和經(jīng)驗的考慮才畫這個圖。

總結(jié)

C4模型是比較容易理解枣氧、也比較容易使用的工具溢十,可以通過C4模型來整理我們的架構(gòu),不論是一開始就設(shè)計的架構(gòu)达吞,還是回顧性總結(jié)的架構(gòu)张弛,都很適用。然后在畫圖過程中酪劫,一定要注意圖表表達(dá)的含義沒有歧義吞鸭,達(dá)到團(tuán)隊內(nèi)部的一致性非常重要。

閱讀書籍:
[英]Simon Brown. 程序員必讀之軟件架構(gòu) (圖靈程序設(shè)計叢書) .
例子參考 用于軟件架構(gòu)的 C4 模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末覆糟,一起剝皮案震驚了整個濱河市刻剥,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌滩字,老刑警劉巖造虏,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異麦箍,居然都是意外死亡漓藕,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門挟裂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來享钞,“玉大人,你說我怎么就攤上這事诀蓉±跏” “怎么了暑脆?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長狐肢。 經(jīng)常有香客問我添吗,道長,這世上最難降的妖魔是什么处坪? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮架专,結(jié)果婚禮上同窘,老公的妹妹穿的比我還像新娘。我一直安慰自己部脚,他們只是感情好想邦,可當(dāng)我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著委刘,像睡著了一般丧没。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上锡移,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天呕童,我揣著相機與錄音,去河邊找鬼淆珊。 笑死夺饲,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的施符。 我是一名探鬼主播往声,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳吝!你這毒婦竟也來了浩销?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤听哭,失蹤者是張志新(化名)和其女友劉穎慢洋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體陆盘,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡且警,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礁遣。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斑芜。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖祟霍,靈堂內(nèi)的尸體忽然破棺而出杏头,到底是詐尸還是另有隱情盈包,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布醇王,位于F島的核電站呢燥,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏寓娩。R本人自食惡果不足惜叛氨,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望棘伴。 院中可真熱鬧寞埠,春花似錦、人聲如沸焊夸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽阱穗。三九已至饭冬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間揪阶,已是汗流浹背昌抠。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲁僚,地道東北人扰魂。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像蕴茴,于是被迫代替她去往敵國和親劝评。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容