阿里P9李運華:架構到底是指什么影暴?

分享下 阿里 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)也有架構磺浙,當我們談微信架構時洪囤,到底是在談什么架構?
  • Linux 有架構屠缭,MySQL 有架構箍鼓,JVM 也有架構崭参,使用 Java 開發(fā)呵曹、MySQL 存儲、跑在 Linux 上的業(yè)務系統(tǒng)也有架構,應該關注哪個架構呢奄喂?
  • 架構和框架是什么關系铐殃?有什么區(qū)別?

  • 身為架構師跨新,如果你連架構的定義都搞不清楚富腊,那么無論是自己設計架構、給別人講解架構域帐,還是學習別人的架構赘被,都會暴露問題,要么無從下手肖揣,要么張冠李戴民假。這無疑會成為你面試、晉升和帶領團隊工作時的絆腳石龙优。


    比如有些同學明明在系統(tǒng)架構上做了不少有價值的工作羊异,但是在給晉升面試的評委講解的時候,只會說“我們是微服務架構”彤断,然后就不知道講什么了霞势。結果得到的評價大打折扣晰赞,晉升失敗,非常可惜诫钓。


    要想準確地理解架構的定義,關鍵就在于把三組容易混淆的概念梳理清楚:


  • 系統(tǒng)與子系統(tǒng)
  • 模塊與組件
  • 框架與架構

  • 系統(tǒng)與子系統(tǒng)


    我們先來看維基百科定義的“系統(tǒng)”:


    系統(tǒng)泛指由一群有關聯(lián)的個體組成彪笼,根據(jù)某種規(guī)則運作睬愤,能完成個別元件不能單獨完成的工作的群體。它的意思是“總體”“整體”或“聯(lián)盟”劲蜻。


    我來提煉一下里面的關鍵內容陆淀。


  • 關聯(lián):系統(tǒng)是由一群有關聯(lián)的個體組成的,沒有關聯(lián)的個體堆在一起不能成為一個系統(tǒng)先嬉。例如轧苫,把一個發(fā)動機和一臺 PC 放在一起不能稱之為一個系統(tǒng),把發(fā)動機疫蔓、底盤含懊、輪胎、車架組合起來才能成為一臺汽車衅胀。
  • 規(guī)則:系統(tǒng)內的個體需要按照指定的規(guī)則運作岔乔,而不是單個個體各自為政。規(guī)則規(guī)定了系統(tǒng)內個體分工和協(xié)作的方式滚躯。例如雏门,汽車發(fā)動機負責產(chǎn)生動力嘿歌,然后通過變速器和傳動軸,將動力輸出到車輪上茁影,從而驅動汽車前進宙帝。
  • 能力:系統(tǒng)能力與個體能力有本質的差別,系統(tǒng)能力不是個體能力之和募闲,而是產(chǎn)生了新的能力步脓。例如,汽車能夠載重前進浩螺,而發(fā)動機靴患、變速器、傳動軸要出、車輪本身都不具備這樣的能力蚁廓。

  • 我們再來看子系統(tǒng)的定義:

    子系統(tǒng)也是由一群有關聯(lián)的個體所組成的系統(tǒng),多半會是更大系統(tǒng)中的一部分厨幻。


    其實相嵌,子系統(tǒng)的定義和系統(tǒng)定義是一樣的,只是觀察的角度有差異况脆,一個系統(tǒng)可能是另外一個更大系統(tǒng)的子系統(tǒng)饭宾。


    按照這個定義,系統(tǒng)和子系統(tǒng)比較容易理解格了,我們以微信為例來做一個分析:


  • 微信本身是一個系統(tǒng)看铆,包含聊天、登錄盛末、支付弹惦、朋友圈等子系統(tǒng)。
  • 朋友圈這個系統(tǒng)又包括動態(tài)悄但、評論棠隐、點贊等子系統(tǒng)。
  • 評論這個系統(tǒng)可能又包括防刷子系統(tǒng)檐嚣、審核子系統(tǒng)助泽、發(fā)布子系統(tǒng)、存儲子系統(tǒng)嚎京。
  • 評論審核子系統(tǒng)不再包含業(yè)務意義上的子系統(tǒng)嗡贺,而是包括各個模塊或者組件,這些模塊或者組件本身也是另外一個維度上的系統(tǒng)鞍帝。例如诫睬,MySQL、Redis 等是存儲系統(tǒng)帕涌,但不是業(yè)務子系統(tǒng)摄凡。

  • 現(xiàn)在续徽,我們可以回答第一個問題了。一個系統(tǒng)的架構架谎,只包括頂層這一個層級的架構,而不包括下屬子系統(tǒng)層級的架構辟躏。所以微信架構谷扣,就是指微信系統(tǒng)這個層級的架構。當然捎琐,微信的子系統(tǒng)会涎,比如支付系統(tǒng),也有它自己的架構瑞凑,同樣只包括頂層末秃。


    模塊與組件

    模塊和組件兩個概念在實際工作中很容易混淆,我們經(jīng)常能夠聽到類似這樣的說法:


  • MySQL 模塊主要負責存儲數(shù)據(jù)籽御,而 Elasticsearch 模塊主要負責數(shù)據(jù)搜索练慕。
  • 我們有安全加密組件、有審核組件技掏。
  • App 的下載模塊使用了第三方的組件铃将。

  • 造成這種現(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)品。


    我來提煉一下其中關鍵部分:


  • 框架是組件規(guī)范:例如被丧,MVC 就是一種最常見的開發(fā)規(guī)范盟戏,類似的還有 MVP绪妹、MVVM、J2EE 等框架柿究。
  • 框架提供基礎功能的產(chǎn)品:例如邮旷,Spring MVC 是 MVC 的開發(fā)框架,除了滿足 MVC 的規(guī)范蝇摸,Spring 提供了很多基礎功能來幫助我們實現(xiàn)功能婶肩,包括注解(@Controller 等)、Spring Security探入、Spring JPA 等很多基礎功能狡孔。

  • 軟件架構指軟件系統(tǒng)的“基礎結構”懂诗,創(chuàng)造這些基礎結構的準則蜂嗽,以及對這些結構的描述。


    單純從定義的角度來看殃恒,框架和架構的區(qū)別還是比較明顯的:框架關注的是“規(guī)范”植旧,架構關注的是“結構”。


    框架的英文是 Framework离唐,架構的英文是 Architecture病附,Spring MVC 的英文文檔標題就是“Web MVC framework”。


  • 雖然如此亥鬓,在實際工作中我們卻經(jīng)常碰到一些似是而非的說法完沪,例如:
  • 我們的系統(tǒng)是 MVC 架構。
  • 我們需要將 Android App 重構為 MVP 架構嵌戈。
  • 我們的系統(tǒng)基于 SSH 框架開發(fā)覆积。
  • 我們是 SSH 的架構。
  • XX 系統(tǒng)是基于 Spring MVC 框架開發(fā)熟呛,標準的 MVC 架構宽档。
  • ……

  • 究竟什么說法是對的,什么說法是錯的呢庵朝?


    其實這些說法都是對的吗冤。造成這種現(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 架構定義窗骑,希望對你有所幫助。


    這就是今天的全部內容漆枚,留一道思考題給你吧慧域。你原來理解的架構是如何定義的?對比我今天講的架構定義浪读,你覺得差異在哪里昔榴?

    最后編輯于
    ?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
    • 序言:七十年代末,一起剝皮案震驚了整個濱河市碘橘,隨后出現(xiàn)的幾起案子互订,更是在濱河造成了極大的恐慌,老刑警劉巖痘拆,帶你破解...
      沈念sama閱讀 207,113評論 6 481
    • 序言:濱河連續(xù)發(fā)生了三起死亡事件仰禽,死亡現(xiàn)場離奇詭異,居然都是意外死亡纺蛆,警方通過查閱死者的電腦和手機吐葵,發(fā)現(xiàn)死者居然都...
      沈念sama閱讀 88,644評論 2 381
    • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桥氏,“玉大人温峭,你說我怎么就攤上這事∽种В” “怎么了凤藏?”我有些...
      開封第一講書人閱讀 153,340評論 0 344
    • 文/不壞的土叔 我叫張陵,是天一觀的道長堕伪。 經(jīng)常有香客問我揖庄,道長,這世上最難降的妖魔是什么欠雌? 我笑而不...
      開封第一講書人閱讀 55,449評論 1 279
    • 正文 為了忘掉前任蹄梢,我火速辦了婚禮,結果婚禮上富俄,老公的妹妹穿的比我還像新娘禁炒。我一直安慰自己,他們只是感情好蛙酪,可當我...
      茶點故事閱讀 64,445評論 5 374
    • 文/花漫 我一把揭開白布齐苛。 她就那樣靜靜地躺著,像睡著了一般桂塞。 火紅的嫁衣襯著肌膚如雪凹蜂。 梳的紋絲不亂的頭發(fā)上,一...
      開封第一講書人閱讀 49,166評論 1 284
    • 那天,我揣著相機與錄音玛痊,去河邊找鬼汰瘫。 笑死,一個胖子當著我的面吹牛擂煞,可吹牛的內容都是我干的混弥。 我是一名探鬼主播,決...
      沈念sama閱讀 38,442評論 3 401
    • 文/蒼蘭香墨 我猛地睜開眼对省,長吁一口氣:“原來是場噩夢啊……” “哼蝗拿!你這毒婦竟也來了?” 一聲冷哼從身側響起蒿涎,我...
      開封第一講書人閱讀 37,105評論 0 261
    • 序言:老撾萬榮一對情侶失蹤哀托,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劳秋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體仓手,經(jīng)...
      沈念sama閱讀 43,601評論 1 300
    • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
      茶點故事閱讀 36,066評論 2 325
    • 正文 我和宋清朗相戀三年玻淑,在試婚紗的時候發(fā)現(xiàn)自己被綠了嗽冒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
      茶點故事閱讀 38,161評論 1 334
    • 序言:一個原本活蹦亂跳的男人離奇死亡补履,死狀恐怖添坊,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情干像,我是刑警寧澤帅腌,帶...
      沈念sama閱讀 33,792評論 4 323
    • 正文 年R本政府宣布驰弄,位于F島的核電站麻汰,受9級特大地震影響,放射性物質發(fā)生泄漏戚篙。R本人自食惡果不足惜五鲫,卻給世界環(huán)境...
      茶點故事閱讀 39,351評論 3 307
    • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望岔擂。 院中可真熱鬧位喂,春花似錦、人聲如沸乱灵。這莊子的主人今日做“春日...
      開封第一講書人閱讀 30,352評論 0 19
    • 文/蒼蘭香墨 我抬頭看了看天上的太陽痛倚。三九已至规婆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背抒蚜。 一陣腳步聲響...
      開封第一講書人閱讀 31,584評論 1 261
    • 我被黑心中介騙來泰國打工掘鄙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人嗡髓。 一個月前我還...
      沈念sama閱讀 45,618評論 2 355
    • 正文 我出身青樓操漠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饿这。 傳聞我的和親對象是個殘疾皇子浊伙,可洞房花燭夜當晚...
      茶點故事閱讀 42,916評論 2 344

    推薦閱讀更多精彩內容