...

軟件架構設計分層模型和(hé / huò)構圖思考

2022-03-21

架構思維概述


對于(yú)架構思維本身仍然是(shì)類似系統思維,結構化思維,編程思維等諸多思維模式的(de)一(yī / yì /yí)個(gè)合集。由于(yú)架構的(de)核心作用是(shì)在(zài)業務現實世界和(hé / huò)抽象的(de)IT實現之(zhī)間建立起一(yī / yì /yí)道(dào)橋梁,因此架構思維最核心的(de)就(jiù)是(shì)要(yào / yāo)理解到(dào)業務驅動技術,技術爲(wéi / wèi)最終的(de)業務服務。要(yào / yāo)真正通過架構設計來(lái)完成業務和(hé / huò)技術,需求和(hé / huò)實現,軟件和(hé / huò)硬件,靜态和(hé / huò)動态,成本和(hé / huò)收益等多方面的(de)平衡。

圖片

架構設計中有兩個(gè)重點,一(yī / yì /yí)個(gè)是(shì)分解,一(yī / yì /yí)個(gè)是(shì)集成。

分解是(shì)最基礎的(de),架構的(de)重點就(jiù)是(shì)要(yào / yāo)對複雜問題進行分而(ér)治之(zhī),同時(shí)保證分解後的(de)各個(gè)部分還能夠高内聚,松耦合,最終又集成爲(wéi / wèi)一(yī / yì /yí)個(gè)完整的(de)整體。分解核心是(shì)定義問題,因此架構首先仍然需要(yào / yāo)理解清楚需求。

集成是(shì)配合分解完成的(de)動作,最終分解完成的(de)各個(gè)組件或子(zǐ)系統,通過合适的(de)接口設計,最終還能夠集成爲(wéi / wèi)一(yī / yì /yí)個(gè)完整的(de)整體,分解僅僅是(shì)加速開發和(hé / huò)降低問題複雜度,如果分解後的(de)内容無法集成在(zài)一(yī / yì /yí)起,那麽分解就(jiù)沒有任何意義。

分解+集成可以(yǐ)理解爲(wéi / wèi)架構最核心的(de)思考方式和(hé / huò)方法。

在(zài)分解完成後,一(yī / yì /yí)個(gè)大(dà)的(de)系統已經拆分爲(wéi / wèi)了(le/liǎo)諸多的(de)小模塊,或者一(yī / yì /yí)個(gè)小模塊實現本身又分爲(wéi / wèi)了(le/liǎo)多個(gè)步驟階段。那麽零散的(de)節點必須向上(shàng)彙集和(hé / huò)歸納,形成一(yī / yì /yí)個(gè)完整的(de)架構。

而(ér)這(zhè)個(gè)架構的(de)形成要(yào / yāo)給關鍵就(jiù)是(shì)要(yào / yāo)又分層思維。架構分層是(shì)談架構絕對繞不(bù)開的(de)一(yī / yì /yí)個(gè)點,通過架構分層可以(yǐ)更好地(dì / de)全面理解業務系統或功能實現。




雲平台三層架構:資源-平台-應用


在(zài)規劃大(dà)架構的(de)時(shí)候,常會參考雲計算的(de)标準三層架構,即IaaS層,PaaS層,SaaS層。對于(yú)IaaS層重點是(shì)IT基礎設施和(hé / huò)虛拟化;PaaS層重點是(shì)構建平台層服務能力;而(ér)對于(yú)SaaS層則是(shì)具體的(de)應用。

對于(yú)資源層從物理資源,再到(dào)虛拟化邏輯資源,從虛拟機到(dào)現在(zài)更加輕量的(de)容器資源。而(ér)對于(yú)平台層原來(lái)隻談技術平台,但是(shì)當前又進一(yī / yì /yí)步拆分出(chū)業務平台,也(yě)可以(yǐ)理解成當前說(shuō)得比較多的(de)中台層。

同時(shí)在(zài)平台層和(hé / huò)應用層之(zhī)間增加了(le/liǎo)服務層,實現資源和(hé / huò)服務的(de)解耦。

