Mô hình C4: Trực quan hóa kiến trúc phần mềm như ‘Google Maps cho mã nguồn’

“Mô hình C4 giúp các đội ngũ truyền đạt kiến trúc phần mềm một cách rõ ràng, nhất quán và ở mức độ chi tiết phù hợp.”
— Simon Brown

Mô hình C4 Model (Phạm vi, Thùng chứa, Thành phần, Mã nguồn) là một khung phân cấp, có thể thu phóng để tài liệu hóa kiến trúc phần mềm. Nó được thiết kế để thân thiện với nhà phát triểnphù hợp với Agile, và dễ đọc — vượt ra khỏi những sơ đồ rối mắt, tĩnh tại “hộp và đường kẻ”.

Nó giúp các đội ngũ:

  • Truyền đạt kiến trúc một cách hiệu quả với cả các bên liên quan kỹ thuật và phi kỹ thuật.

  • Duy trì tài liệu hóa nhất quán, được kiểm soát phiên bản.

  • Tập trung vào điều quan trọng ở mỗi cấp độ trừu tượng.


🔍 Các trừu tượng cốt lõi của Mô hình C4

The Ultimate Guide to C4 Model Visualization with Visual Paradigm's AI Tools - ArchiMetric

Cấp độ Khái niệm Mục đích
Cấp độ 1: Phạm vi Hệ thống và con người Ai sử dụng hệ thống? Nó tương tác với môi trường như thế nào?
Cấp độ 2: Thùng chứa Đơn vị triển khai Các thành phần kỹ thuật cấp cao là gì (ứng dụng, cơ sở dữ liệu, API)?
Cấp độ 3: Thành phần Nhóm logic Chức năng được cấu trúc như thế nào bên trong một container?
Cấp độ 4: Mã nguồn (Tùy chọn) Lớp, giao diện, phương thức Chi tiết triển khai — thường được tạo tự động bởi IDEs.

✅ Nguyên tắc chínhPhóng to chỉ khi cần thiết.Bắt đầu rộng, sau đó đi sâu.


🧩 Các thành phần chính và mối quan hệ

Thành phần Mô tả Ví dụ
Người Người thực hiện hoặc người dùng Khách hàngQuản trị viênAPI bên thứ ba
Hệ thống phần mềm Một hệ thống mang lại giá trị Hệ thống ngân hàng trực tuyến
Container Đơn vị triển khai (chạy hoặc triển khai được) Ứng dụng web, Microservice, Cơ sở dữ liệu, Hàm không máy chủ
Thành phần Nhóm logic các chức năng liên quan Module xác thựcBộ xử lý thanh toánLớp giao diện Mainframe
Các mối quan hệ Các kết nối bằng ngôn ngữ đơn giản giữa các thành phần "Sử dụng""Gọi""Đọc/Viết""Phụ thuộc vào"

💬 Sử dụng ngôn ngữ tự nhiên cho các mối quan hệ. Tránh dùng các thuật ngữ mơ hồ như “kết nối với”.


📊 Các cấp độ Mô hình C4 với các ví dụ PlantUML

📌 Tất cả các ví dụ sử dụng thư viện C4-PlantUML để đảm bảo tính nhất quán và tự động hóa.


1. Sơ đồ bối cảnh hệ thống (Cấp độ 1)

Ai sử dụng hệ thống? Hệ thống bên ngoài nào nó tương tác với?

🎯 Đối tượng mục tiêu: Các bên liên quan không chuyên, người sở hữu sản phẩm, cấp lãnh đạo.

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Context.puml
LAYOUT_WITH_LEGEND()
title Sơ đồ bối cảnh hệ thống cho Ngân hàng trực tuyến

Person(customer, "Khách hàng", "Một khách hàng cá nhân ngân hàng")
System(banking_system, "Hệ thống Ngân hàng Trực tuyến", "Cho phép khách hàng xem tài khoản và thực hiện thanh toán")
System_Ext(mainframe, "Hệ thống Ngân hàng Mainframe", "Lưu trữ tất cả dữ liệu ngân hàng cốt lõi")

Rel(customer, banking_system, "Sử dụng")
Rel_R(banking_system, mainframe, "Lấy thông tin tài khoản từ")
@enduml

✅ Tập trung vào: Phạm vi và ranh giới của hệ thống.


2. Sơ đồ Container (Mức 2)

Các thành phần kỹ thuật chính là gì và chúng sử dụng công nghệ nào?

🎯 Đối tượng người xem: Kiến trúc sư, nhà phát triển, kỹ sư DevOps.

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

Person(customer, "Khách hàng", "Một khách hàng ngân hàng cá nhân")
System_Boundary(c1, "Hệ thống Ngân hàng Trực tuyến") {
    Container(web_app, "Ứng dụng Web", "Java, Spring MVC", "Cung cấp nội dung cho người dùng")
    Container(api_app, "Ứng dụng API", "Java, Spring Boot", "Cung cấp chức năng thông qua JSON/HTTPS")
    ContainerDb(db, "Cơ sở dữ liệu", "Cơ sở dữ liệu quan hệ", "Lưu trữ dữ liệu người dùng")
}

System_Ext(mainframe, "Hệ thống Ngân hàng Mainframe", "Lưu trữ tất cả dữ liệu ngân hàng cốt lõi")

Rel(customer, web_app, "Sử dụng", "HTTPS")
Rel(web_app, api_app, "Gọi", "JSON/HTTPS")
Rel(api_app, db, "Đọc/Viết", "JDBC")
Rel(api_app, mainframe, "Sử dụng", "XML/HTTPS")
@enduml

✅ Tập trung vào: Lựa chọn công nghệgiới hạn triển khailuồng dữ liệu.


3. Sơ đồ Thành phần (Mức 3)

