de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

引言

軟體架構文件經常讓人感到壓力山大。開發人員要麼創造出過於複雜、沒人能理解的圖表,要麼完全跳過文件,導致團隊迷失在程式碼的迷宮中。

進入C4 模型——由西蒙·布朗所創建的簡單、層級化的軟體架構可視化方法。可以把它想像成軟體的 Google 地圖:從整體世界觀開始,逐步縮放,直到看到單獨的街道與建築。

VPasCode Editor: C4 Model - Hierarchical Drill-Down Software Architecture Framework

本教程將帶你走完 C4 模型的四個層級,並提供實用範例、PlantUML 程式碼片段,以及使用 Visual Paradigm 等現代工具建立真正能幫助團隊的專業架構圖的指導。


🎯 透過實際範例理解 C4 模型

讓我們為以下內容建立文件「PayQuick」——一個現代化的線上支付平台,讓使用者可以匯款、繳費與管理卡片。我們將為每個 C4 層級建立圖表。


🗺️ 第一層:系統環境圖

它所呈現的內容

系統在其環境中的 30,000 英尺高空視角。

PayQuick 範例

參與者:

  • 個人客戶

  • 商家

  • 銀行系統

  • 簡訊網關

關係:

  • 客戶匯款

  • 商家接收付款

  • 系統與外部銀行整合

  • 系統發送簡訊通知

C4-PlantUML 程式碼

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

title PayQuick - 系統環境圖

Person(customer, "個人客戶", "使用應用程式匯款與繳費")
Person(merchant, "商家", "接收客戶付款")

System_Boundary(payquick, "PayQuick 平台") {
    System(payquick_system, "PayQuick", "讓客戶進行付款與轉帳")
}

System_Ext(bank_system, "銀行網路", "處理跨行轉帳", $tags="外部")
System_Ext(sms_gateway, "Twilio 簡訊", "發送交易通知", $tags="外部")
System_Ext(email_service, "SendGrid", "發送電子郵件收據", $tags="外部")

Rel(customer, payquick_system, "匯款、繳費、檢視交易")
Rel(merchant, payquick_system, "接收付款、發放退款")
Rel(payquick_system, bank_system, "透過", "API")
Rel(payquick_system, sms_gateway, "透過", "HTTPS")
Rel(payquick_system, email_service, "透過", "SMTP")

LAYOUT_WITH_LEGEND()
@enduml

Visual Paradigm 小技巧

在 Visual Paradigm 中,使用 AI 助手 透過以自然語言描述您的系統來生成初始的系統上下文圖: 「為一個具有客戶、商家與銀行整合功能的支付平台建立系統上下文圖。」


📦 第二層:容器圖

它所顯示的內容

主要的技術選擇及其互動方式。

PayQuick 範例

容器:

  • 行動應用程式(iOS/Android)

  • 網頁應用程式(React)

  • API 應用程式(Spring Boot)

  • 資料庫(PostgreSQL)

  • 訊息佇列(RabbitMQ)

  • 快取(Redis)

C4-PlantUML 程式碼

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Container.puml

title PayQuick - 容器圖

Person(customer, "客戶", "使用行動應用程式或網頁介面")
Person(merchant, "商家", "使用網頁儀表板")

System_Boundary(payquick, "PayQuick 平台") {
    Container(mobile_app, "行動應用程式", "React Native, TypeScript", "為客戶提供使用者介面")
    Container(web_app, "網頁應用程式", "React, TypeScript", "提供管理員與商家儀表板")
    
    Container_Boundary(api, "API 應用程式") {
        Container(api_gateway, "API 網關", "Node.js, Express", "處理路由、驗證與頻率限制")
        Container(payment_service, "支付服務", "Spring Boot, Java", "處理支付與轉帳")
        Container(notification_service, "通知服務", "Python, FastAPI", "發送簡訊與電子郵件通知")
    }
    
    ContainerDb(database, "資料庫", "PostgreSQL", "儲存使用者帳戶、交易與餘額")
    ContainerDb(cache, "快取", "Redis", "儲存會話資料與經常存取的記錄")
    ContainerQueue(queue, "訊息佇列", "RabbitMQ", "處理非同步通知處理")
}

System_Ext(bank_api, "銀行 API", "外部銀行整合")
System_Ext(sms_provider, "Twilio 簡訊 API")