圖片

如果涉及到(dào)物聯網類應用,一(yī / yì /yí)般還會在(zài)底層增加網絡層和(hé / huò)感知層,比如一(yī / yì /yí)個(gè)智慧城市标準平台和(hé / huò)應用的(de)架構圖類似如下:

圖片

在(zài)平台+應用構建模式下,一(yī / yì /yí)般在(zài)平台和(hé / huò)應用之(zhī)間還會有一(yī / yì /yí)個(gè)單獨的(de)服務層來(lái)實現接口服務對外的(de)能力開放。資源+服務+應用也(yě)是(shì)我們常說(shuō)的(de)SOA分層架構模式,因此對于(yú)服務層也(yě)可以(yǐ)單獨拆分出(chū)來(lái)作爲(wéi / wèi)一(yī / yì /yí)個(gè)小分層。

圖片

問題1:數據庫和(hé / huò)數據層

在(zài)構建一(yī / yì /yí)個(gè)完整的(de)總體架構的(de)時(shí)候,實際上(shàng)沒有數據層這(zhè)個(gè)概念,數據層是(shì)在(zài)表達單個(gè)應用系統的(de)分層架構實現的(de)時(shí)候才會出(chū)現的(de)内容。

在(zài)總架構圖裏面把類似結構化數據庫,非結構化數據等全部列出(chū)單獨一(yī / yì /yí)層這(zhè)個(gè)也(yě)不(bù)對,這(zhè)個(gè)應該是(shì)在(zài)技術架構裏面體現。

還有一(yī / yì /yí)種是(shì)單獨分出(chū)一(yī / yì /yí)個(gè)數據層,将大(dà)的(de)公共基礎數據列出(chū),比如上(shàng)面談的(de)智慧城市架構圖。如果這(zhè)些基礎數據存在(zài)共性能力朝上(shàng)提供,那麽可以(yǐ)歸納到(dào)PaaS平台層,在(zài)PaaS平台層單獨分出(chū)一(yī / yì /yí)個(gè)數據平台域來(lái)進行體現。

問題2:服務層和(hé / huò)服務

在(zài)構建整體架構的(de)時(shí)候可以(yǐ)單獨出(chū)一(yī / yì /yí)個(gè)能力開放平台或服務層,但是(shì)不(bù)用體現具體有哪些業務服務能力。因爲(wéi / wèi)單獨出(chū)業務服務能力本質已經屬于(yú)應用層内容,即應用又細化拆分爲(wéi / wèi)了(le/liǎo)業務中台和(hé / huò)前台應用,中間銜接的(de)服務。我們可以(yǐ)參考網上(shàng)的(de)另外一(yī / yì /yí)個(gè)構圖,如下:

圖片

這(zhè)個(gè)構圖既不(bù)像雲平台中的(de)分層架構,也(yě)不(bù)像應用功能實現中的(de)分層架構。實際可以(yǐ)看到(dào)如果體現單獨的(de)支撐層,支撐層已經類似現在(zài)經常說(shuō)到(dào)的(de)業務中台和(hé / huò)能力提供。

那麽整個(gè)架構應該爲(wéi / wèi) 技術平台+中台+應用 方式來(lái)進行構圖。




SOA分層:組件-服務-流程


對于(yú)SOA架構分層,重點要(yào / yāo)體現的(de)就(jiù)是(shì)服務,對于(yú)組件本身是(shì)屬于(yú)邏輯資源層的(de)概念,而(ér)對于(yú)服務則是(shì)資源對外暴露的(de)能力抽象。

圖片

SOA架構分層重點就(jiù)是(shì)要(yào / yāo)體現出(chū)獨立的(de)服務層,注意不(bù)是(shì)畫服務總線,這(zhè)裏可以(yǐ)單獨畫出(chū)具體提供哪些業務服務能力,技術服務能力。在(zài)采用SOA架構進行開發的(de)時(shí)候,整體業務系統拆分爲(wéi / wèi)4個(gè)組件,10類服務域,5類流程,那麽在(zài)構建的(de)時(shí)候重點就(jiù)是(shì)将上(shàng)述組件,服務域和(hé / huò)流程類體現出(chū)來(lái)。對于(yú)參考SOA架構來(lái)進行的(de)構圖,參考如下:

