架構(gòu)之道:分離業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)
1. 什么是架構(gòu)?
關(guān)于架構(gòu)這個概念很難給出一個明確的定義,也沒有一個標(biāo)準(zhǔn)的定義。
硬是要給一個概述,我認(rèn)為架構(gòu)就是對系統(tǒng)中的實(shí)體以及實(shí)體之間的關(guān)系所進(jìn)行的抽象描述。
架構(gòu)始于建筑,是因?yàn)槿祟惏l(fā)展(原始人自給自足住在樹上,也就不需要架構(gòu)),分工協(xié)作的需要,將目標(biāo)系統(tǒng)按某個原則進(jìn)行切分,切分的原則,是要便于不同的角色進(jìn)行并行工作。
2. 為什么需要架構(gòu)?
有系統(tǒng)的地方就需要架構(gòu),大到航空飛機(jī),小到一個電商系統(tǒng)里面的一個功能組件都需要設(shè)計和架構(gòu)。
我很喜歡《系統(tǒng)架構(gòu):復(fù)雜系統(tǒng)的產(chǎn)品設(shè)計與開發(fā)》里面的一句話:結(jié)構(gòu)良好的創(chuàng)造活動要優(yōu)于毫無結(jié)構(gòu)的創(chuàng)造活動。
與之相對應(yīng)的,現(xiàn)在很多敏捷思想提倡 no design,只要 work 就好。期待好的架構(gòu)可以在迭代中自然涌現(xiàn)。這個想法有點(diǎn)太理想化了,在現(xiàn)實(shí)中,只要能 work 的代碼,工程師是很少有動力去重構(gòu)和優(yōu)化的。
3. 架構(gòu)師的職責(zé)
作為架構(gòu)師,我們最重要的價值應(yīng)該是“化繁為簡”。但凡讓事情變得更復(fù)雜,讓系統(tǒng)變得更晦澀難懂的架構(gòu)都是值得商榷的。
架構(gòu)師的工作就是要努力訓(xùn)練自己的思維,用它去理解復(fù)雜的系統(tǒng),通過合理的分解和抽象,使哪些系統(tǒng)不再那么難懂。我們應(yīng)該努力構(gòu)建易懂的架構(gòu),使得在系統(tǒng)上工作的其他人員(例如設(shè)計者、實(shí)現(xiàn)者、操作員等)可以較為容易地理解這個系統(tǒng)。
軟件架構(gòu)
軟件架構(gòu)是一個系統(tǒng)的草圖。軟件架構(gòu)描述的對象是直接構(gòu)成系統(tǒng)的抽象組件。各個組件之間的連接則明確和相對細(xì)致地描述組件之間的通信。在實(shí)現(xiàn)階段,這些抽象組件被細(xì)化為實(shí)際的組件,比如具體某個類或者對象。在面向?qū)ο箢I(lǐng)域中,組件之間的連接通常用接口來實(shí)現(xiàn)。
軟件架構(gòu)為軟件系統(tǒng)提供了一個結(jié)構(gòu)、行為和屬性的高級抽象,由構(gòu)件的描述、構(gòu)件的相互作用、指導(dǎo)構(gòu)件集成的模式以及這些模式的約束組成。軟件架構(gòu)不僅顯示了軟件需求和軟件結(jié)構(gòu)之間的對應(yīng)關(guān)系,而且指定了整個軟件系統(tǒng)的組織和拓?fù)浣Y(jié)構(gòu),提供了一些設(shè)計決策的基本原理。
軟件架構(gòu)的核心價值應(yīng)該只圍繞一個核心命題:控制復(fù)雜性。他并不意味著某個特定的分層結(jié)構(gòu),某個特定的方法論(貧血、DDD 等)。
軟件架構(gòu)分類
在介紹應(yīng)用架構(gòu)之前,我們先來看一下軟件架構(gòu)的分類。
隨著互聯(lián)網(wǎng)的發(fā)展,現(xiàn)在的系統(tǒng)要支撐數(shù)億人同時在線購物、通信、娛樂的需要,相應(yīng)的軟件體系結(jié)構(gòu)也變得越來越復(fù)雜。軟件架構(gòu)的含義也變得更加寬泛,我們不能簡單地用一個軟件架構(gòu)來指代所有的軟件架構(gòu)工作。按照我個人理解,我將軟件架構(gòu)劃分為:
業(yè)務(wù)架構(gòu):由業(yè)務(wù)架構(gòu)師負(fù)責(zé),也可以稱為業(yè)務(wù)領(lǐng)域?qū)<?、行業(yè)專家。業(yè)務(wù)架構(gòu)屬于頂層設(shè)計,其對業(yè)務(wù)的定義和劃分會影響組織結(jié)構(gòu)和技術(shù)架構(gòu)。例如,阿里巴巴在沒有中臺部門之前,每個業(yè)務(wù)部門的技術(shù)架構(gòu)都是煙囪式的,淘寶、天貓、飛豬、1688 等各有一套體系結(jié)構(gòu)。而后,成立了共享平臺事業(yè)部,打通了賬號、商品、訂單等體系,讓商業(yè)基礎(chǔ)實(shí)施的復(fù)用成為可能。
應(yīng)用架構(gòu):由應(yīng)用架構(gòu)師負(fù)責(zé),他需要根據(jù)業(yè)務(wù)場景的需要,設(shè)計應(yīng)用的層次結(jié)構(gòu),制定應(yīng)用規(guī)范、定義接口和數(shù)據(jù)交互協(xié)議等。并盡量將應(yīng)用的復(fù)雜度控制在一個可以接受的水平,從而在快速的支撐業(yè)務(wù)發(fā)展的同時,在保證系統(tǒng)的可用性和可維護(hù)性的同時,確保應(yīng)用滿足非功能屬性要求(性能、安全、穩(wěn)定性等)。
分布式系統(tǒng)架構(gòu):分布式系統(tǒng)基本是稍具規(guī)模業(yè)務(wù)的必選項(xiàng)。它需要解決服務(wù)器負(fù)載,分布式服務(wù)的注冊和發(fā)現(xiàn),消息系統(tǒng),緩存系統(tǒng),分布式數(shù)據(jù)庫等問題,同時架構(gòu)師要在 CAP(Consistency,Availability,Partition tolerance)之間進(jìn)行權(quán)衡。
數(shù)據(jù)架構(gòu):對于規(guī)模大一些的公司,數(shù)據(jù)治理是一個很重要的課題。如何對數(shù)據(jù)收集、數(shù)據(jù)處理提供統(tǒng)一的服務(wù)和標(biāo)準(zhǔn),是數(shù)據(jù)架構(gòu)需要關(guān)注的問題。其目的就是統(tǒng)一數(shù)據(jù)定義規(guī)范,標(biāo)準(zhǔn)化數(shù)據(jù)表達(dá),形成有效易維護(hù)的數(shù)據(jù)資產(chǎn),搭建統(tǒng)一的大數(shù)據(jù)處理平臺,形成數(shù)據(jù)使用閉環(huán)。
物理架構(gòu):物理架構(gòu)關(guān)注軟件元件是如何放到硬件上的,包括機(jī)房搭建、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),網(wǎng)絡(luò)分流器、代理服務(wù)器、Web 服務(wù)器、應(yīng)用服務(wù)器、報表服務(wù)器、整合服務(wù)器、存儲服務(wù)器和主機(jī)等。
運(yùn)維架構(gòu):負(fù)責(zé)運(yùn)維系統(tǒng)的規(guī)劃、選型、部署上線,建立規(guī)范化的運(yùn)維體系。
典型應(yīng)用架構(gòu)
1. 分層架構(gòu)
分層是一種常見的根據(jù)系統(tǒng)中的角色(職責(zé)拆分)和組織代碼單元的常規(guī)實(shí)踐。常見的分層結(jié)構(gòu)如下圖所示:
2. CQRS
CQS(Command Query Separation,命令查詢分離),最早來自于 Betrand Meyer(Eiffel 語言之父,OCP 提出者)提出的概念。其基本思想在于,任何一個對象的方法可以分為兩大類:
-
命令(Command): 不返回任何結(jié)果(void),但會改變對象的狀態(tài)。
-
查詢(Query): 返回結(jié)果,但是不會改變對象的狀態(tài),對系統(tǒng)沒有副作用。

3. 六邊形架構(gòu)


4. 洋蔥圈架構(gòu)

-
外層依賴內(nèi)層 -
內(nèi)層對外層無感知

1. 分層設(shè)計

1)展現(xiàn)層(Presentation Layer)
2)應(yīng)用層(Application Layer)
3)領(lǐng)域?qū)樱―omain Layer)
4)基礎(chǔ)實(shí)施層(Infrastructure Layer)
2. 擴(kuò)展設(shè)計

3. 規(guī)范設(shè)計

4. COLA 架構(gòu)總覽




作者:張建飛? 阿里巴巴高級技術(shù)專家; 來源:阿里巴巴云原生
特別推薦一個分享架構(gòu)+算法的優(yōu)質(zhì)內(nèi)容,還沒關(guān)注的小伙伴,可以長按關(guān)注一下:
長按訂閱更多精彩▼
如有收獲,點(diǎn)個在看,誠摯感謝
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!