6 Công Cụ Diagram-as-Code Mã Nguồn Mở Hữu Ích

Các công cụ “Diagram-as-Code” (DaC) đang ngày càng trở nên phổ biến trong giới phát triển và DevOps vì chúng cho phép bạn tạo, quản lý và kiểm soát phiên bản các sơ đồ kiến trúc một cách hiệu quả, giống như cách bạn làm với mã nguồn. Phương pháp này mang lại nhiều lợi ích như:

  • Kiểm soát phiên bản tốt hơn: Vì sơ đồ được lưu dưới dạng code, bạn có thể dễ dàng theo dõi các thay đổi, quay lại các phiên bản trước và xem lịch sử phát triển của kiến trúc.
  • Tự động hóa: Tích hợp việc tạo sơ đồ vào các pipeline CI/CD để đảm bảo tài liệu luôn được cập nhật tự động cùng với code.
  • Cộng tác hiệu quả: Các thành viên trong nhóm có thể xem xét, chỉnh sửa và đóng góp vào sơ đồ thông qua Git, giảm thiểu sự hiểu lầm do tài liệu lỗi thời.
  • Tính nhất quán: Đảm bảo các sơ đồ tuân thủ một tiêu chuẩn nhất định và đồng bộ với thực tế của hệ thống.
  • Nhanh chóng và dễ dàng: Đối với các lập trình viên, việc viết code để tạo sơ đồ thường nhanh hơn và dễ dàng hơn so với việc kéo thả thủ công.

Dưới đây là 6 công cụ Diagram-as-Code mã nguồn mở nổi bật mà bạn nên thử:

1. Diagrams (Python)

  • Mô tả: Diagrams cho phép bạn vẽ kiến trúc hệ thống đám mây bằng mã Python. Nó được thiết kế để tạo mẫu kiến trúc hệ thống mới mà không cần bất kỳ công cụ thiết kế nào, hoặc để mô tả/trực quan hóa kiến trúc hiện có.
  • Điểm nổi bật:
    • Hỗ trợ các nhà cung cấp đám mây lớn: AWS, Azure, GCP, Kubernetes, Alibaba Cloud, Oracle Cloud, v.v.
    • Cũng hỗ trợ các node On-Premises, SaaS, và các framework/ngôn ngữ lập trình chính.
    • Tự động căn chỉnh và bố cục sơ đồ.
  • Trường hợp sử dụng: Lý tưởng để tạo các sơ đồ kiến trúc đám mây phức tạp với các biểu tượng nhà cung cấp cụ thể.
  • Website: diagrams.mingrammer.com

Ví dụ code:

from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB, Route53
from diagrams.aws.security import IAM
from diagrams.aws.compute import Lambda

with Diagram("AWS Architecture", show=False):
    dns = Route53("Route53")
    lb = ELB("Load Balancer")
    web1 = EC2("Web Server 1")
    web2 = EC2("Web Server 2")
    auth_lambda = Lambda("Auth")
    iam = IAM("IAM Role")
    db_primary = RDS("Primary DB")
    db_replica = RDS("Replica DB")
    dns >> lb >> [web1, web2]
    web1 >> auth_lambda >> iam
    [web1, web2] >> db_primary >> db_replica

Kết quả:

fd85580e-f2cd-444b-962a-e26cf7e6df7d

2. PlantUML

  • Mô tả: PlantUML là một công cụ mạnh mẽ cho phép bạn tạo nhiều loại biểu đồ UML và phi-UML từ mô tả văn bản đơn giản.
  • Điểm nổi bật:
    • Hỗ trợ nhiều loại biểu đồ: Class, Sequence, Use Case, Activity, Component, State, Object, Deployment, v.v.
    • Cũng có thể tạo biểu đồ ERD, Gantt, Mindmap, và thậm chí cả Wireframe.
    • Tích hợp tốt với nhiều công cụ và nền tảng (ví dụ: GitHub, Confluence, Jira).
    • Tạo sơ đồ với cú pháp văn bản đơn giản, dễ đọc.
  • Trường hợp sử dụng: Thích hợp cho việc mô hình hóa kiến trúc phần mềm, quy trình kinh doanh và các mối quan hệ giữa các thành phần.
  • Website: plantuml.com

Cài đặt nhanh với docker selfhost:

docker run -d -p 8080:8080 plantuml/plantuml-server:jetty

Ví dụ code:

@startuml
component "Route53" as DNS
component "ELB" as LB
component "EC2 Web 1" as WS1
component "EC2 Web 2" as WS2
component "Lambda Auth" as Lambda
component "IAM Role" as IAM
component "RDS Primary" as DB1
component "RDS Replica" as DB2

DNS --> LB
LB --> WS1
LB --> WS2
WS1 --> Lambda
Lambda --> IAM
WS1 --> DB1
WS2 --> DB1
DB1 --> DB2
@enduml

Kết quả:

