從宏觀視角到程式碼:使用 C4 模型可視化軟體架構的入門指南
引言
軟體架構文件經常讓人感到壓力山大。開發人員要麼創造出過於複雜、沒人能理解的圖表,要麼完全跳過文件,導致團隊迷失在程式碼的迷宮中。
進入C4 模型——由西蒙·布朗所創建的簡單、層級化的軟體架構可視化方法。可以把它想像成軟體的 Google 地圖:從整體世界觀開始,逐步縮放,直到看到單獨的街道與建築。

本教程將帶你走完 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 建模的關鍵功能:
-
AI 驅動的圖表生成
-
用簡單的英文描述您的系統
-
AI 建議適合的 C4 層級圖表
-
自動生成初始結構
-
-
智慧佈局引擎
-
元件的自動排列
-
智慧連接器路由
-
圖表之間的一致性樣式
-
-
程式碼工程
-
反向工程程式碼為圖表(第 4 層)
-
正向工程圖表為程式碼骨架
-
保持圖表與程式碼庫同步
-
-
協作功能
-
即時團隊協作
-
版本控制整合
-
匯出至多種格式(PNG、PDF、SVG)
-
-
C4 模型範本
-
每個 C4 層級的預建範本
-
產業特定範例
-
內建最佳實務指南
-
開始使用 Visual Paradigm:
-
下載社群版(免費)或企業版
-
安裝從市場中安裝 C4 模型外掛程式
-
建立使用向導建立您的第一張圖表
-
使用 AI 助手點擊魔法棒圖示
-
匯出並與您的團隊分享
🚀 初學者最佳實務
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層圖示
-
將其轉換為C4-PlantUML或Visual Paradigm
-
與非技術利益相關者分享,以取得反饋
-
根據需要逐步添加第二級細節
祝你繪圖愉快!🎨