圖片

這(zhè)裏的(de)數據層最好改爲(wéi / wèi)标準的(de)組件層,更加貼近SOA架構模型。在(zài)圖中的(de)服務層已經可以(yǐ)看到(dào)一(yī / yì /yí)個(gè)個(gè)獨立的(de)API服務接口。如果服務接口數據大(dà),一(yī / yì /yí)般隻會劃分到(dào)服務域,比如用戶中心服務,采購類服務等。在(zài)這(zhè)種方式下構圖參考如下:

圖片

在(zài)上(shàng)圖中結合了(le/liǎo)雲和(hé / huò)SOA兩種架構融合在(zài)一(yī / yì /yí)起,對于(yú)上(shàng)圖中的(de)服務層實際可以(yǐ)理解爲(wéi / wèi)組件資源層和(hé / huò)服務接口層的(de)融合。更好的(de)構圖方式應該是(shì)拆分爲(wéi / wèi)标準的(de)中台資源層-服務層-應用層。




雲和(hé / huò)SOA架構融合


圖片

注意對于(yú)雲分層架構重點強調的(de)是(shì)基礎設施,平台和(hé / huò)應用三層架構。而(ér)對于(yú)SOA架構強調的(de)是(shì)資源,服務和(hé / huò)應用三層。而(ér)對于(yú)對于(yú)傳統的(de)應用系統的(de)構建一(yī / yì /yí)般又包括了(le/liǎo)IT基礎設施,技術平台,數據庫,中間件和(hé / huò)應用。再到(dào)應用系統本身的(de)分層架構可能又是(shì)标準的(de)三層架構模式等。

這(zhè)些架構分層方法都幫助我們進一(yī / yì /yí)步融合分層架構模式。

架構分層有很多方法,包括基礎設施層,平台層,組件層,支撐層,服務層,應用層,數據層,展現層等。多種分發導緻分層模型反而(ér)出(chū)現歧義和(hé / huò)模糊。

在(zài)這(zhè)裏我們從技術架構和(hé / huò)應用架構兩個(gè)層面來(lái)談,技術架構沿用雲計算的(de)三層模型;而(ér)對于(yú)應用架構則采用eTOM模型标準的(de)資源,服務,應用三層模型。那麽兩種分層架構模型的(de)融合則是(shì)一(yī / yì /yí)個(gè)完整的(de)雲和(hé / huò)SOA融合的(de)分層架構模型。

即雲計算的(de)三層中,每一(yī / yì /yí)個(gè)層次本身又可以(yǐ)進一(yī / yì /yí)步拆分爲(wéi / wèi)資源,服務和(hé / huò)應用三層。

拿IaaS層來(lái)說(shuō),最底層的(de)物理資源虛拟機等是(shì)屬于(yú)資源層内容,通過IaaS層資源能力提供API接口作爲(wéi / wèi)技術服務進行能力開放,即是(shì)服務層;最終基于(yú)資源能力,構建了(le/liǎo)一(yī / yì /yí)個(gè)公有雲的(de)面向公衆的(de)運營服務平台,本身又屬于(yú)應用層的(de)内容。而(ér)對于(yú)SaaS層,則底層的(de)業務組件是(shì)資源,抽象的(de)API接口是(shì)服務層,最終的(de)前端業務或流程是(shì)應用功能實現。




應用架構分層


回到(dào)單個(gè)應用的(de)架構分層,談得最多的(de)就(jiù)是(shì)常說(shuō)的(de)三層架構模式。在(zài)軟件架構中,經典三層架構自頂向下由用戶界面層(User Interface Layer)、業務邏輯層(Business Logic Layer)與數據訪問層(Data Access Layer)組成。
在(zài)整個(gè)實現過程中,可能還會增加獨立的(de)Facade層,或獨立的(de)API接口服務提供層,統一(yī / yì /yí)的(de)DTO數據傳輸對象層等,但是(shì)這(zhè)些都不(bù)影響整體的(de)三層邏輯結構。

