1.2 萬 Star!一款 Python 開發(fā)的架構(gòu)圖繪制工具

【導(dǎo)語】:你還在用visio繪制架構(gòu)圖嗎?這有一款繪制系統(tǒng)架構(gòu)的開源工具,確定不來看看?
簡介
Diagrams 可以讓你用 Python 代碼繪制云系統(tǒng)架構(gòu)。無需使用任何其他工具(比如 visio),你就可以用它來為一個全新的系統(tǒng)架構(gòu)進行原型設(shè)計。當(dāng)然它也可以用來繪制你現(xiàn)有的系統(tǒng)架構(gòu)。
Diagrams 目前支持的主要提供商包括:AWS、Azure、GCP、Kubernetes、阿里云、Oracle云等。同時它也支持本地節(jié)點、SaaS和主流的編程框架和語言。
Diagram as Code 還能讓你跟蹤各種版本控制系統(tǒng)中的體系結(jié)構(gòu)圖變化。
它不能控制任何實際的云資源也不能生成云信息或地形代碼。它只能幫你繪制云系統(tǒng)架構(gòu)圖。
開源地址:https://github.com/mingrammer/diagrams
安裝使用
需要?Python 3.6?版本及以上,使用前請先檢測你的 python 版本。
繪制時需要使用 Graphviz,所以你需要先安裝 Graphviz。
macOS 用戶可以使用?
brew install graphviz?命令來下載 Graphviz。
安裝 diagrams
#?using?pip?(pip3)
$?pip?install?diagrams
#?using?pipenv
$?pipenv?install?diagrams
#?using?poetry
$?poetry?add?diagrams
快速上手
#?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")
運行此代碼,將會生成一個如下的圖:

在你的工作目錄會生成一個web_service.png。
詳細介紹
接下來我們主要分四塊介紹一下 diagrams 的構(gòu)成,分別是:圖、節(jié)點、集群和邊。
一、圖
Diagram是展現(xiàn)關(guān)系圖最關(guān)鍵的部分。
基礎(chǔ)使用
你可以使用 Diagram 類來創(chuàng)建一個關(guān)系圖的上下文。Diagram 構(gòu)造函數(shù)的第一個參數(shù)是你輸出的文件名。我們來看一個例子:
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram"):
?EC2("web")
在 cmd 輸入?python diagram.py?來執(zhí)行下,代碼會在你的代碼目錄生成一個 simple_diagram.png 文件,可以看到里面只有一個 EC2 節(jié)點。
Jupyter Notebooks
Diagrams也可以直接在Jupyter的notebook里使用,示例如下:
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram")?as?diag:
????EC2("web")
diag
可選項
你可以指定輸出文件的格式,默認格式是.png,比如將默認的png格式改為jpg格式:
(png, jpg, svg, and pdf) 都是允許的格式
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram",?outformat="jpg"):
?EC2("web")
你也可以使用 filename 參數(shù)來指定輸出的文件名,但此時不能再指定擴展名,因為擴展名是由 outformat 指定的,下面我們將文件名指定為 my_diagram:
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram",?filename="my_diagram"):
????EC2("web")
也使用 show 參數(shù)來禁用文件自動打開,默認是True:
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram",?show=False):
????EC2("web")
它還允許自定義Graphviz點屬性選項,比如:
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
graph_attr?=?{
????"fontsize":?"45",
????"bgcolor":?"transparent"
}
with?Diagram("Simple?Diagram",?show=False,?graph_attr=graph_attr):
?EC2("web")
graph_attr, node_attr 和 edge_attr 都是支持的。具體可查看鏈接:https://www.graphviz.org/doc/info/attrs.html.
二、節(jié)點
Node是展現(xiàn)節(jié)點或系統(tǒng)組成的第二個對象。
基礎(chǔ)使用
節(jié)點是表示單個系統(tǒng)組件對象的抽象概念。節(jié)點對象由三部分組成:提供者、資源類型和名稱。
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
with?Diagram("Simple?Diagram"):
?EC2("web")
在上面的例子中,EC2 是由 aws 提供者提供的計算資源類型的節(jié)點。
可以以類似的方式使用其他節(jié)點對象,例如:
#?aws?資源
from?diagrams.aws.compute?import?ECS,?Lambda
from?diagrams.aws.database?import?RDS,?ElastiCache
from?diagrams.aws.network?import?ELB,?Route53,?VPC
...
#?azure?資源
from?diagrams.azure.compute?import?FunctionApps
from?diagrams.azure.storage?import?BlobStorage
...
#?阿里云?資源
from?diagrams.alibabacloud.compute?import?ECS
from?diagrams.alibabacloud.storage?import?ObjectTableStore
...
#?gcp?資源
from?diagrams.gcp.compute?import?AppEngine,?GKE
from?diagrams.gcp.ml?import?AutoML?
...
#?k8s?資源
from?diagrams.k8s.compute?import?Pod,?StatefulSet
from?diagrams.k8s.network?import?Service
from?diagrams.k8s.storage?import?PV,?PVC,?StorageClass
...
#?oracle?資源
from?diagrams.oci.compute?import?VirtualMachine,?Container
from?diagrams.oci.network?import?Firewall
from?diagrams.oci.storage?import?Filestorage,?Storagegateway
數(shù)據(jù)流
你可以通過使用以下運算符:>>、<< 和 -?連接節(jié)點來表示數(shù)據(jù)流。
>>:從左到右連接節(jié)點。 <<:從右向左連接節(jié)點。 -:無方向連接節(jié)點。無方向的。
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")?<"stat")
????(ELB("lb")?>>?EC2("web"))?-?EC2("web")?>>?RDS("userdb")
使用?
-?和任何?shift?運算符時要注意,可能會因為運算優(yōu)先級導(dǎo)致非預(yù)期的結(jié)果。

