天天看點

圖表即代碼:使用 Diagrams 制作雲系統架構原型圖

一、前言

昨天發現了一款非常不錯的雲系統架構原型圖制作庫

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 制作雲系統架構原型圖

四、指南

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 制作雲系統架構原型圖

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")           
圖表即代碼:使用 Diagrams 制作雲系統架構原型圖

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 制作雲系統架構原型圖

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 制作雲系統架構原型圖

五、我是如何貢獻代碼

看到

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。