程序员宝藏库:https://github.com/Jackpopc/CS-Books-Store

你最喜欢哪款流程图绘制工具?

draw.io、Visio、OmniGraffle等等,不同的用户会有不同的选择。

那么,你是否想过利用一段Python代码绘制一幅流程图?

最近,我留意到Github 上一个名为Diagrams的项目,可以用Python代码绘制云系统架构图。

它的诞生是为没有任何设计工具的新系统架构设计提供原型,可以绘制可视化系统架构。

Diagrams目前主要的提供商包括AWS,Azure,GCP,Kubernetes,阿里云,Oracle云等。

图表使您可以用Python代码绘制云系统架构。它的诞生是为没有任何设计工具的新系统架构设计提供原型。您还可以描述或可视化现有的系统架构。图表目前支持主要的主要提供商,包括:AWS,Azure,GCP,Kubernetes,阿里云,Oracle云等。它还支持本地节点,SaaS,以及其他的编程框架和语言。

今天,就来手把手教各位使用Python代码绘制一幅精美的流程图。

安装配置

环境配置

Diagrams的使用需要Python版本在3.6以上,而且,需要事先安装GraphViz,这主要用于绘制图表。然后,需要安装Diagrams工具包。

安装GraphViz

在Linux下,可以使用包管理工具直接安装,以Ubuntu为例,

$ sudo apt install graphviz

在Fedora、Redhat、CentOS下可以使用yum进行安装。

Windows下可以使用winget、choco进行安装,以winget为例,

$ winget install graphviz

在Mac系统下,可以使用Homebrew进行安装:

$ brew install graphviz

安装Diagrams

作为一款Python工具包,Diagrams的安装相对简单很多,可以直接通过pippipenvpoetry这些包管理工具进行安装,

# using pip (pip3)
$ pip install diagrams

# using pipenv
$ pipenv install diagrams

# using poetry
$ poetry add diagrams

到此为止,就完成了Diagrams绘图环境的配置。

使用

组件类型

Diagrams支持来自AWS,Azure,GCP,Kubernetes,阿里云,Oracle云不同提供商的图表图。

因此,可以使用来自AWS,Azure,GCP,Kubernetes,阿里云,Oracle云、k8s等不同的组件类型。

绘图

要想绘制流程图,首先要抽象出一幅图表中的一些关键要素:

  • 图表—图表是表示图表的主要对象
  • 节点-代表单个系统组件的抽象概念
  • 群组-允许您将节点组织到组中,而不是孤立的组件中
  • 边—表示节点之间的连接

上述4点,就是绘制图表中关键的4个要素。在后续绘图过程中,就是把这几项要素组合在一起。

现在开始,你可以利用Python进行绘制图表了!

第一步:创建图表工作区

from diagrams import Diagram

with Diagram("Simple Website Diagram") as diag:
    pass
diag

这样,会创建一个带有指定标签的空白图,如下所示:

img

第二步:添加节点

现在我们有了工作区,现在该添加网站所需的节点了。

我们要添加的节点来自两个不同的提供程序, AWS和OnPrem提供程序。

from diagrams import Diagram, Cluster
from diagrams.aws.compute import EC2
from diagrams.aws.network import ELB
from diagrams.aws.network import Route53
from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.database
from diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.database

with Diagram("Simple Website Diagram") as diag:
    dns = Route53("dns")
    load_balancer = ELB("Load Balancer")
    database = PostgreSQL("User Database")
    cache = Redis("Cache")
    svc_group = [EC2("Webserver 1"),
                 EC2("Webserver 2"),
                 EC2("Webserver 3")]
diag

这时,你会看到,它不再是空白图表。

我们每个节点都被绘制出来了,这些就是我们要构建的体系结构的“要素”。

下一步将是将我们的某些节点组织为逻辑分组,然后将每个节点与边链接起来。

img

第三步:节点分组

在此示例中,我们将对负载平衡的Web服务器进行分组。

在下面您可以看到,要做到这一点,我们只需要将节点的实例移动到我们正在创建的集群范围内即可。

from diagrams import Diagram, Cluster
from diagrams.aws.compute import EC2
from diagrams.aws.network import ELB
from diagrams.aws.network import Route53
from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.database
from diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.database

with Diagram("Simple Website Diagram") as diag:
    dns = Route53("dns")
    load_balancer = ELB("Load Balancer")
    database = PostgreSQL("User Database")
    cache = Redis("Cache")
    with Cluster("Webserver Cluster"):
        svc_group = [EC2("Webserver 1"),
                    EC2("Webserver 2"),
                    EC2("Webserver 3")]
diag

如你所见,该图仍然只是节点列表,但是现在我们将适当的节点聚类为逻辑分组。

img

第四步:连接节点

现在就到了最后一步,我们把孤立的节点连接到一起。

from diagrams import Diagram, Cluster
from diagrams.aws.compute import EC2
from diagrams.aws.network import ELB
from diagrams.aws.network import Route53
from diagrams.onprem.database import PostgreSQL # Would typically use RDS from aws.database
from diagrams.onprem.inmemory import Redis # Would typically use ElastiCache from aws.database

with Diagram("Simple Website Diagram", direction='LR') as diag: # It's LR by default, but you have a few options with the orientation
    dns = Route53("dns")
    load_balancer = ELB("Load Balancer")
    database = PostgreSQL("User Database")
    cache = Redis("Cache")
    with Cluster("Webserver Cluster"):
        svc_group = [EC2("Webserver 1"),
                    EC2("Webserver 2"),
                    EC2("Webserver 3")]
    dns >> load_balancer >> svc_group
    svc_group >> cache
    svc_group >> database
diag

生成的图像可以在下面看到,现在你可以看到图中每个节点之间的逻辑流程。

可以通过更改定义节点的顺序来改变此流程。

除了调整流程外,你还可以更改许多内容,因为边对象包含三个属性:标签,颜色和样式。

针对这些细节,在这里不再赘述,感兴趣的同学可以访问文档进行详细了解。

img

结语

从前面结果可以看出,绘制的架构图是非常美观的,而且从实现逻辑来看,只需不到20行代码即可完成。实现方法非常简单,后期调整也非常轻松。

如果你对自动绘图感兴趣,不妨可以尝试一下。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