架構風格#
確定了系統的架構特性後,下一步是選擇一個**架構風格(Architecture Style)**作為整體骨架。架構風格是經過反覆驗證的「系統頂層結構模板」,每一種風格在不同架構特性上有先天的強弱。選風格的本質,就是把你優先的架構特性,對應到天生擅長那些特性的結構上。
架構風格描述的是系統「整體的形狀」(單體還是分散式、怎麼切分),架構模式(Pattern)則是局部的設計手法。本章只談風格層級的取捨。
兩大陣營#
架構風格大致分為兩個陣營,最根本的分界是部署單元的數量。
flowchart TD
Root[架構風格] --> Mono[單體類<br/>單一部署單元]
Root --> Dist[分散式類<br/>多個部署單元]
Mono --> Layered[分層架構]
Mono --> Pipeline[管道架構]
Mono --> Microkernel[微核心架構]
Dist --> EDA[事件驅動]
Dist --> SBA[空間導向]
Dist --> SOA[服務導向]
Dist --> MS[微服務]
style Mono fill:#e8f5e9
style Dist fill:#e3f2fd單體類(Monolithic)#
所有元件編譯/部署為單一單元。優點是簡單、好測、低延遲;缺點是擴展性、容錯與部署彈性受限。
| 風格 | 結構與意圖 |
|---|---|
| 分層(Layered) | 依技術職責水平切層(表現/業務/持久化/資料),上層只依賴下層 |
| 管道(Pipeline) | 由一連串「過濾器(Filter)」經「管道(Pipe)」串接,做流式轉換 |
| 微核心(Microkernel) | 一個最小核心系統 + 可插拔外掛(Plugin),核心穩定、變動進外掛 |
分散式類(Distributed)#
系統拆成多個獨立部署單元,透過網路通訊。優點是擴展性、容錯、部署彈性;代價是分散式固有的複雜度(網路、一致性、可觀測性)。
| 風格 | 結構與意圖 |
|---|---|
| 事件驅動(Event-Driven) | 元件以非同步事件解耦,靠 Broker/Mediator 串流,高吞吐、高擴展 |
| 空間導向(Space-Based) | 用記憶體資料網格(in-memory grid)取代中央資料庫,解極高並發瓶頸 |
| 服務導向(SOA) | 以企業服務匯流排(ESB)整合粗粒度共享服務,重整合與重用 |
| 微服務(Microservices) | 細粒度、各自獨立部署、各擁資料的服務,極致的演化與部署彈性 |
微服務、服務拆分時機、服務間通訊等屬於分散式架構的深水區,請見微服務專章。本章只把微服務當作「一種風格選項」放進對比,不展開細節。
風格特性評分對比#
下表用相對評分(★ 越多越強)幫助快速比較。沒有「最好」的風格,只有「最配合你優先特性」的風格。
| 風格 | 可部署性 | 可測試性 | 可維護性 | 效能(單請求) | 可擴展性 | 容錯性 | 簡單度/低成本 |
|---|---|---|---|---|---|---|---|
| 分層 | ★ | ★★ | ★★ | ★★ | ★ | ★ | ★★★★★ |
| 管道 | ★ | ★★★ | ★★★ | ★★ | ★ | ★ | ★★★★ |
| 微核心 | ★★ | ★★★ | ★★★ | ★★★ | ★ | ★ | ★★★★ |
| 事件驅動 | ★★★ | ★★ | ★★ | ★★★★★ | ★★★★★ | ★★★★ | ★★ |
| 空間導向 | ★★★ | ★ | ★★ | ★★★★★ | ★★★★★ | ★★★ | ★ |
| SOA | ★ | ★ | ★ | ★★ | ★★★ | ★★★ | ★ |
| 微服務 | ★★★★★ | ★★★★ | ★★★★★ | ★★ | ★★★★★ | ★★★★★ | ★★ |
注意「效能」分兩種:分散式風格的整體吞吐很高(高擴展),但單一請求延遲常因跨網路呼叫而變差。談效能務必先講清楚是哪一種,否則評分會誤導。
風格目錄結構示意#
不同風格在程式碼倉庫中長相截然不同,這也反映了它們的切分維度。
分層架構:依技術職責切分
src/
├── presentation/ # 表現層:Controller、DTO
├── business/ # 業務層:Service、領域邏輯
├── persistence/ # 持久化層:Repository、DAO
└── database/ # 資料層:Entity、Schema特徵:橫向切。一個業務功能的程式碼散落在各層,改一個功能要動四層。
微核心架構:核心 + 外掛
src/
├── core/ # 最小穩定核心:流程編排、外掛註冊
├── contracts/ # 外掛介面契約
└── plugins/
├── tax-us/ # 美國稅務外掛
├── tax-eu/ # 歐盟稅務外掛
└── report-pdf/ # 報表外掛特徵:變動點隔離進外掛,核心幾乎不動。新需求=新外掛。
微服務:依業務能力切分
services/
├── order-service/ # 各自獨立的倉庫/部署單元
│ ├── api/
│ ├── domain/
│ └── db/ # 各擁資料庫
├── payment-service/
└── inventory-service/特徵:縱向切。一個業務能力的程式碼與資料完整內聚在一個服務內。切分依據見服務拆分策略。
選擇決策#
選風格時,三個維度最關鍵:業務變動性、規模/並發、部署獨立性需求。
flowchart TD
Start[選擇架構風格] --> Q1{需要各部分<br/>獨立部署/獨立擴展?}
Q1 -->|否| Q2{邏輯是<br/>線性資料轉換?}
Q1 -->|是| Q4{並發/吞吐<br/>是否極高?}
Q2 -->|是| Pipe[管道架構]
Q2 -->|否| Q3{變動點是否<br/>集中可插拔?}
Q3 -->|是| MK[微核心架構]
Q3 -->|否| Lay[分層架構<br/>最簡單的起點]
Q4 -->|否| Q5{切分依據是<br/>業務能力?}
Q4 -->|是, 讀寫密集| EDA[事件驅動]
Q4 -->|是, 並發瓶頸在DB| SBA[空間導向]
Q5 -->|是, 細粒度| MS[微服務]
Q5 -->|偏整合既有系統| SOA[SOA]
style Lay fill:#e8f5e9
style MS fill:#e3f2fd
style EDA fill:#fff3e0選擇矩陣(依優先特性反查風格):
| 你最在意的 | 偏向選擇 | 理由 |
|---|---|---|
| 簡單、快速上線、團隊小 | 分層 | 起步成本最低,符合合適原則 |
| 變動集中、需可插拔 | 微核心 | 把變化關進外掛,核心穩定 |
| 流式/批次資料處理 | 管道 | 過濾器可組合、可重用 |
| 極高並發、解耦 | 事件驅動 | 非同步削峰、天然擴展 |
| DB 成為並發瓶頸 | 空間導向 | 以記憶體網格繞過中央資料庫 |
| 部署彈性、團隊自治 | 微服務 | 各服務獨立演化,見微服務專章 |
不要因為「微服務很潮」就直接選它。對小團隊與不確定的業務,分層單體幾乎永遠是更好的起點——它最簡單,且保留了日後依演化原則再拆分的空間。
本章小結#
| 主題 | 核心觀點 |
|---|---|
| 兩大陣營 | 以部署單元數量分單體類 / 分散式類 |
| 無銀彈 | 每種風格都是一組架構特性的取捨,沒有最好只有最配 |
| 效能陷阱 | 分散式高吞吐 ≠ 低延遲,單請求常因網路變慢 |
| 選擇三軸 | 業務變動性、規模並發、部署獨立性 |
| 起點建議 | 不確定就從分層單體開始,保留演化空間,需要再拆 |