9f4f3cbd-2060-45b7-8f02-e2ff40cc4081

3. Mermaid

  • Mô tả: Mermaid là một công cụ tạo biểu đồ và đồ thị dựa trên JavaScript, cho phép bạn tạo các biểu đồ từ các định nghĩa văn bản theo kiểu Markdown. Nó được biết đến với sự đơn giản và khả năng tích hợp liền mạch với các môi trường web.
  • Điểm nổi bật:
    • Cú pháp đơn giản, giống Markdown.
    • Hỗ trợ Flowchart, Sequence Diagram, Class Diagram, State Diagram, Entity Relationship Diagram, User Journey, Gantt Chart, Pie Chart, v.v.
    • Tích hợp gốc trên GitHub, GitLab và nhiều công cụ Markdown khác.
    • Có trình chỉnh sửa trực tiếp (Live Editor) để xem trước nhanh chóng.
  • Trường hợp sử dụng: Tuyệt vời cho tài liệu kỹ thuật, GitHub READMEs, và các wiki nội bộ cần biểu đồ dễ tạo và nhúng.
  • Website: mermaid.js.org

Ví dụ code:

graph TD
    DNS[Route53] --> LB[ELB]
    LB --> WS1[Web Server 1]
    LB --> WS2[Web Server 2]
    WS1 --> Lambda[Lambda Function]
    Lambda --> IAM[IAM Role]
    WS1 --> DB1[Primary DB]
    WS2 --> DB1
    DB1 --> DB2[Replica DB]

Kết quả:

d0dee20f-2b20-447f-a535-48537e23d99f

4. Structurizr

  • Mô tả: Structurizr xây dựng dựa trên khái niệm “diagrams as code”, cho phép bạn tạo nhiều sơ đồ kiến trúc phần mềm từ một mô hình duy nhất. Nó được thiết kế đặc biệt để hỗ trợ mô hình C4 để trực quan hóa kiến trúc phần mềm (Context, Container, Component, Code).
  • Điểm nổi bật:
    • Tập trung vào mô hình C4, giúp mô tả kiến trúc ở các mức độ trừu tượng khác nhau.
    • Tạo sơ đồ tương tác, có thể phóng to/thu nhỏ, động, và có thể nhúng.
    • Hỗ trợ Structurizr DSL (Domain Specific Language) để định nghĩa mô hình.
    • Có sẵn các chủ đề cho AWS, Azure, GCP, Kubernetes.
  • Trường hợp sử dụng: Lý tưởng cho các nhóm phát triển phần mềm muốn tài liệu kiến trúc rõ ràng, có cấu trúc và có thể kiểm soát phiên bản theo mô hình C4.
  • Website: structurizr.com

Ví dụ code:

workspace {

    model {
        user = person "User"

        system = softwareSystem "Web Application" {
            lb    = container "Load Balancer"
            web1  = container "Web Server 1"
            web2  = container "Web Server 2"
            auth  = container "Auth Lambda"
            role  = container "IAM Role"
            db1   = container "Primary DB"
            db2   = container "Replica DB"

            user -> lb
            lb -> web1
            lb -> web2
            web1 -> auth
            auth -> role
            web1 -> db1
            web2 -> db1
            db1 -> db2
        }
    }

    views {
        container system {
            include *
            autolayout lr
        }
    }
}

Kết quả:

3d8011bc-1176-41dc-b6b0-335c64e31c26

5. D2 (by Terrastruct)

  • Mô tả: D2 là một ngôn ngữ kịch bản biểu đồ hiện đại được tạo bởi Terrastruct. Nó tập trung vào sự đơn giản và rõ ràng, làm cho nó trở nên hoàn hảo cho các nhà phát triển muốn có những biểu đồ tinh tế với nỗ lực tối thiểu. Nó hỗ trợ hiển thị thời gian thực trong tiện ích mở rộng VS Code hoặc trình duyệt.

  • Điểm nổi bật:

    • Cú pháp đơn giản với bố cục tự động.
    • Hỗ trợ các theme và chú thích.
    • Hiển thị nhanh chóng, mang lại trải nghiệm tuyệt vời cho nhà phát triển.
  • Nhược điểm

    • Cộng đồng và hệ sinh thái vẫn đang phát triển.
    • Thiếu các icon dành riêng cho AWS có sẵn.
  • Cài đặt: Bạn có thể cài đặt D2 cục bộ hoặc sử dụng playground trên nền web để trực quan hóa nhanh chóng: https://play.d2lang.com/

    curl -fsSL https://d2lang.com/install.sh | sh

Ví dụ code:

direction: right
DNS: "Route53: DNS"
LB: "ELB: Load Balancer"
WS1: "EC2: Web Server 1"
WS2: "EC2: Web Server 2"
Lambda: "Lambda: Auth Function"
IAM: "IAM Role"
DB1: "RDS: Primary DB"
DB2: "RDS: Replica DB"
DNS -> LB
LB -> WS1
LB -> WS2
WS1 -> Lambda
Lambda -> IAM
WS1 -> DB1
WS2 -> DB1
DB1 -> DB2