圖片

三層架構本身也(yě)和(hé / huò)一(yī / yì /yí)個(gè)業務功能實現的(de)完整對應,在(zài)數據訪問層處理數據獲取和(hé / huò)持久化操作,在(zài)業務邏輯層對業務規則進行處理,在(zài)界面展現層進行相應的(de)前端展現和(hé / huò)用戶交互。而(ér)談到(dào)領域建模的(de)時(shí)候,又引入了(le/liǎo)領域模型 中的(de)分層架構,如下:

圖片

領域驅動設計在(zài)經典三層架構的(de)基礎上(shàng)做了(le/liǎo)進一(yī / yì /yí)步改良,在(zài)用戶界面層與業務邏輯層之(zhī)間引入了(le/liǎo)新的(de)一(yī / yì /yí)層,即應用層(Application Layer)。同時(shí),一(yī / yì /yí)些層次的(de)命名也(yě)發生了(le/liǎo)變化。将業務邏輯層更名爲(wéi / wèi)領域層自然是(shì)題中應有之(zhī)義,而(ér)将數據訪問層更名爲(wéi / wèi)基礎設施層(Infrastructure Layer),則突破了(le/liǎo)之(zhī)前數據庫管理系統的(de)限制,擴大(dà)了(le/liǎo)這(zhè)個(gè)負責封裝技術複雜度的(de)基礎層次的(de)内涵。

當然,也(yě)有融合了(le/liǎo)領域模型和(hé / huò)傳統三架構思路後的(de)技術架構如下:

圖片

領域層和(hé / huò)業務邏輯層

在(zài)領域建模的(de)一(yī / yì /yí)個(gè)核心是(shì)領域模型,領域模型不(bù)再是(shì)一(yī / yì /yí)個(gè)個(gè)獨立的(de)數據庫表或數據對象,而(ér)是(shì)一(yī / yì /yí)個(gè)業務對象或領域對象。因此領域層是(shì)面向領域對象而(ér)設計實現,而(ér)業務規則能力本身也(yě)是(shì)屬于(yú)領域對象對外提供的(de)能力接口。即業務規則本身也(yě)是(shì)領域對象暴露的(de)能力。

傳統業務邏輯層實現往往是(shì)一(yī / yì /yí)個(gè)數據對象對應一(yī / yì /yí)個(gè)DAO,一(yī / yì /yí)個(gè)Service和(hé / huò)一(yī / yì /yí)個(gè)Interface。而(ér)領域模型下DAO可以(yǐ)是(shì)分開的(de),但是(shì)Service邏輯層往往則更多應該按領域模型思路對DAO層的(de)能力進行組裝和(hé / huò)聚合。

獨立應用層拆分

圖片

在(zài)我原來(lái)理解裏面,領域層提供領域模型和(hé / huò)領域服務能力接口,而(ér)應用層更多的(de)是(shì)對領域層多個(gè)領域對象模型提供的(de)服務能力進一(yī / yì /yí)步進行組裝和(hé / huò)編排,然後再暴露給前端應用。

談到(dào)應用層的(de)概念,實際上(shàng)可以(yǐ)理解爲(wéi / wèi)前端應用中存在(zài)的(de)共性能力的(de)進一(yī / yì /yí)步下沉。即應用本身隻是(shì)用戶業務功能實現的(de)承載,但是(shì)這(zhè)個(gè)功能的(de)實現可以(yǐ)通過多種前端展現形式,比如傳統的(de)CS桌面應用,BS應用,或手機端APP。

