图表即代码:使用 Diagrams 制作云系统架构原型图

本文涉及的产品
传统型负载均衡 CLB,每月750个小时 15LCU
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: ## 一、前言 昨天发现了一款非常不错的云系统架构原型图制作库 [Diagrams](https://github.com/mingrammer/diagrams "Diagrams"),通过它,我们便可以使用代码的方式绘制诸如阿里云、AWS、Azure、K8S 等系统架构原型图。 相比于在 UI 上对各种图标进行拖拽和调整,这种方式更符合我们程序员的使用习惯。 本文不仅要介绍下

一、前言

昨天发现了一款非常不错的云系统架构原型图制作库 Diagrams,通过它,我们便可以使用代码的方式绘制诸如阿里云、AWS、Azure、K8S 等系统架构原型图。

相比于在 UI 上对各种图标进行拖拽和调整,这种方式更符合我们程序员的使用习惯。

本文不仅要介绍下这个库,也想说说我是如何参与到这个库中以支持阿里云资源。

二、安装

Diagrams 使用 Graphviz 来渲染图表,在安装 diagrams 之前需要先安装 Graphviz

macOS 用户(如果使用 Homebrew)可以使用 brew install graphviz 的方式来安装 Graphviz

安装 diagrams 的方式有多种,通过 pippipenvpoetry 均可:

# 使用 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 库非常容易掌握,我们仅需要掌握三个概念就能轻松绘制云系统架构图:

  • Diagram:这是表示图的最主要的对象,代表一个架构图
  • Node:表示一个节点或系统组件,比如快速开始中的SLBECSRDS都是架构图中的节点
  • 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,可以是 pngjpgsvgpdf
  • show:指定是否显示图片,默认是 False
  • graph_attrnode_attredge_attr:指定 Graphviz 属性选项,用来控制图、点、线的样式,详情查看 参考链接

4.2 节点 Node

目前,Diagrams 支持五类云资源节点,分别是 AWSAzureAlibabaCloudGCPK8S

节点之间的关系使用操作符来表示,分别是:

  • >>:左节点指向右节点
  • <<:右节点指向左节点
  • -:节点互相连接,没有方向

以下是一个例子:

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 不仅支持单个节点的关系建立,还支持一组节点和其他节点的关系建立,使用 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")

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 还支持嵌套集群,只需嵌套使用 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 库时,我感到很兴奋。我们画示意图无外乎两种,一种是通过UI来画,一种是通过DSL来制作。在流程图、时序图方面,PlantUML 是我很喜欢的 DSL,然而在云系统架构图方面,过去确实没发现相关的库,直到看到了 Diagrams

在我看到 Diagrams 时,它还只是支持 AWSAzureGCPK8S,我心想怎么能没有阿里云呢?这么好的库我岂不是用不了了。既然如此,不如自己动手,丰衣足食吧。阅读 Diagrams 的代码,会发现写的还真不错,代码清晰简单,还提供了完善的脚手架。

对于它所支持的云供应商(比如 AWS),当我们想更新里面的资源时,只需要在 resources/aws 文件夹中更新资源图片,然后执行 ./autogen.sh 即可。./autogen.sh 会对 resources/ 做这么几件事:

  • 将特定云供应商的 svg 图片转换为 png
  • 将特定云供应商的图片调整为圆角图片
  • 自动生成节点类代码
  • 自动生成文档
  • 使用 black 格式化自动生成的代码

对于它所不支持的云供应商(比如 AlibabaCloud),则要先修改脚手架和配置文件以支持新的云供应商,然后遵循上面的方法即可。具体改动内容可见 此 PR