API Application được cấu trúc nội bộ như thế nào?

🎯 Đối tượng người xem: Nhà phát triển, trưởng nhóm kỹ thuật, trưởng nhóm.

@startuml
!include https://static.visual-paradigm.com/plantuml-stdlib/C4-PlantUML/master/C4_Component.puml
LAYOUT_WITH_LEGEND()
title Sơ đồ Thành phần cho Ứng dụng API trong Ngân hàng Trực tuyến

Container(api_app, "Ứng dụng API", "Java, Spring Boot")
ContainerDb(db, "Cơ sở dữ liệu", "Cơ sở dữ liệu quan hệ")
System_Ext(mainframe, "Hệ thống Ngân hàng Mainframe")

Container_Boundary(api_boundary, "Ứng dụng API") {
    Component(sign_in, "Bộ điều khiển Đăng nhập", "Bộ điều khiển MVC", "Cho phép người dùng đăng nhập")
    Component(security, "Thành phần Bảo mật", "Spring Security", "Xử lý xác thực")
    Component(mainframe_facade, "Bộ giao diện Mainframe", "DAO", "Giao tiếp với Mainframe")

    Rel(sign_in, security, "Sử dụng")
    Rel(security, db, "Đọc/Viết")
    Rel(sign_in, mainframe_facade, "Sử dụng")
    Rel(mainframe_facade, mainframe, "Sử dụng")
}
@enduml

✅ Tập trung vào: Cấu trúc nội bộtrách nhiệmphụ thuộc.


4. Sơ đồ mã nguồn (Mức 4 – Tùy chọn)

Chi tiết triển khai: lớp, giao diện, phương thức.

🎯 Đối tượng người xem: Nhà phát triển, người kiểm tra mã nguồn.

⚠️ Không khuyến khích vẽ thủ công — tốt nhất là tạo tự động thông qua IDEs (ví dụ: IntelliJ, VS Code) bằng công cụ vẽ sơ đồ tự động.

Ví dụ (đơn giản hóa):

@startuml
class SignInController {
  +signIn()
  +validateCredentials()
}

class SecurityComponent {
  +authenticate()
  +generateToken()
}

class MainframeFacade {
  +fetchAccountData()
  +sendTransaction()
}

SignInController --> SecurityComponent : Sử dụng
SecurityComponent --> Database : Đọc/Viết
MainframeFacade --> MainframeAPI : Sử dụng
@enduml

✅ Thực hành tốt nhất: Tự động hóa mức độ này bằng các công cụ như PlantUML + các tiện ích mở rộng IDE.


✅ Thực hành tốt nhất và Nguyên tắc chính

Nguyên tắc Tại sao điều đó quan trọng
Tinh chỉnh từng bước Bắt đầu với bối cảnh → chỉ thêm chi tiết khi cần thiết. Tránh ghi chép quá mức.
Sơ đồ như mã nguồn Lưu trữ .puml tệp trong Git. Cho phép quản lý phiên bản, CI/CD, hợp tác và so sánh thay đổi.
Bao gồm chú thích Luôn giải thích các biểu tượng, màu sắc và quy ước (ví dụ: Đỏ = Bên ngoàiXanh dương = Nội bộ).
Tập trung vào giao tiếp Các sơ đồ nên cung cấp thông tin, không phải để ấn tượng. Đơn giản > đầy đủ.
Sử dụng sơ đồ “Bức tranh hệ thống” Hiển thị cách nhiều hệ thống tương tác với nhau trong toàn tổ chức.
Sử dụng sơ đồ “Động” Thêm sơ đồ tuần tự để hiển thị hành vi tại thời điểm chạy (ví dụ: luồng đăng nhập).
Phạm vi hợp lý Một sơ đồ thành phần phải được xác định phạm vi trong một container duy nhất. Đừng trộn các container!

🛠 Công cụ và Hệ sinh thái

  • PlantUML + Thư viện C4-PlantUML – Miễn phí, dựa trên văn bản, được kiểm soát phiên bản.

  • Visual ParadigmLucidchartDraw.io – Hỗ trợ C4 thông qua các mẫu.

  • Trình cắm IDE – Tự động tạo sơ đồ C4 từ mã nguồn (ví dụ: IntelliJ + trình cắm PlantUML).

  • Tích hợp CI/CD – Tạo sơ đồ như một phần của quy trình xây dựng.


📚 Tài liệu tham khảo và Đọc thêm


🎯 Suy nghĩ cuối cùng

Mô hình C4 không phải là về việc tạo ra những sơ đồ hoàn hảo — mà là về kể đúng câu chuyện ở mức độ chi tiết phù hợp.

Sử dụng nó để:

  • Tiếp nhận nhà phát triển mới nhanh hơn.

  • Đồng bộ hóa các đội nhóm về ranh giới hệ thống.

  • Giao tiếp với các bên liên quan mà không cần dùng thuật ngữ chuyên môn.

  • Phát triển tài liệu kiến trúc song song với mã nguồn.


✅ Mẹo chuyên gia: Bắt đầu bằng một Sơ đồ bối cảnh hệ thống sơ đồ. Sau đó, phát triển mô hình theo nhu cầu thay đổi của đội nhóm của bạn — giống như xây dựng bản đồ từng con phố một cách từ từ.


Hãy cho tôi biết nếu bạn muốn:

  • Phiên bản PDF có thể tải về của hướng dẫn này

  • Một kho lưu trữ mẫu với sơ đồ C4 trong Git

  • Các tập lệnh tự động hóa để tạo sơ đồ C4 từ mã nguồn

  • Một so sánh với các mô hình khác (ví dụ: 4+1 View, Zachman)

Chúc bạn vẽ sơ đồ vui vẻ! 🖥️📘