在(zài)電商裏面,一(yī / yì /yí)個(gè)商品訂購就(jiù)是(shì)一(yī / yì /yí)個(gè)獨立的(de)應用,用戶可以(yǐ)在(zài)APP完成,也(yě)可以(yǐ)在(zài)BS端完成,但是(shì)不(bù)論在(zài)哪裏完成最終應用層提供的(de)能力都應該一(yī / yì /yí)樣。比如完成一(yī / yì /yí)個(gè)商品訂購需要(yào / yāo)同時(shí)和(hé / huò)底層的(de)訂單,庫存,支付多個(gè)服務進行交付和(hé / huò)協同。那麽這(zhè)個(gè)邏輯顯然不(bù)适合同時(shí)在(zài)BS端應用和(hé / huò)APP端應用中進行重複編寫和(hé / huò)開發。那麽這(zhè)個(gè)内容就(jiù)應該在(zài)應用層實現。

如果回到(dào)微服務和(hé / huò)中台架構下,這(zhè)個(gè)應用層拆分更加必要(yào / yāo),即通過應用層來(lái)下沉共性的(de)服務組合和(hé / huò)組裝邏輯,這(zhè)個(gè)邏輯和(hé / huò)協同不(bù)應該屬于(yú)任何一(yī / yì /yí)個(gè)前端應用。

界面層還是(shì)接口層

在(zài)開發一(yī / yì /yí)個(gè)聚合能力的(de)中台微服務模塊的(de)時(shí)候,可以(yǐ)看到(dào)這(zhè)個(gè)微服務模塊本身并沒有界面展現層,那麽該微服務的(de)最上(shàng)層僅僅是(shì)提供API接口的(de)接口服務層。

該API接口服務能力既可以(yǐ)提供給APP前端,也(yě)可以(yǐ)提供給BS端使用。




軟件技術架構分層


軟件技術架構構圖,分層仍然可以(yǐ)沿用軟件三層分層模型,重點是(shì)說(shuō)明清楚各層用到(dào)的(de)關鍵技術組件或技術服務能力。比如軟件開發三層模型的(de)技術架構分層如下:

圖片

如果本身就(jiù)是(shì)一(yī / yì /yí)個(gè)技術平台,類似大(dà)數據平台,那麽我們在(zài)整體構圖的(de)時(shí)候仍然需要(yào / yāo)考慮先進行分層,再詳細說(shuō)明每層裏面的(de)技術内容。

比如對應一(yī / yì /yí)個(gè)大(dà)數據平台,包括了(le/liǎo)大(dà)數據采集,大(dà)數據存儲,大(dà)數據處理,大(dà)數據分析和(hé / huò)應用,那麽這(zhè)個(gè)就(jiù)是(shì)關鍵的(de)分層,可以(yǐ)基于(yú)這(zhè)個(gè)分層再來(lái)考慮各層采用的(de)關鍵技術。

圖片

對于(yú)技術棧構圖基本也(yě)可以(yǐ)參考技術架構構圖模式進行。

圖片

技術架構重點需要(yào / yāo)回答的(de)就(jiù)是(shì)你在(zài)進行軟件架構設計過程中,究竟會用到(dào)哪些關鍵技術,哪些開源産品或工具等。可以(yǐ)細化到(dào)具體的(de)技術産品,也(yě)可以(yǐ)僅細化到(dào)産品類型。

比如消息中間件,你可以(yǐ)細化到(dào)采用RabbitMQ,也(yě)可以(yǐ)在(zài)技術架構中隻體現采用消息中間件。

技術架構和(hé / huò)軟件功能分層架構唯一(yī / yì /yí)相同的(de)就(jiù)是(shì)分層,技術架構在(zài)各個(gè)分層裏面都沒有具體的(de)業務功能點和(hé / huò)實現内容,僅僅是(shì)關鍵技術點說(shuō)明。




單個(gè)應用功能架構


注意應用功能架構完全是(shì)重點描述應用系統具備哪些功能,一(yī / yì /yí)個(gè)功能究竟是(shì)采用什麽三層技術架構實現并不(bù)用關心。因此功能架構不(bù)應該體現數據層,邏輯層,技術點這(zhè)些内容。

那麽對于(yú)一(yī / yì /yí)個(gè)應用系統的(de)功能如何分層?

