动手教程,停止手动花费时间调整未对齐的箭头

  一些背景故事

  本周早些时候,我偶然发现了一个具有引人注目的有意思的Python库。 该库称为diagrams,并以其同名状态创建图。 生成的这些图通常是我将笨拙地将图像粘贴到draw.io或Google Diagrams中创建的,然后浪费大量时间正确对齐所有内容。 除了这个烦人的过程之外,当我以后需要更新这些图时,仅需要对体系结构进行一些更改,就需要举升和移动一半以上的组件。 在进一步调查图书馆之后,我能够看到它能够减轻我这边的痛苦。

  自己的图入门

  开始构建其中一些图的第一个要求是安装Python 3.6或更高版本。 在这种情况下,您将需要安装GraphViz,因为这就是绘制图表的方式。 Github存储库实际上也有相当不错的"入门"部分,因此,如果您需要安装任何内容的帮助,请随时在此处引用。 一旦使用您最喜欢的Python软件包管理器安装了" diagrams"库,就可以开始创建了。

  对于我来说,因为满足了初始要求,所以它就像以下命令一样容易。

  组件类型

  图表库为许多不同的提供程序提供了组件。 在14个可用案例中,以下可能与大多数用例最相关。

  · AWS / GCP / Azure-这些提供商公开了您将在利用任何主要云提供商之一的任何图中使用的官方云服务资产。 我的团队主要在GCP中工作,在遍历该库之前,我将花费数小时手动构建这些图,因此当我发现这些节点资产触手可及时,我感到非常兴奋。

  · 通用和内部部署—如果您想以与云无关的方式来说明基础技术,则这些节点可能会一起使用。 例如,在显示的Google DataFlow上为架构提供Beam组件。

  · 框架-如果您想用编程语言说明节点,这些组件将非常有用。

  · SaaS —甚至还有一组可以使用的SaaS节点,当您想证明架构中的通知已落入诸如Slack之类的内容时,它就派上用场了。

  图的概念

  图表—图表是表示图表的主要对象。

  节点-代表单个系统组件的抽象概念。

  群集-允许您将节点组织成组(或群集),而不是孤立的组件。

  边缘—表示节点之间的链接。

  您的第一个图表

  既然您已经知道了基本概念,就可以按照我们学习这些概念的顺序,使用代码构建极其简单的图表。 我们将构建的示例图将是AWS上的一个简单负载平衡网站,该网站使用PostgreSQL数据库和Redis缓存,因此我们可以使用多个组件提供程序。

  步骤1:创建图工作区

from diagrams import Diagram
  with Diagram("Simple Website Diagram") as diag:
  pass
  diag # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.

  这将仅显示带有指定标签的空白图,如下所示。

  

python做结构方程模型 python画结构图_python

  > Build with the code from the gist linked here.

  步骤2:添加节点

  现在我们有了工作区,现在该添加网站所需的节点了。 我们要添加的节点来自两个不同的提供程序。 AWS和OnPrem提供程序。 如果您是真正做到这一点,则可能会坚持使用AWS,因为它们可能会与该云提供商一起使用RDS和ElastiCache等产品。

from diagrams import Diagram, Cluster
  from diagrams.awspute 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 # This will illustrate the diagram if you are using a Google Colab or Jypiter notebook.

  如您所见,我们不再有空白图表。 我们每个节点都被描绘了,这些就是我们要构建的体系结构的"要素"。 下一步将是将我们的某些节点组织为逻辑分组,然后将每个节点与边链接起来。

  

python做结构方程模型 python画结构图_python做结构方程模型_02

  > Build with the code from the gist linked here.

  步骤3:将节点分组(可选)

  在此示例中,我们将对负载平衡的Web服务器进行分组。 在过去创建的大量图表中,这并非总是必要的,但是随着您的体系结构的发展,将这些节点分组到群集中通常可以提高可读性。

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

 

from diagrams import Diagram, Cluster
  from diagrams.awspute 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

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

  

python做结构方程模型 python画结构图_python做结构方程模型_03

  > Build with the code from the gist linked here.

  步骤4:将所有内容连接在一起

  在最后一步中,我们将不会链接刚刚安排要在架构中使用的节点。 当我需要更新或调整架构时,此任务使我花费的时间最长。 如果您在下面看一下,只需用双箭头定义流到每个节点的流程就可以了! 在此示例中,我们将仅链接不带标签的节点,但是如果您看一下将标签应用于链接的文档,这是一项非常简单的任务。

from diagrams import Diagram, Cluster
  from diagrams.awspute 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

  生成的图像可以在下面看到,现在您可以看到图中每个节点之间的逻辑流程。 可以通过更改定义节点的顺序来逆转此流程。 除了调整流程外,您还可以更改许多内容,因为边缘对象包含三个属性:标签,颜色和样式。 我们不会在这里介绍如何柚木。 如果您有兴趣了解更多信息,请参见本文结尾处的文档链接,并且这些属性反映了对应的graphviz边缘属性,如果您过去使用该工具可以简化事情。

  

python做结构方程模型 python画结构图_开发语言_04

  > Build with the code from the gist linked here.

  结论

  现在,您已下定决心用代码构建漂亮的图,在涉及自动化的可能性以及利用体系结构图的常规维护节省时间的情况下,利用此工作流程有很大的潜力。

  单独使用此工具节省的时间将使我将来使用这种方法。 我当然不会错过对图进行手动调整,仔细对齐组件和箭头以及我的体系结构的每次迭代所涉及的工作。

  我希望我的经验对使用代码构建图很有兴趣,并且对将来的图表工作很有用。 谢谢阅读!