Rel(customer, mobile_app, "使用", "HTTPS")
Rel(merchant, web_app, "使用", "HTTPS")
Rel(mobile_app, api_gateway, "呼叫 API", "HTTPS/JSON")
Rel(web_app, api_gateway, "呼叫 API", "HTTPS/JSON")
Rel(api_gateway, payment_service, "將請求路由至", "gRPC")
Rel(api_gateway, notification_service, "將請求路由至", "gRPC")
Rel(payment_service, database, "讀取/寫入資料至", "JDBC")
Rel(payment_service, cache, "將頻繁資料快取至", "Redis 協定")
Rel(notification_service, queue, "發布事件至", "AMQP")
Rel(notification_service, sms_provider, "透過發送簡訊", "REST API")
Rel(payment_service, bank_api, "透過處理轉帳", "HTTPS")
@enduml

Visual Paradigm AI 功能

使用 智慧連接器 搭配 AI 建議,可自動偵測並根據容器的類型與責任建議其間的關係。


第三層:組件圖

它所顯示的內容

單一容器的內部結構。

PayQuick 範例

讓我們深入探討 支付服務容器以查看其組件:

組件:

  • 支付控制器

  • 交易管理器

  • 欺詐檢測服務

  • 餘額計算器

  • 儲存庫層

C4-PlantUML 程式碼

@startuml
!include https://raw.githubusercontent.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml

title PayQuick - 支付服務組件圖

!define C4ShapeInRow 4
!define C4BoundaryInRow 1

Container_Boundary(payment_service, "支付服務") {
    Component(payment_controller, "支付控制器", "Spring REST 控制器", "處理傳入的支付請求")
    Component(transaction_manager, "交易管理器", "Spring 服務", "協調支付工作流程")
    Component(fraud_detector, "欺詐檢測服務", "Spring 服務", "驗證交易是否為欺詐")
    Component(balance_calculator, "餘額計算器", "Spring 服務", "計算並更新帳戶餘額")
    Component(validation_service, "驗證服務", "Spring 服務", "驗證支付資料與業務規則")
    
    ComponentDb(transaction_repo, "交易儲存庫", "Spring Data JPA", "儲存交易記錄")
    ComponentDb(account_repo, "帳戶儲存庫", "Spring Data JPA", "管理帳戶資料")
    ComponentDb(fraud_repo, "欺詐規則儲存庫", "Spring Data JPA", "儲存欺詐檢測規則")
    
    Component(notification_client, "通知客戶端", "Feign 客戶端", "呼叫通知服務")
    Component(bank_client, "銀行客戶端", "Feign 客戶端", "整合外部銀行 API")
}

Rel(payment_controller, transaction_manager, "將支付請求轉發至")
Rel(transaction_manager, fraud_detector, "使用...驗證交易")
Rel(transaction_manager, validation_service, "使用...驗證資料")
Rel(transaction_manager, balance_calculator, "透過...更新餘額")
Rel(transaction_manager, transaction_repo, "將交易儲存至")
Rel(balance_calculator, account_repo, "讀取/寫入帳戶資料至")
Rel(fraud_detector, fraud_repo, "根據規則進行檢查")
Rel(transaction_manager, notification_client, "透過...發送通知")
Rel(transaction_manager, bank_client, "透過...處理外部轉帳")

@enduml

Visual Paradigm 小技巧

使用組件圖範本在 Visual Paradigm 中,可快速建立組件結構。AI 可根據您的容器類型建議常見模式,例如儲存庫、服務層和控制器。


💻 第 4 層:程式碼圖(可選)

顯示內容

實際的類別、介面和方法。

範例:欺詐檢測服務類別

@startuml
title 欺詐檢測服務 - 類別圖

class 欺詐檢測服務 {
    - 欺詐規則儲存庫 fraudRepo
    - 交易儲存庫 txnRepo
    + checkFraud(txn: 交易): 欺詐結果
    - evaluateRules(txn: 交易): List<規則>
    - calculateRiskScore(txn: 交易): Double
    - isVelocityExceeded(userId: String): Boolean
}

class 欺詐結果 {
    + isBlocked: boolean
    + riskScore: double
    + blockedRules: List<String>
    + getRiskLevel(): 風險等級
}

class 欺詐規則 {
    + id: Long
    + ruleName: String
    + threshold: Double
    + isEnabled: boolean
    + evaluate(txn: 交易): boolean
}

class 交易 {
    + id: String
    + amount: BigDecimal
    + userId: String
    + timestamp: DateTime
    + merchantId: String
}

欺詐檢測服務 --> 欺詐結果 : 回傳
欺詐檢測服務 --> 欺詐規則 : 使用
欺詐檢測服務 --> 交易 : 驗證
欺詐結果 ..> 欺詐規則 : 包含

