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:
- 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. - 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.
- 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. - 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.
- 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. - 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ớibrew install graphviz
nếu bạn đang sử dụng Homebrew. Tương tự, trên Windows đã được cài đặt Chocolatey làchoco 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ả:
Các ví dụ khác:
Event Processing trên AWS
Node classes list của aws provider:
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: