Diagram As Code: Tối Ưu Hóa Việc Trực Quan Hóa Hệ Thống với Diagrams

I. Giới thiệu:

Diagram As Code là gì?

  • Diagram As Code là một khái niệm trong lĩnh vực phát triển phần mềm, nơi sơ đồ hệ thống được tạo và duy trì bằng code của các ngôn ngữ lập trình thay vì được tạo thủ công bằng các công cụ trực quan hóa truyền thống. Điều này có nghĩa là sơ đồ hệ thống được biểu diễn dưới dạng code, giúp các nhà phát triển có thể thực hiện và quản lý sơ đồ theo cách tương tự như việc quản lý source code.
  • Với Diagram As Code, nhà phát triển có thể sử dụng các ngôn ngữ lập trình như Python, JavaScript, hoặc DSL (Domain-Specific Language) để tạo và mô tả sơ đồ hệ thống của họ. Source code sẽ được biên dịch hoặc diễn giải để tạo ra sơ đồ trực quan và rõ ràng cho các thành phần, tương tác và cấu trúc của hệ thống.
  • Lợi ích của Diagram As Code là nó mang lại tính nhất quán, linh hoạt và dễ bảo trì cho sơ đồ hệ thống. Bằng cách sử dụng ngôn ngữ lập trình, sơ đồ có thể được cập nhật và điều chỉnh nhanh chóng, giúp duy trì tính chính xác của nó khi có sự thay đổi trong hệ thống. Ngoài ra, việc sử dụng công cụ như Diagrams cung cấp khả năng quản lý phiên bản, cộng tác và tùy chỉnh linh hoạt cho sơ đồ hệ thống.

Giới thiệu Diagrams:

  • Diagrams cho phép bạn vẽ  kiến trúc hệ thống cloud bằng Python code.
  • Nó được sinh ra để tạo các kiến trúc hệ thống mới mà không cần bất kỳ công cụ design nào.
  • Diagram as code giúp bạn theo dõi các thay đổi sơ đồ kiến trúc trong bất kỳ hệ thống version control nào.
  • Diagrams hiện tại đang support các nhà cung cấp phổ biến như: AWS, Azure, GCP, Kubernetes, Alibaba Cloud, Oracle Cloud etc... Nó cũng hỗ trợ On-Premise nodes, SaaS và các frameworks phổ biến.

Lợi ích khi sử dụng Diagrams:

  1. Trực quan hóa hệ thống: Diagrams giúp biểu diễn hệ thống một cách trực quan và dễ hiểu. Bằng cách sử dụng các biểu đồ và sơ đồ, người dùng có thể nhìn thấy cấu trúc, thành phần và mối quan hệ giữa các phần tử trong hệ thống một cách rõ ràng.
  2. Tính nhất quán: Khi có thay đổi trong source code, diagram cũng có thể được cập nhật một cách tự động, giúp duy trì tính chính xác và đồng bộ giữa code và diagram.
  3. Linh hoạt và dễ bảo trì: Với Diagrams, việc thay đổi, điều chỉnh và bảo trì diagram trở nên dễ dàng. Người dùng có thể chỉnh sửa source code để cập nhật diagram một cách nhanh chóng và linh hoạt, thay vì phải thực hiện thủ công trên công cụ trực quan hóa.
  4. Quản lý phiên bản: Bạn có thể quản lý phiên bản và kiểm soát các thay đổi của source code của các diagram. Điều này cho phép theo dõi lịch sử, so sánh phiên bản và khôi phục lại diagram trước đó khi cần thiết.
  5. Tương tác và cộng tác: Công cụ Diagrams cho phép nhiều thành viên trong dự án làm việc cùng nhau trên cùng diagram. Họ có thể cùng nhau chỉnh sửa code, đưa ra đánh giá và tương tác trực tiếp trên diagram để thảo luận và đưa ra quyết định chung.
  6. Thư viện phong phú: Diagrams cung cấp rất đa dạng các node class để giúp chúng ta có thể thiết kế và mô tả kiến trúc hệ thống theo ý muốn.

II. Bắt đầu với Diagrams:

Cài đặt:

Diagrams yêu cầu Python 3.6 trở lên, nên trước tiên hãy kiểm tra phiên bản Python của bạn.

Nó sử dụng Graphviz để render ra diagram, vì vậy bạn cần cài đặt Graphviz để sử dụng Digarams. Sau khi cài đặt Graphviz, tiếp theo hãy cài đặt Diagrams.

Trên macOS, bạn có thể cài đặt Graphviz với brew install graphviz nếu bạn đang sử dụng Homebrew. Tương tự, trên Windows đã được cài đặt Chocolateychoco install graphviz.
# using pip (pip3)
$ pip install diagrams

# using pipenv
$ pipenv install diagrams

# using poetry
$ poetry add diagrams

Tạo một diagram đơn giản:

Bạn phải import các module cần thiết mà bạn muốn thêm vào diagram của mình. Chúng được gọi là Nodes. Chúng đại diện cho một node hoặc thành phần hệ thống. Các node bao gồm ba phần: Provider, Resource type, Name.

Bạn có thể import các node như OnPrem, AWS, Azure, GCP, Kubernetes, v.v... Nếu không thể tìm thấy thứ gì đó, bạn luôn có thể sử dụng custom module.

# diagram.py
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB

with Diagram("Web Service", show=False):
    ELB("lb") >> EC2("web") >> RDS("userdb")
$ python diagram.py

Kết quả:

Nó sẽ được lưu dưới dạng web_service.png trên thư mục làm việc của bạn.

Các ví dụ khác:

Event Processing trên AWS

Node classes list của aws provider:

diagrams.aws.*

from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS, EKS, Lambda
from diagrams.aws.database import Redshift
from diagrams.aws.integration import SQS
from diagrams.aws.storage import S3

with Diagram("Event Processing", show=False):
    source = EKS("k8s source")

    with Cluster("Event Flows"):
        with Cluster("Event Workers"):
            workers = [ECS("worker1"),
                       ECS("worker2"),
                       ECS("worker3")]

        queue = SQS("event queue")

        with Cluster("Processing"):
            handlers = [Lambda("proc1"),
                        Lambda("proc2"),
                        Lambda("proc3")]

    store = S3("events store")
    dw = Redshift("analytics")

    source >> workers >> queue >> handlers
    handlers >> store
    handlers >> dw
Stateful Architecture trên Kubernetes

Node classes list của k8s provider.

diagrams.k8s.*

from diagrams import Cluster, Diagram
from diagrams.k8s.compute import Pod, StatefulSet
from diagrams.k8s.network import Service
from diagrams.k8s.storage import PV, PVC, StorageClass

with Diagram("Stateful Architecture", show=False):
    with Cluster("Apps"):
        svc = Service("svc")
        sts = StatefulSet("sts")

        apps = []
        for _ in range(3):
            pod = Pod("pod")
            pvc = PVC("pvc")
            pod - sts - pvc
            apps.append(svc >> pod >> pvc)

    apps << PV("pv") << StorageClass("sc")
Advanced Web Service với On-Premise

Node classes list của onprem provider.

diagrams.onprem.*

from diagrams import Cluster, Diagram
from diagrams.onprem.analytics import Spark
from diagrams.onprem.compute import Server
from diagrams.onprem.database import PostgreSQL
from diagrams.onprem.inmemory import Redis
from diagrams.onprem.aggregator import Fluentd
from diagrams.onprem.monitoring import Grafana, Prometheus
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import Kafka

with Diagram("Advanced Web Service with On-Premise", show=False):
    ingress = Nginx("ingress")

    metrics = Prometheus("metric")
    metrics << Grafana("monitoring")

    with Cluster("Service Cluster"):
        grpcsvc = [
            Server("grpc1"),
            Server("grpc2"),
            Server("grpc3")]

    with Cluster("Sessions HA"):
        primary = Redis("session")
        primary - Redis("replica") << metrics
        grpcsvc >> primary

    with Cluster("Database HA"):
        primary = PostgreSQL("users")
        primary - PostgreSQL("replica") << metrics
        grpcsvc >> primary

    aggregator = Fluentd("logging")
    aggregator >> Kafka("stream") >> Spark("analytics")

    ingress >> grpcsvc >> aggregator

III. Kết luận:

Trong bài viết này, chúng ta đã tìm hiểu về khái niệm Diagram As Code và sự hỗ trợ của công cụ Diagrams trong việc tạo và quản lý sơ đồ hệ thống. Diagram As Code đem lại nhiều lợi ích quan trọng cho quá trình phát triển phần mềm và thiết kế hệ thống.

Trong tương lai, Diagram As Code dự kiến sẽ tiếp tục phát triển và trở thành một xu hướng quan trọng trong việc thiết kế và quản lý hệ thống. Công cụ Diagrams và các công cụ tương tự sẽ được cải tiến và mở rộng để hỗ trợ các nền tảng, nhà cung cấp, và framework mới. Điều này sẽ giúp đơn giản hóa và tối ưu hóa quy trình làm việc, đồng thời tăng cường khả năng tương tác và cộng tác giữa các thành viên trong dự án.

Tài liệu tham khảo: