Python利用Diagrams绘制漂亮的系统架构图

 更新时间:2023年01月12日 11:08:00   作者:Ckend  
Diagrams  是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构。本文将利用它绘制漂亮的系统架构图,感兴趣的可以了解一下

Diagrams  是一个基于Python绘制云系统架构的模块,它能够通过非常简单的描述就能可视化架构,并支持以下6个云产品的图标:

AWS、Azure、GCP、K8s、阿里云 和 Oracle 云

基于Diagrams提供的节点,你只需要指定一个云产品(实际上选哪个都一样,我们只需要那个产品相应的图标,你可以选一个自己觉得好看的产品),使用其内部自带的云产品的图标,就能简单绘制基于某云产品图标的架构图。

比如下面的代码,绘制了一个简单的基于数据库集群的网络服务架构:

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

非常非常适合用来做论文的架构图绘制,强烈推荐。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上,如果没有,可以访问这篇文章:超详细Python安装指南 进行安装。

(可选1) 如果你用Python的目的是数据分析,可以直接安装Anaconda,它内置了Python和pip.

(可选2) 此外,推荐大家用VSCode编辑器,它有许多的优点

请选择以下任一种方式输入命令安装依赖

1. Windows 环境 打开 Cmd (开始-运行-CMD)。

2. MacOS 环境 打开 Terminal (command+空格输入Terminal)。

3. 如果你用的是 VSCode编辑器 或 Pycharm,可以直接使用界面下方的Terminal.

pip install diagrams

看到 Successfully installed xxx 则说明安装成功。

Diagrams 使用了 graphviz 作为渲染工具,因此为了顺利使用 Diagrams ,还需要下载 graphviz:

https://www.graphviz.org/download/

macOS用户可以直接brew安装:

brew install graphviz

2.基本使用与例子

2.1 初始化与导出

使用 Diagram 类初始化一个绘图上下文,这个类接收到的第一个参数将会成为架构图的文件名,而一当代码运行完毕,它将会以该文件名保存(空格会被下划线所替代):

from diagrams import Diagram
from diagrams.aws.compute import EC2

with Diagram("Simple Diagram"):
    EC2("web")

此外,它还可以选择导出的文件格式,在Diagram类里增加outformat参数,也可以不以第一个参数为文件保存名称,增加filename参数指定名称即可:

with Diagram("Simple Diagram", outformat="jpg", filename="my_diagram")

2.2 节点类型

由于节点类型比较多,我们无法一一展示出来,所有类型的节点里都可以在官方文档里找到,比如:

阿里云:https://diagrams.mingrammer.com/docs/nodes/alibabacloud

K8S:https://diagrams.mingrammer.com/docs/nodes/k8s

AWS:https://diagrams.mingrammer.com/docs/nodes/aws

接下来以AWS为例子,讲解几个基本的数据流例子:

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

# show参数表示是否自动打开图像
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")

几个操作符:

 >> 表示从左到右的数据流

 << 表示从右到左的数据流

  表示没有箭头的数据流

还可以用变量赋值的形式简化代码:

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

可以看到这里箭头的方向变了,这是因为Diagram加了direction参数,TB 表示数据流向 top to bottm, 即从上到下,可选的其他参数还有:LR(左至右)、BT(底至上)、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("Grouped Workers", show=False, direction="TB"):
    ELB("lb") >> [EC2("worker1"),
                  EC2("worker2"),
                  EC2("worker3"),
                  EC2("worker4"),
                  EC2("worker5")] >> RDS("events")

2.3 集群块

使用Cluster 类 并用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

而且还可以做得相当复杂:

这里代码很简单,但是比较长,后续还有一个比较重要的例子,这里就不展示了

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

2.4 自定义线的颜色与属性

使用Edge函数,你可以自定义线的颜色与属性以及备注,比如:

Edge(color="firebrick", style="dashed", label="test")
# 使用火砖色,线的类型为虚线,备注为test

下面是一个比较复杂的例子,但是你如果认真阅读了,会发现它其实很简单:

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 << Edge(color="firebrick", style="dashed") << Grafana("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") << Edge(label="collect") << metrics
        grpcsvc >> Edge(color="brown") >> master

    with Cluster("Database HA"):
        master = PostgreSQL("users")
        master - Edge(color="brown", style="dotted") - PostgreSQL("slave") << Edge(label="collect") << metrics
        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") << grpcsvc >> Edge(color="darkorange") >> aggregator

到此这篇关于Python利用Diagrams绘制漂亮的系统架构图的文章就介绍到这了,更多相关Python Diagrams绘制系统架构图内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 使用Python绘制空气质量日历图

    使用Python绘制空气质量日历图

    这篇文章主要介绍了使用Python绘制空气质量日历图,文章基于Python绘制的相关知识展开对空气质量日历图的绘制,感兴趣的小伙伴可以参考一下
    2022-05-05
  • python基础教程项目五之虚拟茶话会

    python基础教程项目五之虚拟茶话会

    这篇文章主要为大家详细介绍了python基础教程项目五之虚拟茶话会,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-04-04
  • python pandas数据处理之删除特定行与列

    python pandas数据处理之删除特定行与列

    Pandas是数据科学中的利器,你可能想到的数据处理骚操作,貌似用Pandas都能够实现,下面这篇文章主要给大家介绍了关于python pandas数据处理之删除特定行与列的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决

    不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决

    这篇文章主要给大家介绍了关于不同版本中Python matplotlib.pyplot.draw()界面绘制异常问题的解决方法,文中介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09
  • python3.6下Numpy库下载与安装图文教程

    python3.6下Numpy库下载与安装图文教程

    这篇文章主要为大家详细介绍了python Numpy库下载与安装图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-04-04
  • Python代码模拟CPU工作原理

    Python代码模拟CPU工作原理

    Python代码来实现一个最简单的CPU。用代码模拟大的部件,使大家从原理上理解CPU工作。使它可编程,支持加减法运算、读写内存、无条件跳转、条件跳转的功能。
    2023-01-01
  • Python实现检测服务器是否可以ping通的2种方法

    Python实现检测服务器是否可以ping通的2种方法

    这篇文章主要介绍了Python实现检测服务器是否可以ping通的2种方法,本文分别讲解了使用ping和fping命令检测服务器是否可以ping通,需要的朋友可以参考下
    2015-01-01
  • python3中sys.argv的实例用法

    python3中sys.argv的实例用法

    在本篇文章里小编给大家分享的是关于python3中sys.argv的实例用法内容,需要的朋友们可以学习下。
    2020-04-04
  • Python如何使用带有 for 循环的 Lambda 函数

    Python如何使用带有 for 循环的 Lambda 函数

    这篇文章主要介绍了如何在 Python 中使用带有 for 循环的 Lambda 函数,使用 Lambda 函数配合 for 循环可以让代码变得更加简洁,但需要注意的是,Lambda 函数在语法上有一些限制,如果需要更复杂的逻辑,还需要使用普通函数,感兴趣的朋友跟随小编一起学习吧
    2023-05-05
  • 用python结合jieba和wordcloud实现词云效果

    用python结合jieba和wordcloud实现词云效果

    词云,顾名思义就是很多个单词,然后通过出现的频率或者比重之类的标准汇聚成一个云朵的样子嘛,其实呢现在网上已经有很多能自动生成词云的工具了,比如Wordle,Tagxedo等等,Python也能实现这样的效果,我们通过jieba库和wordcloud库也能十分轻松的完成词云的构建
    2017-09-09

最新评论