圖展現(xiàn)的順序跟代碼聲明的順序相反。
你可以使用direction參數(shù)來改變數(shù)據(jù)流方向,默認是LR。
TB、BT、LR 和 RL 都是可選的。
from?diagrams?import?Diagram
from?diagrams.aws.compute?import?EC2
from?diagrams.aws.database?import?RDS
from?diagrams.aws.network?import?ELB
with?Diagram("Workers",?show=False,?direction="TB"):
????lb?=?ELB("lb")
????db?=?RDS("events")
????lb?>>?EC2("worker1")?>>?db
????lb?>>?EC2("worker2")?>>?db
????lb?>>?EC2("worker3")?>>?db
????lb?>>?EC2("worker4")?>>?db
????lb?>>?EC2("worker5")?>>?db
組數(shù)據(jù)流
上面的worker示例有很多冗余流。這種情況下,你可以使用組數(shù)據(jù)流將節(jié)點分組到一個列表中,以便所有節(jié)點同時連接到其他節(jié)點。
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")
grouped_workers_diagram不能直接連接兩個列表,因為在Python中不允許在列表之間進行移位/算術(shù)操作
三、集群
集群允許你將節(jié)點分組放在一個獨立的組中。
基礎(chǔ)使用
Cluster表示本地群集上下文。
你可以使用cluster類創(chuàng)建集群上下文。你還可以將集群中的節(jié)點連接到集群外的其他節(jié)點。
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

嵌套集群
嵌套集群也是可以使用的。
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

嵌套沒有深度限制。你可以隨意創(chuàng)建任意深度的嵌套集群。
四、邊
邊表示節(jié)點之間的邊。
基礎(chǔ)使用
Edge是一個對象,表示具有某些附加屬性的節(jié)點之間的連接。
一個edge對象包含三個屬性:label、color和style,它們對應(yīng)相應(yīng)的graphviz的邊屬性。
from?diagrams?import?Cluster,?Diagram,?Edge
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.logging?import?Fluentd
from?diagrams.onprem.monitoring?import?Grafana,?Prometheus
from?diagrams.onprem.network?import?Nginx
from?diagrams.onprem.queue?import?Kafka
with?Diagram(name="Advanced?Web?Service?with?On-Premise?(colored)",?show=False):
????ingress?=?Nginx("ingress")
????metrics?=?Prometheus("metric")
????metrics?<"firebrick",?style="dashed")?<"monitoring")
????with?Cluster("Service?Cluster"):
????????grpcsvc?=?[
????????????Server("grpc1"),
????????????Server("grpc2"),
????????????Server("grpc3")]
????with?Cluster("Sessions?HA"):
????????master?=?Redis("session")
????????master?-?Edge(color="brown",?style="dashed")?-?Redis("replica")?<"collect")?<????????grpcsvc?>>?Edge(color="brown")?>>?master
????with?Cluster("Database?HA"):
????????master?=?PostgreSQL("users")
????????master?-?Edge(color="brown",?style="dotted")?-?PostgreSQL("slave")?<"collect")?<????????grpcsvc?>>?Edge(color="black")?>>?master
????aggregator?=?Fluentd("logging")
????aggregator?>>?Edge(label="parse")?>>?Kafka("stream")?>>?Edge(color="black",?style="bold")?>>?Spark("analytics")
????ingress?>>?Edge(color="darkgreen")?<>?Edge(color="darkorange")?>>?aggregator
擴展
如果你想了解更多,可以移步這里觀看更多的官方示例:https://diagrams.mingrammer.com/docs/getting-started/examples

近期熱門文章推薦:

