泰國(guó)男女做那個(gè)視頻網(wǎng)站百度鏈接提交入口
本文是《從零開始學(xué)架構(gòu)》的第一篇學(xué)習(xí)筆記,主要理解架構(gòu)的設(shè)計(jì)的本質(zhì)定義、歷史背景以及目的。
架構(gòu)設(shè)計(jì)的本質(zhì)
分別從三組概念的區(qū)別來(lái)理解架構(gòu)設(shè)計(jì)。
系統(tǒng)與子系統(tǒng)
什么是系統(tǒng),系統(tǒng)泛指由一群有關(guān)聯(lián)的個(gè)體組成,根據(jù)某種規(guī)則運(yùn)作,能完成個(gè)別元件不能單獨(dú)完成的工作的群體。它的意思是“總體”“整體”或“聯(lián)盟”
- 關(guān)聯(lián):系統(tǒng)是由一群有關(guān)聯(lián)的個(gè)體組成的,沒(méi)有關(guān)聯(lián)的個(gè)體堆在一起不能成為一個(gè)系統(tǒng)。例如,把一個(gè)發(fā)動(dòng)機(jī)和一臺(tái) PC 放在一起不能稱之為一個(gè)系統(tǒng),把發(fā)動(dòng)機(jī)、底盤、輪胎、車架組合起來(lái)才能成為一臺(tái)汽車。
- 規(guī)則:系統(tǒng)內(nèi)的個(gè)體需要按照指定的規(guī)則運(yùn)作,而不是單個(gè)個(gè)體各自為政。規(guī)則規(guī)定了系統(tǒng)內(nèi)個(gè)體分工和協(xié)作的方式。例如,汽車發(fā)動(dòng)機(jī)負(fù)責(zé)產(chǎn)生動(dòng)力,然后通過(guò)變速器和傳動(dòng)軸,將動(dòng)力輸出到車輪上,從而驅(qū)動(dòng)汽車前進(jìn)。
- 能力:系統(tǒng)能力與個(gè)體能力有本質(zhì)的差別,系統(tǒng)能力不是個(gè)體能力之和,而是產(chǎn)生了新的能力。例如,汽車能夠載重前進(jìn),而發(fā)動(dòng)機(jī)、變速器、傳動(dòng)軸、車輪本身都不具備這樣的能力
子系統(tǒng)也是由一群有關(guān)聯(lián)的個(gè)體所組成的系統(tǒng),多半會(huì)是更大系統(tǒng)中的一部分
例如微信本身是一個(gè)系統(tǒng),包含聊天、登錄、支付、朋友圈等子系統(tǒng)。朋友圈這個(gè)系統(tǒng)又包括動(dòng)態(tài)、評(píng)論、點(diǎn)贊等子系統(tǒng)。評(píng)論這個(gè)系統(tǒng)可能又包括防刷子系統(tǒng)、審核子系統(tǒng)、發(fā)布子系統(tǒng)、存儲(chǔ)子系統(tǒng)。評(píng)論審核子系統(tǒng)不再包含業(yè)務(wù)意義上的子系統(tǒng),而是包括各個(gè)模塊或者組件,這些模塊或者組件本身也是另外一個(gè)維度上的系統(tǒng)。例如,MySQL、Redis 等是存儲(chǔ)系統(tǒng),但不是業(yè)務(wù)子系統(tǒng)。
模塊與組件
模塊和組件都是系統(tǒng)的組成部分,只是從不同的角度拆分系統(tǒng)而已。 劃分模塊的主要目的是職責(zé)分離;劃分組件的主要目的是單元復(fù)用
- 從業(yè)務(wù)邏輯的角度來(lái)拆分系統(tǒng)后,得到的單元就是模塊;
- 從物理部署的角度來(lái)拆分系統(tǒng)后,得到的單元就是組件。
以學(xué)生管理系統(tǒng)為例,從業(yè)務(wù)邏輯的角度分解,有如下模塊
從物理部署的角度分解,有如下組件:
子系統(tǒng)是獨(dú)立運(yùn)行的,模塊是子系統(tǒng)的邏輯組成部分,如果學(xué)生管理系統(tǒng)規(guī)模很大(例如在線學(xué)校),需要支撐每秒上萬(wàn)的登錄請(qǐng)求,那么學(xué)生管理的登錄模塊可以升級(jí)為子系統(tǒng)。
框架與架構(gòu)
軟件框架(Software framework)通常指的是為了實(shí)現(xiàn)某個(gè)業(yè)界標(biāo)準(zhǔn)或完成特定基本任務(wù)的軟件組件規(guī)范,也指為了實(shí)現(xiàn)某個(gè)軟件組件規(guī)范時(shí),提供規(guī)范所要求之基礎(chǔ)功能的軟件產(chǎn)品
- 框架是組件規(guī)范,例如,MVC 就是一種最常見(jiàn)的開發(fā)規(guī)范
- 框架提供基礎(chǔ)功能的產(chǎn)品,例如,Spring MVC 是 MVC 的開發(fā)框架,除了滿足 MVC 的規(guī)范,Spring 提供了很多基礎(chǔ)功能來(lái)幫助我們實(shí)現(xiàn)功能,包括注解(@Controller 等)、Spring Security、Spring JPA 等很多基礎(chǔ)功能
軟件架構(gòu)指軟件系統(tǒng)的“基礎(chǔ)結(jié)構(gòu)”,創(chuàng)造這些基礎(chǔ)結(jié)構(gòu)的準(zhǔn)則,以及對(duì)這些結(jié)構(gòu)的描述。
框架關(guān)注的是“規(guī)范”,架構(gòu)關(guān)注的是“結(jié)構(gòu)”。
4R架構(gòu)方法
軟件架構(gòu)指軟件系統(tǒng)的頂層(Rank)結(jié)構(gòu),它定義了系統(tǒng)由哪些角色(Role)組成,角色之間的關(guān)系(Relation)和運(yùn)作規(guī)則(Rule)
4R 是指 4 個(gè)關(guān)鍵詞:Rank,Role,Relation 和 Rule。既然可以通過(guò) 4R 來(lái)定義軟件系統(tǒng)的架構(gòu),那么按照 4R 架構(gòu)定義的思路來(lái)畫架構(gòu)圖也是很合情合理的,具體步驟如下
- 第一步,明確 Rank:它是指軟件架構(gòu)是分層的,對(duì)應(yīng)“系統(tǒng)”和“子系統(tǒng)”的分層關(guān)系。不要事無(wú)巨細(xì)地把一個(gè)大系統(tǒng)的方方面面都在一張架構(gòu)圖中展現(xiàn)出來(lái),而應(yīng)該明確你要闡述的系統(tǒng)所屬的級(jí)別(L0~L4),然后只描述這個(gè)級(jí)別的架構(gòu)信息。
- 第二步,畫出 Role:指軟件系統(tǒng)包含哪些角色,每個(gè)角色都會(huì)負(fù)責(zé)系統(tǒng)的一部分功能。架構(gòu)設(shè)計(jì)最重要的工作之一就是將系統(tǒng)拆分為多個(gè)角色,角色對(duì)應(yīng)架構(gòu)圖中的區(qū)塊、圖標(biāo)和節(jié)點(diǎn)等。
- 第三步,畫出 Relation:有了角色后,畫出角色之間的關(guān)系,對(duì)應(yīng)架構(gòu)圖中角色之間的連接線,不同的連接線可以代表不同的關(guān)系。
- 第四步,最后畫出 Rule:挑選核心場(chǎng)景,畫出系統(tǒng)角色之間如何協(xié)作來(lái)完成某項(xiàng)具體的業(yè)務(wù)功能,對(duì)應(yīng)系統(tǒng)序列圖。
為了方便理解,Rank、Role 和 Relation 是通過(guò)系統(tǒng)架構(gòu)圖來(lái)展示的,而 Rule 是通過(guò)系統(tǒng)序列圖(System Sequence Diagram)來(lái)展示的,以支付系統(tǒng)為例,頂層為支付系統(tǒng),描述其子系統(tǒng)角色及角色之間的關(guān)系
“掃碼支付”這個(gè)核心場(chǎng)景的系統(tǒng)序列圖如下所示:
軟件架構(gòu)的歷史背景
機(jī)器語(yǔ)言(太難寫、太難讀、太難改)-》匯編語(yǔ)言(仍然面向機(jī)器)-》高級(jí)語(yǔ)言(不再面向機(jī)器)-》結(jié)構(gòu)化程序設(shè)計(jì)【模塊】-》面向?qū)ο蟪绦蛟O(shè)計(jì)【對(duì)象】-》軟件架構(gòu)【組件】
軟件設(shè)計(jì)過(guò)程中,模塊、對(duì)象、組件本質(zhì)上是對(duì)一定規(guī)模軟件在不同粒度和層次上的“拆分”方法論(隨著軟件的復(fù)雜度不斷增加,拆分的粒度越來(lái)越粗,拆分的層次越來(lái)越高),軟件架構(gòu)是一種對(duì)軟件的“組織”方法論。一分一合,其目的是為了軟件研發(fā)過(guò)程中的成本、進(jìn)度、質(zhì)量得到有效控制。一個(gè)成功的軟件設(shè)計(jì)是要適應(yīng)并滿足業(yè)務(wù)需求,同時(shí)不斷“演化”。設(shè)計(jì)需要根據(jù)業(yè)務(wù)的變化、技術(shù)的發(fā)展不斷進(jìn)行“演進(jìn)”,這就決定了這是一個(gè)動(dòng)態(tài)活動(dòng),出現(xiàn)新問(wèn)題,解決新問(wèn)題,沒(méi)有所謂的“一招鮮”。
軟件架構(gòu)的目的
不是所有系統(tǒng)都需要架構(gòu)設(shè)計(jì),也不需要每個(gè)架構(gòu)都具備高性能、高可用、高擴(kuò)展等特點(diǎn),架構(gòu)設(shè)計(jì)的主要目的是為了解決軟件系統(tǒng)復(fù)雜度帶來(lái)的問(wèn)題
總結(jié)一下
Rank分層區(qū)分系統(tǒng)與子系統(tǒng)暫時(shí)隔離關(guān)注面,在一個(gè)系統(tǒng)層面上,其子系統(tǒng)就是角色Role,子系統(tǒng)之間的關(guān)系就是Relation,一個(gè)核心的業(yè)務(wù)流程Rule可能涉及多個(gè)子系統(tǒng)的交互。如果子系統(tǒng)就是最小層級(jí)業(yè)務(wù)系統(tǒng),那么它從邏輯層面講可能包含很多模塊,從部署的角度講也包含很多組件,單個(gè)子系統(tǒng)可以使用springBoot框架搭建,遵守其規(guī)范使用其功能;軟件架構(gòu)沒(méi)有銀彈,是以解決系統(tǒng)復(fù)雜度為目的而隨業(yè)務(wù)演進(jìn)的方法論。知道WHAT,WHY,才能更好的學(xué)習(xí)HOW。