一、前言
昨天發現了一款非常不錯的雲系統架構原型圖制作庫
Diagrams,通過它,我們便可以使用代碼的方式繪制諸如阿裡雲、AWS、Azure、K8S 等系統架構原型圖。
相比于在 UI 上對各種圖示進行拖拽和調整,這種方式更符合我們程式員的使用習慣。
本文不僅要介紹下這個庫,也想說說我是如何參與到這個庫中以支援阿裡雲資源。
二、安裝
Diagrams
使用
Graphviz來渲染圖表,在安裝
diagrams
之前需要先
安裝 Graphviz。
macOS 使用者(如果使用 Homebrew )可以使用的方式來安裝
brew install graphviz
Graphviz
安裝
diagrams
的方式有多種,通過
pip
、
pipenv
和
poetry
均可:
# 使用 pip (pip3)
$ pip install diagrams
# 使用 pipenv
$ pipenv install diagrams
# 使用 poetry
$ poetry add diagrams
三、快速開始
# diagram.py
from diagrams import Diagram
from diagrams.alibabacloud.network import SLB
from diagrams.alibabacloud.compute import ECS
from diagrams.alibabacloud.database import RDS
with Diagram("Web Service", show=False):
SLB("lb") >> ECS("web") >> RDS("userdb")
執行後,就能生成如下架構圖:
$ python diagram.py

四、指南
Diagrams
庫非常容易掌握,我們僅需要掌握三個概念就能輕松繪制雲系統架構圖:
-
:這是表示圖的最主要的對象,代表一個架構圖Diagram
-
:表示一個節點或系統元件,比如Node
中的快速開始
SLB
ECS
都是架構圖中的節點RDS
-
:表示叢集或分組,可将多個節點放到一個叢集中Cluster
4.1 圖 Diagram
Diagram
類來建立圖環境上下文,使用
with
文法來使用這個上下文。
Diagram
的第一個參數是會被用作架構圖的名稱以及輸出的圖檔檔案名(轉換為小寫+下劃線)。
from diagrams import Diagram
from diagrams.aws.compute import EC2
with Diagram("Simple Diagram"):
EC2("web")
運作上述代碼,會生成一個包含
EC2
節點的架構圖,并存放在目前的
simple_diagram.png
中。
Diagram
類還支援如下參數:
-
:指定輸出圖檔的類型,預設是outformat
,可以是png
png
jpg
svg
pdf
-
:指定是否顯示圖檔,預設是show
False
-
graph_attr
node_attr
:指定edge_attr
屬性選項,用來控制圖、點、線的樣式,詳情檢視 參考連結Graphviz
4.2 節點 Node
目前,
Diagrams
支援五類雲資源節點,分别是
AWS
Azure
AlibabaCloud
GCP
K8S
節點之間的關系使用操作符來表示,分别是:
-
:左節點指向右節點>>
-
:右節點指向左節點<<
-
:節點互相連接配接,沒有方向-
以下是一個例子:
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3
with Diagram("Web Services", show=False):
ELB("lb") >> EC2("web") >> RDS("userdb") >> S3("store")
ELB("lb") >> EC2("web") >> RDS("userdb") << EC2("stat")
(ELB("lb") >> EC2("web")) - EC2("web") >> RDS("userdb")
Diagrams
不僅支援單個節點的關系建立,還支援一組節點和其他節點的關系建立,使用
list
來表示一組節點。示例如下:
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
with Diagram("Grouped Workers", show=False, direction="TB"):
ELB("lb") >> [EC2("worker1"),
EC2("worker2"),
EC2("worker3"),
EC2("worker4"),
EC2("worker5")] >> RDS("events")
4.3 叢集/組 Cluster
當我們需要在架構圖上表示幾個節點屬于一個叢集時,就要用到
Cluster
。和
Diagram
的使用方式類似,它也是一個上下文管理器,使用
with
文法。
示例如下:
from diagrams import Cluster, Diagram
from diagrams.aws.compute import ECS
from diagrams.aws.database import RDS
from diagrams.aws.network import Route53
with Diagram("Simple Web Service with DB Cluster", show=False):
dns = Route53("dns")
web = ECS("service")
with Cluster("DB Cluster"):
db_master = RDS("master")
db_master - [RDS("slave1"),
RDS("slave2")]
dns >> web >> db_master
Diagrams
還支援嵌套叢集,隻需嵌套使用
with Cluster()
即可:
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
五、我是如何貢獻代碼
看到
Diagrams
庫時,我感到很興奮。我們畫示意圖無外乎兩種,一種是通過
UI
來畫,一種是通過
DSL
來制作。在流程圖、時序圖方面,
PlantUML是我很喜歡的
DSL
,然而在雲系統架構圖方面,過去确實沒發現相關的庫,直到看到了
Diagrams
在我看到
Diagrams
時,它還隻是支援
AWS
Azure
GCP
K8S
,我心想怎麼能沒有
阿裡雲
呢?這麼好的庫我豈不是用不了了。既然如此,不如自己動手,豐衣足食吧。閱讀
Diagrams
的代碼,會發現寫的還真不錯,代碼清晰簡單,還提供了完善的腳手架。
對于它所支援的雲供應商(比如
AWS
),當我們想更新裡面的資源時,隻需要在
resources/aws
檔案夾中更新資源圖檔,然後執行
./autogen.sh
即可。
./autogen.sh
會對
resources/
做這麼幾件事:
- 将特定雲供應商的
圖檔轉換為svg
png
- 将特定雲供應商的圖檔調整為圓角圖檔
- 自動生成節點類代碼
- 自動生成文檔
-
格式化自動生成的代碼black
對于它所不支援的雲供應商(比如
AlibabaCloud
),則要先修改腳手架和配置檔案以支援新的雲供應商,然後遵循上面的方法即可。具體改動内容可見
此 PR參與一個開源項目其實就是這麼簡單,當你發現滿足不了你的需求時,就閱讀它的源碼以了解實作原理,然後再自己動手實作需求,最後就是向作者提個 PR。