我們可以(yǐ)參考業務分層分類,将業務分爲(wéi / wèi)基礎支撐層,執行層,決策管理層。這(zhè)樣基本的(de)分層模式就(jiù)出(chū)來(lái)了(le/liǎo),基于(yú)該方式可以(yǐ)完成一(yī / yì /yí)個(gè)功能架構構圖。

圖片

對于(yú)單個(gè)應用來(lái)說(shuō)一(yī / yì /yí)般不(bù)會自身有雲平台,PaaS平台這(zhè)類概念。但是(shì)單個(gè)應用構建一(yī / yì /yí)定存在(zài)共性技術支撐平台能力,比如有自己的(de)流程管理,各自共性技術功能組件等。因此單應用構建還可以(yǐ)采用基礎技術支撐層+應用層+門戶層的(de)方式進行構圖。

在(zài)應用層再按具體的(de)業務域或業務階段進行進一(yī / yì /yí)步細分。

圖片




架構圖的(de)分層構圖邏輯


圖片

在(zài)前面基本給出(chū)了(le/liǎo)不(bù)同類型的(de)架構圖的(de)核心分層邏輯,可以(yǐ)看到(dào)在(zài)畫架構圖的(de)時(shí)候盡量不(bù)要(yào / yāo)混合使用不(bù)同場景下的(de)構圖方式,否則就(jiù)導緻整體架構圖混亂。

在(zài)畫整體架構的(de)時(shí)候一(yī / yì /yí)般需要(yào / yāo)重點參考雲三層架構,SOA三層架構的(de)構圖模式進行構圖。而(ér)在(zài)細化到(dào)某一(yī / yì /yí)個(gè)應用系統的(de)時(shí)候,仍然還需要(yào / yāo)分清是(shì)構建技術架構圖還是(shì)功能架構圖,兩者本身的(de)分層邏輯也(yě)存在(zài)很大(dà)的(de)差别而(ér)不(bù)能混用。

架構圖的(de)構圖邏輯

要(yào / yāo)完成一(yī / yì /yí)個(gè)完整的(de)架構圖構圖,可以(yǐ)先拆分爲(wéi / wèi)兩邊+中間。兩邊一(yī / yì /yí)般是(shì)放具體的(de)标準,規範等,比如安全管理,質量管理,技術标準規範,開發運維規範等。

中間即是(shì)重點需要(yào / yāo)考慮進行分層構建的(de)地(dì / de)方。

在(zài)前面也(yě)談到(dào)了(le/liǎo)中間部分重點參考雲計算和(hé / huò)SOA的(de)架構分層邏輯。一(yī / yì /yí)般來(lái)說(shuō)核心的(de)還是(shì)資源層,平台層,應用層,門戶層。而(ér)對于(yú)應用層本身又可以(yǐ)考慮業務域進一(yī / yì /yí)步拆分,或者根據價值鏈或業務生命周期拆分爲(wéi / wèi)多個(gè)階段域再展開描述。

在(zài)雲和(hé / huò)SOA下,更加強調平台+應用構建模式

而(ér)兩者之(zhī)間一(yī / yì /yí)般是(shì)服務層,通過SOA平台或API能力開放平台來(lái)統一(yī / yì /yí)接入和(hé / huò)發布服務,以(yǐ)形成一(yī / yì /yí)個(gè)完整的(de)資源+服務+應用的(de)松耦合架構。同時(shí)一(yī / yì /yí)個(gè)完整的(de)架構本身就(jiù) 是(shì)多視角的(de),如下:

圖片

功能架構往往可以(yǐ)給具體用戶和(hé / huò)業務人(rén)員看,而(ér)對于(yú)技術架構往往更多是(shì)内部團隊開發人(rén)員研讨使用。而(ér)設計到(dào)資源和(hé / huò)平台的(de)架構圖往往又是(shì)運維工程人(rén)員進行部署架構搭建的(de)重要(yào / yāo)參考。因此不(bù)同維度的(de)架構分層屬性本身不(bù)能随意融合使用,而(ér)導緻架構圖混亂。


來(lái)源: 架構師優雅之(zhī)道(dào)