☕ NEW! 完成新手任務即可參加抽獎!LINE 星巴克禮券等你拿,名額有限!        🎉 推廣活動:邀請好友註冊 DevLearn,累積推薦抽 LINE 星巴克禮券! 活動詳情 →        🔥 活動期間 2026/4/1 - 5/31 |已有 0 人參加       
microservices 初學

🏗️ 微服務架構入門:從單體到微服務

📌 什麼是微服務?

微服務(Microservices)是一種軟體架構風格,將應用程式拆分成一組小型、獨立的服務,每個服務圍繞特定的業務功能建構,可以獨立開發、部署和擴展。

核心概念: 每個微服務就像一個獨立的小團隊,負責一件事,做好做滿。


📌 單體架構 vs 微服務架構

單體架構 (Monolithic Architecture)

所有功能都打包在一個應用程式中:

┌─────────────────────────────────┐
│         單體應用程式              │
│  ┌─────┐ ┌─────┐ ┌─────┐       │
│  │用戶  │ │訂單  │ │支付  │       │
│  │管理  │ │處理  │ │系統  │       │
│  └──┬──┘ └──┬──┘ └──┬──┘       │
│     └───────┼───────┘           │
│          共用資料庫               │
│       ┌──────────┐              │
│       │ Database │              │
│       └──────────┘              │
└─────────────────────────────────┘

微服務架構 (Microservices Architecture)

每個服務是獨立的應用程式,有自己的資料庫:

┌──────────┐  ┌──────────┐  ┌──────────┐
│ 用戶服務  │  │ 訂單服務  │  │ 支付服務  │
│          │  │          │  │          │
│ ┌──────┐ │  │ ┌──────┐ │  │ ┌──────┐ │
│ │ DB1  │ │  │ │ DB2  │ │  │ │ DB3  │ │
│ └──────┘ │  │ └──────┘ │  │ └──────┘ │
└──────────┘  └──────────┘  └──────────┘
     ↕              ↕              ↕
  ═══════════ API Gateway ═══════════

📌 為什麼要用微服務?優缺點分析

✅ 優點

優點 說明
獨立部署 修改訂單服務不需要重新部署整個系統
技術多樣性 用戶服務用 C#、推薦服務用 Python,各取所長
獨立擴展 促銷時只需擴展訂單服務,不用擴展整個系統
故障隔離 支付服務掛了,用戶瀏覽商品不受影響
團隊自治 每個團隊負責自己的服務,降低協調成本

❌ 缺點

缺點 說明
複雜度高 分散式系統帶來網路、一致性等挑戰
維運成本 需要監控、日誌、追蹤等基礎設施
資料一致性 跨服務交易很困難(不能用單一 Transaction)
團隊要求 需要 DevOps 文化和自動化能力

📌 微服務的核心原則

1. 單一職責原則 (Single Responsibility)

// ✅ 好的拆分:每個服務只負責一個業務領域
public class OrderService     // 只處理訂單相關邏輯
public class InventoryService // 只處理庫存相關邏輯
public class PaymentService   // 只處理支付相關邏輯

// ❌ 不好的拆分:一個服務做太多事
public class EverythingService // 訂單 + 庫存 + 支付 + 用戶 + ...

2. 獨立部署 (Independent Deployment)

每個服務都有自己的:

  • 程式碼倉庫(或 monorepo 中的獨立專案)
  • CI/CD Pipeline
  • 部署環境

3. 去中心化治理 (Decentralized Governance)

// 每個服務可以選擇最適合的技術棧
// 訂單服務:ASP.NET Core + SQL Server
builder.Services.AddDbContext<OrderDbContext>(opt =>
    opt.UseSqlServer(connectionString));

// 快取服務:可以用不同的資料庫
// 例如 Redis、MongoDB 等

📌 真實世界案例

Netflix

  • 從單體 Java 應用遷移到 700+ 微服務
  • 每天處理超過 20 億 API 請求
  • 使用自研的 Eureka(服務發現)、Zuul(API Gateway)

Amazon

  • 從龐大的單體架構拆分成微服務
  • "兩個披薩團隊"原則:每個服務團隊不超過兩個披薩能餵飽的人數
  • 這直接催生了 AWS 雲端服務

Uber

  • 原本單體架構導致部署時間長達數小時
  • 拆分為微服務後,各團隊可以獨立且頻繁地部署

📌 什麼時候不該用微服務?

重要提醒: 微服務不是銀彈!

❌ 不適合微服務的情境:
├── 小型專案或 MVP(單體就夠了)
├── 團隊人數少於 5 人
├── 業務邊界不明確(還在探索階段)
├── 沒有 DevOps 自動化能力
└── 對分散式系統缺乏經驗

建議的演進路線

// 階段 1:先用模組化的單體架構
// 將程式碼按業務邊界分模組,但部署為單一應用
public class ModularMonolith
{
    // 模組 A:訂單
    // 模組 B:庫存
    // 模組 C:支付
    // 各模組透過介面溝通,為未來拆分做準備
}

// 階段 2:識別出需要獨立擴展的模組,逐步拆出
// 例如:訂單模組流量特別大 → 拆成獨立服務

📌 .NET 微服務生態系工具概覽

工具 / 框架 用途
ASP.NET Core 建立 RESTful API / gRPC 服務
YARP / Ocelot API Gateway 反向代理
MassTransit 訊息匯流排(RabbitMQ / Azure Service Bus)
Polly 韌性與容錯(重試、斷路器)
OpenTelemetry 分散式追蹤與可觀測性
Docker 容器化打包
Kubernetes 容器編排與自動擴展
Dapr 分散式應用執行環境
HealthChecks 服務健康狀態監控

📌 本系列學習路線圖

1. 微服務入門(本章)
2. DDD 與邊界劃分
3. 建立微服務 API
4. 服務間通訊
5. API Gateway
6. Docker 容器化
7. 韌性模式(Polly)
8. 資料管理(Saga)
9. 可觀測性
10. Kubernetes 部署

下一章: 我們將深入 Domain-Driven Design(DDD),學習如何正確劃分微服務的邊界。

💡 大家的想法 · 0

載入中...
💬 即時聊天室 🟢 0 人在線
😀 😎 🤓 💻 🎮 🎸 🔥
➕ 新問題
📋 我的工單
💬 LINE 社群
🔒
需要註冊才能使用此功能
註冊帳號即可解鎖測驗、遊戲、簽到、筆記下載等所有功能,完全免費!
免費註冊