本章節涵蓋現代分散式系統的架構模式,包括邊車模式、服務網格、API Gateway 以及部署升級策略。
邊車模式 (Sidecar Pattern)#
邊車模式的靈感來自邊三輪摩托車,通過給主服務加上一個「邊車」來擴展功能,實現控制面與資料面的分離。
核心概念#
flowchart TB
subgraph Node["計算節點"]
direction LR
App["應用服務<br/>(業務邏輯)"] <--> SC["Sidecar<br/>(控制邏輯)"]
end
SC <--> Ext["對外的進出通訊"]
style Node fill:#e3f2fd
style SC fill:#fff9c4Sidecar 負責的控制面功能:
- 監控、日誌記錄
- 限流、熔斷
- 服務註冊與發現
- 協定適配轉換
- 鏈路追蹤
Sidecar 和應用程式必須同生共死——一起創建、一起停用。這是邊車模式的基本要求。
兩種實現方式的比較#
| 方式 | 優點 | 缺點 |
|---|---|---|
| SDK/Library | 效能好、資源利用率高 | 侵入性強、語言限制、升級需重新發布 |
| Sidecar | 無侵入、語言無關、獨立升級 | 增加延遲、部署複雜度高 |
Sidecar 的應用場景#
- 老系統改造:無需修改原有程式碼即可加入分散式能力
- 多語言系統:統一管理不同語言編寫的服務
- 控制邏輯標準化:將控制面功能統一管理
設計要點#
Sidecar 設計的關鍵考量
程序間通訊
- 使用網路遠程呼叫(127.0.0.1 上通訊,開銷不明顯)
- 避免使用信號或共享記憶體等侵入式方式
協定設計
- 內部協定:靠近和兼容本地服務的協定
- 外部協定:使用開放標準的協定
- 避免使用與語言相關的協定
功能邊界
- Sidecar 只負責控制面的東西
- 不要把業務邏輯設計到 Sidecar 中
上下文傳遞
- 允許應用服務和 Sidecar 交換上下文資訊
- 例如:重試次數、限流狀態、遠程服務可用性
使用 Docker 容器技術可以大幅簡化 Sidecar 的打包、部署和管理。
服務網格 (Service Mesh)#
當 Sidecar 在架構中越來越多時,需要對其進行統一管理。Service Mesh 就是 Sidecar 的集群化管理。
演進路徑#
直接通訊 → 網路層分離 → 應用層流控 → TCP/IP 標準化
→ 彈力設計(限流、熔斷) → SDK/Framework → Sidecar → Service MeshService Mesh 的特點#
- 是一個基礎設施層
- 是一個輕量級的服務通訊網路代理
- 對應用服務透明無侵入
- 用於解耦控制面和資料面
Service Mesh 在分散式系統中的地位,類似於 TCP 在 OSI 七層模型中的地位——它把底層的流量控制(丟包重傳、擁塞控制)都管了,讓應用層只需關心業務邏輯。
Service Mesh 架構#
flowchart TB
subgraph CP["控制面 (Control Plane)"]
Pilot["Pilot<br/>(規則下發)"]
Mixer["Mixer<br/>(資料收集)"]
Auth["Auth<br/>(身份認證)"]
end
subgraph DP["資料面 (Data Plane)"]
subgraph P1[" "]
SC1["Sidecar<br/>(Envoy)"]
S1["服務 A"]
end
subgraph P2[" "]
SC2["Sidecar<br/>(Envoy)"]
S2["服務 B"]
end
subgraph P3[" "]
SC3["Sidecar<br/>(Envoy)"]
S3["服務 C"]
end
end
CP --> SC1
CP --> SC2
CP --> SC3
SC1 --- S1
SC2 --- S2
SC3 --- S3
style CP fill:#e3f2fd
style DP fill:#fff3e0設計重點#
Service Mesh 的 Sidecar 如果出問題,會導致整個架構出現致命問題。因此必須保證高可用:
- 本機 Sidecar 之外,部署集中式的 Sidecar 作為備援
- 結合 Gateway 模式,Sidecar 粒度可粗可細
API Gateway 模式#
Gateway 是進入系統的唯一入口,類似於設計模式中的 Facade 模式。
多層 Gateway 架構#
flowchart TD
GW["總 Gateway<br/>(接入層)"]
GW --> GA["Gateway A<br/>(用戶系統)"]
GW --> GB["Gateway B<br/>(訂單系統)"]
GW --> GC["Gateway C<br/>(商品系統)"]
GA --> SA["服務群組"]
GB --> SB["服務群組"]
GC --> SC["服務群組"]
style GW fill:#ffccbc
style GA fill:#fff9c4
style GB fill:#fff9c4
style GC fill:#fff9c4Gateway 核心功能#
| 功能 | 說明 |
|---|---|
| 請求路由 | 根據請求資訊路由到正確的後端服務 |
| 服務註冊 | 後端服務註冊 API 介面(URI、方法、標頭) |
| 負載均衡 | Round Robin、加權、Session 粘連 |
| 彈力設計 | 限流、熔斷、重試、監控 |
| 安全防護 | SSL 管理、身份驗證、惡意攻擊防範 |
進階功能#
Gateway 的進階應用
灰度發布
- 對相同服務的不同版本進行導流
- 收集相關資料,用於軟體品質提升和產品試錯
API 聚合
- 將多個後端請求聚合成一個請求
- 減少用戶端與後端的通訊次數
- 可並行請求多個後端服務
API 編排
- 定義業務流程中的 API 呼叫順序
- 使用 DSL 或類似 AWS Lambda 的方式串聯 API
Gateway vs Sidecar vs Service Mesh#
| 模式 | 特點 | 適用場景 |
|---|---|---|
| Sidecar | 每個服務實體一個 | 改造已有服務 |
| Service Mesh | Sidecar + 中央控制器 | 完整的服務治理 |
| Gateway | 集中式、粒度可調 | 簡化運維、API 管理 |
Gateway 設計要點#
高效能
- 使用高效能語言(Go、Java、C++)
- 非同步非阻塞 I/O(epoll、Netty、goroutine)
高可用
- 集群化部署
- 服務化(執行時修改組態的 Admin API)
- 優雅重啟(主程序分發請求,老程序處理完後退出)
架構原則
- 業務松耦合、協定緊耦合
- Gateway 只處理協定頭,不處理協定體
- Gateway 應靠近後端服務,使用同一內網
部署升級策略#
在分散式系統中,一個服務有多個實體,部署和升級需要特別的策略。
停機部署 (Recreate)#
時間線:
├── 停止所有 V1 實體
├── 部署 V2
└── 啟動所有 V2 實體適用場景:新舊版本完全不兼容(如資料庫結構變更)
優點:不會有新舊版本同時在線的問題 缺點:需要停機,影響用戶
藍綠部署 (Blue/Green)#
flowchart TD
LB["負載均衡"]
LB -->|"100% 流量"| Blue["藍環境<br/>(V1)"]
LB -.->|"切換流量"| Green["綠環境<br/>(V2)"]
style Blue fill:#bbdefb
style Green fill:#c8e6c9優點:無停機、無新舊版本混用 缺點:需要雙倍資源(雲端時代問題不大)
滾動部署 (Rolling Update)#
時間線:
├── 部署 V2 實體 1,加入負載均衡
├── 移除 V1 實體 1
├── 部署 V2 實體 2,加入負載均衡
├── 移除 V1 實體 2
└── ... 重複直到全部更新優點:對有狀態服務友好,狀態可逐步重建 缺點:
- 發布過程中新舊版本同時在線
- 回滾困難
- 需要處理新舊版本的兼容性
灰度部署 (Canary)#
flowchart TD
LB["負載均衡"]
LB -->|"90%"| V1["V1<br/>(穩定)"]
LB -->|"10%"| V2["V2<br/>(金絲雀)"]
style V1 fill:#c8e6c9
style V2 fill:#fff9c4「金絲雀」名稱來源:17 世紀英國礦工帶金絲雀下礦井檢測瓦斯,金絲雀對有毒氣體極為敏感。
流程:
- 部署新版本,導入小部分流量(如 10%)
- 監控是否有問題
- 逐步增加流量直到 100%
AB 測試#
| 比較項 | 藍綠/灰度部署 | AB 測試 |
|---|---|---|
| 目的 | 驗證新版本的品質 | 驗證新版本的功能 |
| 關注點 | 有沒有 bug | 用戶體驗是否更好 |
| 決策依據 | 錯誤率、效能指標 | 用戶行為資料 |
用戶分群方式:
- 瀏覽器 Cookie
- 查詢參數
- 地理位置
- 技術特徵(瀏覽器版本、螢幕尺寸、作業系統)
- 用戶端語言
部署策略選擇#
開發/測試環境 → 停機或滾動部署(快速、乾淨)
生產環境:
├── 需要零停機 → 藍綠部署
├── 對新版本品質沒信心 → 灰度部署
├── 對新版本功能沒信心 → AB 測試
└── 新舊版本不兼容 → 停機部署架構模式總結#
┌────────────────────────────────────────────────────┐
│ 分散式架構模式 │
├────────────────────────────────────────────────────┤
│ 流量管理 │
│ ├── Sidecar:每個服務實體的代理 │
│ ├── Service Mesh:Sidecar 集群 + 控制面 │
│ └── API Gateway:集中式入口 │
├────────────────────────────────────────────────────┤
│ 部署策略 │
│ ├── 停機部署:簡單但有停機時間 │
│ ├── 藍綠部署:無停機,需雙倍資源 │
│ ├── 滾動部署:逐步替換,適合有狀態服務 │
│ ├── 灰度部署:漸進式發布,降低風險 │
│ └── AB 測試:功能驗證,資料驅動決策 │
└────────────────────────────────────────────────────┘架構模式的選擇沒有標準答案,需要根據以下因素綜合考量:
- 團隊規模和技術能力
- 系統複雜度
- 可用性要求
- 運維成本預算
- 現有基礎設施