@enduml

注意:第 4 層圖表最佳由程式碼自動產生,可使用以下工具:

  • Visual Paradigm 的程式碼工程功能功能

  • IntelliJ IDEA 內建的圖表產生器

  • Swagger/OpenAPI 用於 API 文件


🛠️ 推薦工具:Visual Paradigm + AI 功能

為什麼選擇 Visual Paradigm?

Visual Paradigm 是一款全面的建模工具,原生支援 C4 圖表,並提供強大的 AI 協助功能:

C4 建模的關鍵功能:

  1. AI 驅動的圖表生成

    • 用簡單的英文描述您的系統

    • AI 建議適合的 C4 層級圖表

    • 自動生成初始結構

  2. 智慧佈局引擎

    • 元件的自動排列

    • 智慧連接器路由

    • 圖表之間的一致性樣式

  3. 程式碼工程

    • 反向工程程式碼為圖表(第 4 層)

    • 正向工程圖表為程式碼骨架

    • 保持圖表與程式碼庫同步

  4. 協作功能

    • 即時團隊協作

    • 版本控制整合

    • 匯出至多種格式(PNG、PDF、SVG)

  5. C4 模型範本

    • 每個 C4 層級的預建範本

    • 產業特定範例

    • 內建最佳實務指南

開始使用 Visual Paradigm:

  1. 下載社群版(免費)或企業版

  2. 安裝從市場中安裝 C4 模型外掛程式

  3. 建立使用向導建立您的第一張圖表

  4. 使用 AI 助手點擊魔法棒圖示

  5. 匯出並與您的團隊分享


🚀 初學者最佳實務

1. 從簡單開始,再逐步迭代

  • 即使覺得太基礎,也從第 1 級開始

  • 在深入之前,先取得利害關係人的認同

  • 根據需求逐步增加細節

2. 保持圖表的即時性

  • 每次主要發行時,更新第 1-2 級圖表

  • 在可能的情況下,自動化第 4 級的產生

  • 存檔過時的圖表,不要刪除它們

3. 清楚命名事物

使用格式:名稱 [技術] – 描述

✅ 優良範例:付款服務 [Spring Boot] - 處理付款交易
❌ 不良範例:PaymentService那個付款東西

4. 為您的受眾選擇合適的層級

受眾 建議層級
高階主管/客戶 僅限第1層
產品經理 第1至第2層
DevOps/基礎架構 第2至第3層
開發人員 第2至第4層

5. 使用一致的視覺語言

  • 遵循C4色彩規範

  • 為相似元素使用一致的形狀

  • 維持關係類型的箭頭樣式


📊 完整範例:跨層級映射使用者旅程

讓我們追蹤一個「匯款」功能在所有C4層級中的表現:

第1層(背景):客戶 → PayQuick → 銀行網路

第2層(容器):行動應用程式 → API閘道 → 支付服務 → 資料庫 → 銀行API

第3層(元件):支付控制器 → 交易管理器 → 欺詐偵測 → 餘額計算器 → 交易儲存庫

第4層(程式碼): PaymentController.transfer() → TransactionManager.process() → FraudDetection.checkFraud()


這種分層方法有助於不同團隊成員在適當的細節層次上理解系統。


🎓 結論

C4模型將軟體架構從令人畏懼的抽象概念轉化為實用且可導航的地圖。透過從整體視角出發,逐步深入細節,您將建立出能服務從CTO到初級開發人員所有人的文件。

關鍵要點:

✅ 第1層 奠定基礎——即使面對技術性受眾也絕不可跳過
✅ 第2層 揭示您的技術堆疊與部署策略
✅ 第3層 展示您如何在服務內組織程式碼
✅ 第4層 可選——盡可能自動化
✅ Visual Paradigm 以及具有AI功能的類似工具,可使圖示創建速度提升50-70%
✅ 活文件 比完美的文件更好——應迭代更新

請記住:目標並非為了創造漂亮的圖示而創造。而是為了促進溝通、減少入職時間,並做出更佳的架構決策。從今天開始,先製作一個簡單的系統上下文圖示,並觀察團隊的理解力與生產力不斷提升。

您的下一步:

  1. 挑選您目前的一個專案

  2. 在紙上或白板上草擬一張第1層圖示

  3. 將其轉換為C4-PlantUML或Visual Paradigm

  4. 與非技術利益相關者分享,以取得反饋

  5. 根據需要逐步添加第二級細節

祝你繪圖愉快!🎨