軟件架構設計分層模型和(hé / huò)構圖思考
架構思維概述
架構設計中有兩個(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)全面理解業務系統或功能實現。
雲平台三層架構:資源-平台-應用
對于(yú)資源層從物理資源,再到(dào)虛拟化邏輯資源,從虛拟機到(dào)現在(zài)更加輕量的(de)容器資源。而(ér)對于(yú)平台層原來(lái)隻談技術平台,但是(shì)當前又進一(yī / yì /yí)步拆分出(chū)業務平台,也(yě)可以(yǐ)理解成當前說(shuō)得比較多的(de)中台層。
問題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)能力抽象。
在(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ì)應用功能實現。
應用架構分層
領域驅動設計在(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)内涵。
領域層和(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à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)方式進行構圖。
架構圖的(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下,更加強調平台+應用構建模式。