Kết quả:

6beb9286-3d51-429a-b5bd-cf3b4b48031d

6. Awslabs/diagram-as-code (YAML)

  • Mô tả: Đây là một công cụ dòng lệnh (CLI) của AWS Labs cho phép vẽ các sơ đồ kiến trúc AWS thông qua mã YAML. Nó tập trung vào việc tuân thủ các hướng dẫn kiến trúc của AWS.
  • Điểm nổi bật:
    • Chuyên biệt cho kiến trúc AWS.
    • Sử dụng cú pháp YAML dễ đọc.
    • Khuyến khích tái sử dụng code, kiểm thử và tự động hóa quy trình tạo sơ đồ.
    • Nhẹ và thân thiện với CI/CD.
    • Có thể tạo sơ đồ từ template CloudFormation (beta).
  • Trường hợp sử dụng: Lý tưởng cho các kỹ sư DevOps/Cloud làm việc chủ yếu với AWS và muốn tạo sơ đồ kiến trúc tự động, tuân thủ tiêu chuẩn.
  • GitHub Repo: github.com/awslabs/diagram-as-code

Ví dụ code:

Diagram:
  DefinitionFiles:
    - Type: URL
      Url: "https://raw.githubusercontent.com/awslabs/diagram-as-code/main/definitions/definition-for-aws-icons-light.yaml"

  Resources:
    Canvas:
      Type: AWS::Diagram::Canvas
      Direction: vertical
      Children:
        - AWSCloud
        - User

    AWSCloud:
      Type: AWS::Diagram::Cloud
      Direction: vertical
      Preset: AWSCloudNoLogo
      Align: center
      Children:
        - Route53
        - LoadBalancer
        - EC2Stack
        - Lambda
        - IAM
        - DBStack

    User:
      Type: AWS::Diagram::Resource
      Preset: User
      Label: User

    Route53:
      Type: AWS::Route53::HostedZone
      Label: Route 53

    LoadBalancer:
      Type: AWS::ElasticLoadBalancingV2::LoadBalancer
      Label: Load Balancer

    EC2Stack:
      Type: AWS::Diagram::HorizontalStack
      Children:
        - EC2_1
        - EC2_2

    EC2_1:
      Type: AWS::EC2::Instance
      Label: Web Server 1

    EC2_2:
      Type: AWS::EC2::Instance
      Label: Web Server 2

    Lambda:
      Type: AWS::Lambda::Function
      Label: Auth Lambda

    IAM:
      Type: AWS::IAM::Role
      Label: IAM Role

    DBStack:
      Type: AWS::Diagram::HorizontalStack
      Children:
        - DB1
        - DB2

    DB1:
      Type: AWS::RDS::DBInstance
      Label: Primary DB

    DB2:
      Type: AWS::RDS::DBInstance
      Label: Replica DB

  Links:
  - Source: User
    SourcePosition: N
    Target: Route53
    TargetPosition: S
    TargetArrowHead:
      Type: Open

  - Source: Route53
    SourcePosition: N
    Target: LoadBalancer
    TargetPosition: S
    TargetArrowHead:
      Type: Open

  - Source: LoadBalancer
    SourcePosition: SSW
    Target: EC2_1
    TargetPosition: NNW
    TargetArrowHead:
      Type: Open

  - Source: LoadBalancer
    SourcePosition: SSE
    Target: EC2_2
    TargetPosition: NNE
    TargetArrowHead:
      Type: Open

  - Source: EC2_1
    SourcePosition: S
    Target: Lambda
    TargetPosition: N
    TargetArrowHead:
      Type: Open

  - Source: Lambda
    SourcePosition: S
    Target: IAM
    TargetPosition: N
    TargetArrowHead:
      Type: Open

  - Source: EC2_1
    SourcePosition: SE
    Target: DB1
    TargetPosition: NW
    TargetArrowHead:
      Type: Open

  - Source: EC2_2
    SourcePosition: SW
    Target: DB1
    TargetPosition: NE
    TargetArrowHead:
      Type: Open

  - Source: DB1
    SourcePosition: E
    Target: DB2
    TargetPosition: W
    TargetArrowHead:
      Type: Open

Kết quả:

fe5e7185-8bd1-4dbf-9d30-f9bbec1bf6e1

Kết luận:

Việc áp dụng các công cụ Diagram-as-Code mang lại những lợi ích đáng kể trong việc quản lý tài liệu kiến trúc. Chúng giúp các nhóm làm việc hiệu quả hơn, đảm bảo tính nhất quán và dễ dàng theo dõi sự phát triển của hệ thống theo thời gian. Hãy thử nghiệm các công cụ này để tìm ra lựa chọn phù hợp nhất với nhu cầu dự án và quy trình làm việc của bạn.

Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận