分享下 阿里 P9 李運華 對于「架構」話題的思考错邦。
你好,我是李運華型宙。
2018 年撬呢,我發(fā)布了《從 0 開始學架構》這門課程,分享了我之前在電信業(yè)務和移動互聯(lián)網(wǎng)業(yè)務方面的經(jīng)驗和感悟妆兑。
后來魂拦,我轉崗去了螞蟻國際,從事更加復雜的支付業(yè)務搁嗓。為什么說支付業(yè)務更加復雜芯勘?因為它涉及的關聯(lián)方多、業(yè)務流程長腺逛、業(yè)務模型復雜荷愕,對安全、高可用、高性能等都有更高的要求安疗。我有幸參與了一個海外錢包從 0 到 1 的建設過程抛杨,積累了不少實戰(zhàn)經(jīng)驗,于是對復雜業(yè)務的架構設計有了新的理解荐类。
2020 年蝶桶,因為身體等原因,我離開了螞蟻國際掉冶,之后就一邊休養(yǎng)身體真竖,一邊系統(tǒng)地總結梳理過去的經(jīng)驗,先后創(chuàng)作了《大廠晉升指南》和《架構實戰(zhàn)營》厌小。在打磨課程和與各位同學交流的過程中恢共,我對于架構學習的難點和應用的痛點,又有了新的心得體會璧亚。
因此讨韭,我決定更新這門課程的部分內容,把這些新的收獲也全部分享出來癣蟋,希望能幫助你與時俱進地提升架構水平透硝。
架構到底是指什么
對于技術人員來說,“架構”是一個再常見不過的詞了疯搅。我們會對新員工培訓整個系統(tǒng)的架構濒生,參加架構設計評審,學習業(yè)界開源系統(tǒng)(例如 MySQL 和 Hadoop)的架構幔欧,研究大公司的架構實現(xiàn)(例如微信架構和淘寶架構)……
雖然“架構”這個詞很常見罪治,但如果深究一下,“架構”到底是指什么礁蔗,大部分人就搞不清楚了觉义。例如以下這些問題,你能夠準確地回答嗎浴井?
身為架構師跨新,如果你連架構的定義都搞不清楚富腊,那么無論是自己設計架構、給別人講解架構域帐,還是學習別人的架構赘被,都會暴露問題,要么無從下手肖揣,要么張冠李戴民假。這無疑會成為你面試、晉升和帶領團隊工作時的絆腳石龙优。
比如有些同學明明在系統(tǒng)架構上做了不少有價值的工作羊异,但是在給晉升面試的評委講解的時候,只會說“我們是微服務架構”彤断,然后就不知道講什么了霞势。結果得到的評價大打折扣晰赞,晉升失敗,非常可惜诫钓。
要想準確地理解架構的定義,關鍵就在于把三組容易混淆的概念梳理清楚:
系統(tǒng)與子系統(tǒng)
我們先來看維基百科定義的“系統(tǒng)”:
系統(tǒng)泛指由一群有關聯(lián)的個體組成彪笼,根據(jù)某種規(guī)則運作睬愤,能完成個別元件不能單獨完成的工作的群體。它的意思是“總體”“整體”或“聯(lián)盟”劲蜻。
我來提煉一下里面的關鍵內容陆淀。
我們再來看子系統(tǒng)的定義:
子系統(tǒng)也是由一群有關聯(lián)的個體所組成的系統(tǒng),多半會是更大系統(tǒng)中的一部分厨幻。
其實相嵌,子系統(tǒng)的定義和系統(tǒng)定義是一樣的,只是觀察的角度有差異况脆,一個系統(tǒng)可能是另外一個更大系統(tǒng)的子系統(tǒng)饭宾。
按照這個定義,系統(tǒng)和子系統(tǒng)比較容易理解格了,我們以微信為例來做一個分析:
現(xiàn)在续徽,我們可以回答第一個問題了。一個系統(tǒng)的架構架谎,只包括頂層這一個層級的架構,而不包括下屬子系統(tǒng)層級的架構辟躏。所以微信架構谷扣,就是指微信系統(tǒng)這個層級的架構。當然捎琐,微信的子系統(tǒng)会涎,比如支付系統(tǒng),也有它自己的架構瑞凑,同樣只包括頂層末秃。
模塊與組件
模塊和組件兩個概念在實際工作中很容易混淆,我們經(jīng)常能夠聽到類似這樣的說法:
造成這種現(xiàn)象的主要原因是,模塊與組件的定義并不好理解哑梳,也不能很好地進行區(qū)分劲阎。我們來看看這兩者在維基百科上的定義:
軟件模塊(Module)是一套一致而互相有緊密關連的軟件組織。它分別包含了程序和數(shù)據(jù)結構兩部分○妫現(xiàn)代軟件開發(fā)往往利用模塊作為合成的單位悯仙。模塊的接口表達了由該模塊提供的功能和調用它時所需的元素。模塊是可能分開被編寫的單位吠卷。這使它們可再用和允許人員同時協(xié)作锡垄、編寫及研究不同的模塊。
軟件組件定義為自包含的祭隔、可編程的偎捎、可重用的、與語言無關的軟件單元序攘,軟件組件可以很容易被用于組裝應用程序中茴她。
可能你看完這兩個定義后一頭霧水,還是不知道這兩者有什么區(qū)別程奠。造成這種現(xiàn)象的根本原因是丈牢,模塊和組件都是系統(tǒng)的組成部分,只是從不同的角度拆分系統(tǒng)而已瞄沙。
從業(yè)務邏輯的角度來拆分系統(tǒng)后己沛,得到的單元就是“模塊”慌核;從物理部署的角度來拆分系統(tǒng)后,得到的單元就是“組件”申尼。劃分模塊的主要目的是職責分離垮卓;劃分組件的主要目的是單元復用。
其實师幕,“組件”的英文 Component 也可翻譯成中文的“零件”一詞粟按。“零件”更容易理解一些霹粥,它是一個物理的概念灭将,并且具備“獨立且可替換”的特點。
我以一個最簡單的網(wǎng)站系統(tǒng)來為例后控。假設我們要做一個學生信息管理系統(tǒng)庙曙,這個系統(tǒng)從邏輯的角度來拆分,可以分為“登錄注冊模塊”“個人信息模塊”和“個人成績模塊”浩淘;從物理的角度來拆分捌朴,可以拆分為 Nginx、Web 服務器和 MySQL张抄。
現(xiàn)在男旗,我們可以回答第二個問題了。如果你是業(yè)務系統(tǒng)的架構師欣鳖,首先需要思考怎么從業(yè)務邏輯的角度把系統(tǒng)拆分成一個個模塊角色察皇,其次需要思考怎么從物理部署的角度把系統(tǒng)拆分成組件角色,例如選擇 MySQL 作為存儲系統(tǒng)泽台。但是對于 MySQL 內部的體系架構(Parser什荣、Optimizer、Caches&Buffers 和 Storage Engines 等)怀酷,你其實是可以不用關注的稻爬,也不需要在你的業(yè)務系統(tǒng)架構中展現(xiàn)這些內容。
框架與架構
框架是和架構比較相似的概念蜕依,且兩者有較強的關聯(lián)關系桅锄,所以在實際工作中,這兩個概念有時我們容易分不清楚样眠。參考維基百科上框架與架構的定義友瘤,我來解釋兩者的區(qū)別。
軟件框架(Software framework)通常指的是為了實現(xiàn)某個業(yè)界標準或完成特定基本任務的軟件組件規(guī)范檐束,也指為了實現(xiàn)某個軟件組件規(guī)范時辫秧,提供規(guī)范所要求之基礎功能的軟件產(chǎn)品。
我來提煉一下其中關鍵部分:
軟件架構指軟件系統(tǒng)的“基礎結構”懂诗,創(chuàng)造這些基礎結構的準則蜂嗽,以及對這些結構的描述。
單純從定義的角度來看殃恒,框架和架構的區(qū)別還是比較明顯的:框架關注的是“規(guī)范”植旧,架構關注的是“結構”。
框架的英文是 Framework离唐,架構的英文是 Architecture病附,Spring MVC 的英文文檔標題就是“Web MVC framework”。
究竟什么說法是對的,什么說法是錯的呢庵朝?
其實這些說法都是對的吗冤。造成這種現(xiàn)象的根本原因隱藏于架構的定義中,關鍵就是“基礎結構”這個概念九府,并沒有明確說是從什么角度來分解的椎瘟。采用不同的角度或者維度,可以將系統(tǒng)劃分為不同的結構侄旬,其實我在“模塊與組件”中的“學生管理系統(tǒng)”示例已經(jīng)包含了這點降传。
從業(yè)務邏輯的角度分解,“學生管理系統(tǒng)”的架構是:
從物理部署的角度分解勾怒,“學生管理系統(tǒng)”的架構是:
從開發(fā)規(guī)范的角度分解婆排,“學生管理系統(tǒng)”可以采用標準的 MVC 框架來開發(fā)声旺,因此架構又變成了 MVC 架構:
這些“架構”,都是“學生管理系統(tǒng)”正確的架構段只,只是從不同的角度來分解而已腮猖,這也是 IBM 的 RUP 將軟件架構視圖分為著名的“4+1 視圖”的原因。
現(xiàn)在赞枕,我們可以回答第三個問題了澈缺。框架是一整套開發(fā)規(guī)范炕婶,架構是某一套開發(fā)規(guī)范下的具體落地方案姐赡,包括各個模塊之間的組合關系以及它們協(xié)同起來完成功能的運作規(guī)則。
重新定義架構:4R 架構
參考維基百科的定義柠掂,再結合我自己的一些理解和思考项滑,我將軟件架構重新定義為:軟件架構指軟件系統(tǒng)的頂層(Rank)結構,它定義了系統(tǒng)由哪些角色(Role)組成涯贞,角色之間的關系(Relation)和運作規(guī)則(Rule)枪狂。
因為這個定義中的 4 個關鍵詞,都可以用 R 開頭的英文單詞來表示宋渔,分別是 Rank州疾、Role、Relation 和 Rule皇拣,所以我把定義簡稱為“4R 架構定義”严蓖,每個 R 的詳細解釋如下。
第一個 R氧急,Rank颗胡。它是指軟件架構是分層的,對應“系統(tǒng)”和“子系統(tǒng)”的分層關系态蒂。通常情況下杭措,我們只需要關注某一層的架構,最多展示相鄰兩層的架構钾恢,而不需要把每一層的架構全部糅雜在一起手素。無論是架構設計還是畫架構圖,都應該采取“自頂向下瘩蚪,逐步細化”的方式泉懦。以微信為例,Rank 的含義如下所示:
注:L0\L1\L2 指層級疹瘦,一個 L0 往下可以分解多個 L1崩哩,一個 L1 可以往下分解多個 L2,以此類推,一般建議不超過 5 層(L0~L4)邓嘹。
第二個 R酣栈,Role。它是指軟件系統(tǒng)包含哪些角色汹押,每個角色都會負責系統(tǒng)的一部分功能矿筝。架構設計最重要的工作之一就是將系統(tǒng)拆分為多個角色。最常見的微服務拆分其實就是將整體復雜的業(yè)務系統(tǒng)按照業(yè)務領域的方式棚贾,拆分為多個微服務窖维,每個微服務就是系統(tǒng)的一個角色。
第三個 R妙痹,Relation铸史。它是指軟件系統(tǒng)的角色之間的關系,對應到架構圖中其實就是連接線怯伊,角色之間的關系不能亂連琳轿,任何關系最后都需要代碼來實現(xiàn),包括連接方式(HTTP震贵、TCP利赋、UDP 和串口等)水评、數(shù)據(jù)協(xié)議(JSON猩系、XML 和二進制等)以及具體的接口等。
第四個 R中燥,Rule寇甸。它是指軟件系統(tǒng)角色之間如何協(xié)作來完成系統(tǒng)功能。我們在前面解讀什么是“系統(tǒng)”的時候提到過:系統(tǒng)能力不是個體能力之和疗涉,而是產(chǎn)生了新的能力拿霉。那么這個新能力具體如何完成的呢?具體哪些角色參與了這個新能力呢咱扣?這就是 Rule 所要表達的內容绽淘。在架構設計的時候,核心的業(yè)務場景都需要設計 Rule闹伪。
在實際工作中沪铭,為了方便理解,Rank偏瓤、Role 和 Relation 是通過系統(tǒng)架構圖來展示的杀怠,而 Rule 是通過系統(tǒng)序列圖(System Sequence Diagram)來展示的。
我們以一個簡化的支付系統(tǒng)為例厅克,支付系統(tǒng)架構圖如下所示:
“掃碼支付”這個核心場景的系統(tǒng)序列圖如下所示:
小結
今天我為你梳理了與架構有關的幾個容易混淆的概念赔退,包括系統(tǒng)與子系統(tǒng)、模塊與組件、框架與架構硕旗,并且提煉出了 4R 架構定義窗骑,希望對你有所幫助。
這就是今天的全部內容漆枚,留一道思考題給你吧慧域。你原來理解的架構是如何定義的?對比我今天講的架構定義浪读,你覺得差異在哪里昔榴?