本文為讀書筆記
一、架構(gòu)決策的案例
- 架構(gòu)設(shè)計
- 決策
- 交流
- 對并發(fā)的考慮不足,使用Spark導(dǎo)致瓶頸無法解決
- 由于是微服務(wù),接口保證了可擴展性,整體遷移到ES,前端不需要修改
- 決策失敗:對實際場景的瓶頸預(yù)計不足,選型不從實際性能瓶頸出發(fā)
- 架構(gòu)設(shè)計不是閉門造車,而是集體交流的結(jié)果
- 白板便利貼

白板便利貼
二、架構(gòu)視圖
RUP 4+1視圖
-
業(yè)務(wù)場景
- 用戶視角的實際業(yè)務(wù)場景
-
關(guān)鍵用例
業(yè)務(wù)場景
-
邏輯視圖
- 關(guān)注參與業(yè)務(wù)子系統(tǒng)(角色)
- 角色
- 產(chǎn)品
- 開發(fā)
- 運維
- 測試
-
分層架構(gòu)
邏輯視圖

邏輯視圖 分層架構(gòu)
-
開發(fā)視圖
- 分包、分命名空間
-
用于約束開發(fā)人員,統(tǒng)一思想,確定邊界
開發(fā)視圖
-
進程視圖
- 運行時的調(diào)用情況
-
對業(yè)務(wù)性能要求高的很重要
進程視圖
-
物理視圖
-
系統(tǒng)部署
物理視圖
-
三 架構(gòu)模型
C4架構(gòu)模型
- Context
- 黑盒子
- 有上下游
- Container
- 子模塊劃分
- 邊界確認
- Componet
- 流式處理業(yè)務(wù)(組合、判斷)
- source 輸入流
- channel 處理流
- 多個細粒度的processor組合
- 不包含業(yè)務(wù),而是組合業(yè)務(wù)
- 把有副作用(修改外部元素或流)和無副作用的processor區(qū)分開
- 輸入輸出盡量是模型對象而不是基本類型,避免職責(zé)模糊
- Processor甚至命名很長,但可重用性高,同時方便單元測試
- sink 輸出流
- 流式處理業(yè)務(wù)(組合、判斷)
- Classes
-
具體執(zhí)行類
C4架構(gòu)模型
-
四 架構(gòu)風(fēng)格
-
REST架構(gòu)風(fēng)格
- 核心是狀態(tài)模式
-
通過狀態(tài)模式實現(xiàn)的應(yīng)用層的無狀態(tài),降低系統(tǒng)的復(fù)雜性(mvi也有類似的實現(xiàn))
REST架構(gòu)風(fēng)格
-
微服務(wù)風(fēng)格
- 小而美,松耦合,按需擴展
- 單獨迭代進化
- 優(yōu)點
- 可以任意增刪,按需擴展
- 缺點
- 增加了系統(tǒng)的復(fù)雜度
- 優(yōu)先設(shè)計成微服務(wù)
- 頻繁更新變更
- 采用不同技術(shù)棧
-
高并發(fā)可以水平擴展
微服務(wù)風(fēng)格
image.png
-
關(guān)鍵部件
- 服務(wù)注冊發(fā)現(xiàn)
- 配置中心
- 斷路器 避免死鎖,超時強制拋異常。重啟服務(wù)等。
- 分布式事務(wù)
- 負載均衡
- 監(jiān)控 方便運維
- 服務(wù)監(jiān)控
- 日志監(jiān)控
- 數(shù)據(jù)庫監(jiān)控
- 資源監(jiān)控
-
CQRS - 命令、查詢職責(zé)分離
- command
- 無返回、有副作用
- 如果返回,則返回結(jié)果
- query
- 無副作用,有返回
-
Event store用于做副作用事件日志
image.png
- command
五 分層架構(gòu)模式
- 經(jīng)典3層
- View 用戶界面層
- Presenter 業(yè)務(wù)邏輯層
- Model 數(shù)據(jù)訪問層
- Data 數(shù)據(jù)庫
- 演進分層架構(gòu)
- 前端
- Web UI、Mobile UI、3rd-party serviceces
- 面向用戶
- 控制層
- 中間層
- 面向通信、路由、鑒權(quán)、負載均衡
- 應(yīng)用層
- 組合業(yè)務(wù)邏輯
- 組合領(lǐng)域?qū)诱{(diào)用
- 面向應(yīng)用、業(yè)務(wù)
- 領(lǐng)域?qū)?
- 執(zhí)行單一業(yè)務(wù)邏輯
- 面向具體業(yè)務(wù)
- 基礎(chǔ)設(shè)施層
- 數(shù)據(jù)庫、設(shè)置、設(shè)備
-
面向資源/設(shè)備
演進分層架構(gòu)
- 前端
- 穩(wěn)定依賴原則
- 依賴穩(wěn)定的,即接口,因為接口抽象(依賴倒置)
- 上游依賴下游,下游不應(yīng)依賴上游
六邊形架構(gòu)
- 核心是domain和application
- 外延是adapter
-
作用是可以被多種上下游復(fù)用
六邊形架構(gòu)
六 架構(gòu)設(shè)計的過程

架構(gòu)設(shè)計的過程
領(lǐng)域驅(qū)動設(shè)計DDD
設(shè)計過程
- 戰(zhàn)略設(shè)計
- 通過問題域和業(yè)務(wù)期望來劃分邊界
- 統(tǒng)一語言(接口),限制邊界上下文
- 戰(zhàn)術(shù)設(shè)計
- 模塊內(nèi)的自迭代(實現(xiàn)、維護、重構(gòu))
推廣到分包實踐
- 業(yè)務(wù)(interface - 實現(xiàn))- VP
- 如果要替換一個模塊 會替換的是功能,而絕不是同類集合
- 也可能被抽出作為公共庫
- 公共接口(Util 日志)
- 資源(JavaBean 常量 基礎(chǔ)接口(BaseVP)M層入口(視情況))
- 基類、沒必要放到下一級分包
- 統(tǒng)一命名,方便團隊統(tǒng)一理解
舉例
- a包
- a包提供的A接口
- a1包
- 實現(xiàn)A接口的A1類
- a2包
- 實現(xiàn)A接口的A2類
- a1包
- a包提供的A接口
七 總結(jié),架構(gòu)思想
- 分而治之,控制規(guī)?!绢I(lǐng)域、邊界】
- 團隊太小會導(dǎo)致團隊過于松散,團隊太大又會增加管理成本。程序跟團隊管理也是一樣的。
- 簡單、清晰、一致【統(tǒng)一上下文】
- 統(tǒng)一命名,方便團隊統(tǒng)一理解
- 流