参与一个开源项目其实就是这么简单,当你发现满足不了你的需求时,就阅读它的源码以了解实现原理,然后再自己动手实现需求,最后就是向作者提个 PR。

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
数据采集 机器学习/深度学习 大数据
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
这篇文章详细介绍了C3D架构在行为检测领域的应用,包括训练和测试步骤,使用UCF101数据集进行演示。
44 1
行为检测代码(一):超详细介绍C3D架构训练+测试步骤
|
25天前
|
存储 安全 Java
系统安全架构的深度解析与实践:Java代码实现
【11月更文挑战第1天】系统安全架构是保护信息系统免受各种威胁和攻击的关键。作为系统架构师,设计一套完善的系统安全架构不仅需要对各种安全威胁有深入理解,还需要熟练掌握各种安全技术和工具。
69 10
|
1月前
|
机器学习/深度学习 网络架构 计算机视觉
目标检测笔记(一):不同模型的网络架构介绍和代码
这篇文章介绍了ShuffleNetV2网络架构及其代码实现,包括模型结构、代码细节和不同版本的模型。ShuffleNetV2是一个高效的卷积神经网络,适用于深度学习中的目标检测任务。
72 1
目标检测笔记(一):不同模型的网络架构介绍和代码
|
1月前
|
设计模式 人工智能 算法
编程之旅:从代码到架构的感悟
【9月更文挑战第33天】在编程的世界里,代码不仅是实现功能的工具,更是连接思想与现实的桥梁。本文将通过个人的编程经历,分享从编写第一行代码到设计系统架构的旅程,探索编程背后的哲学和技术演变。我们将一起思考,如何在代码的海洋中找到自己的航向,以及在这个过程中如何不断成长和适应变化。
|
1月前
|
机器学习/深度学习 大数据 PyTorch
行为检测(一):openpose、LSTM、TSN、C3D等架构实现或者开源代码总结
这篇文章总结了包括openpose、LSTM、TSN和C3D在内的几种行为检测架构的实现方法和开源代码资源。
44 0
|
2月前
|
机器学习/深度学习 测试技术 数据处理
KAN专家混合模型在高性能时间序列预测中的应用:RMoK模型架构探析与Python代码实验
Kolmogorov-Arnold网络(KAN)作为一种多层感知器(MLP)的替代方案,为深度学习领域带来新可能。尽管初期测试显示KAN在时间序列预测中的表现不佳,近期提出的可逆KAN混合模型(RMoK)显著提升了其性能。RMoK结合了Wav-KAN、JacobiKAN和TaylorKAN等多种专家层,通过门控网络动态选择最适合的专家层,从而灵活应对各种时间序列模式。实验结果显示,RMoK在多个数据集上表现出色,尤其是在长期预测任务中。未来研究将进一步探索RMoK在不同领域的应用潜力及其与其他先进技术的结合。
96 4
|
3月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
102 1
|
3月前
|
设计模式 算法 PHP
深入理解PHP中的数组操作探索编程之美:从代码到架构的思维转变
【8月更文挑战第24天】在PHP编程中,数组是基础且强大的数据结构。本文将通过浅显易懂的方式,介绍如何在PHP中高效地操作数组,包括创建、遍历、排序和过滤等常见任务。无论你是初学者还是有经验的开发者,这篇文章都会带给你新的启示。 【8月更文挑战第24天】在编程的世界中,代码不仅仅是冰冷的字符排列,它承载着思想、解决问题的智慧和创新的灵魂。本文将通过个人的技术感悟,带领读者从编写单一功能的代码片段出发,逐步深入到整个软件架构的设计哲学,探索如何将代码块转化为高效、可维护和可扩展的系统。我们将一起见证,当代码与架构思维相结合时,如何引发技术实践的革命性飞跃。
|
3月前
|
Kubernetes Python 容器
[python]使用diagrams绘制架构图
[python]使用diagrams绘制架构图
|
3月前
|
前端开发 开发者 C#
WPF开发者必读:MVVM模式实战,轻松实现现代桌面应用架构,让你的代码更上一层楼!
【8月更文挑战第31天】在WPF应用程序开发中,MVVM(Model-View-ViewModel)模式通过分离应用程序的逻辑和界面,提高了代码的可维护性和可扩展性。本文介绍了MVVM模式的三个核心组件:Model(数据模型)、View(用户界面)和ViewModel(处理数据绑定和逻辑),并通过示例代码展示了如何在WPF项目中实现MVVM模式。通过这种方式,开发者可以构建更加高效和可扩展的桌面应用程序。
172 0