1.前言昨天发现了一个非常不错的云系统架构原型图制作库Diagrams。通过它,我们可以用代码画出诸如阿里云、AWS、Azure、K8S等系统架构原型图。比起在UI上拖拽调整各种图标,这种方式更符合我们程序员的使用习惯。这篇文章不仅介绍了这个库,还想说说我是如何参与这个库来支持阿里云资源的。2.安装Diagrams使用Graphviz渲染图表。您需要在安装图表之前安装Graphviz。macOS用户(如果使用Homebrew)可以使用brewinstallgraphviz安装Graphviz。安装图的方法有很多,包括pip、pipenv和poetry:#使用pip(pip3)$pipinstalldiagrams#使用pipenv$pipenvinstalldiagrams#使用poetry$poetryadddiagrams3.快速启动#diagram.pyfromdiagramsimportDiagramfromdiagrams.alibabacloud.networkimportSLBfromdiagrams.alibabacloud.computeimportECSfromdiagrams.alibabacloud.databaseimportRDSwithDiagram("WebService",show=False):SLB("lb")>>ECS("web")>>RDS("userdb")执行后,可以生成如下架构图:$pythondiagram.py四、guideDiagrams库非常容易掌握,我们只需要掌握三个概念就可以轻松画出云系统架构图:Diagram:这是表示图的主要对象,表示一个架构图Node:表示一个节点或系统组件,比如快速入门中的SLB、ECS、RDS都是架构图中的节点Cluster:表示一个集群或组,并且多个节点是放在集群中4.1DiagramDiagram使用Diagram类创建一个图环境上下文,使用with语法来使用这个上下文。Diagram的第一个参数是将用作架构图的名称和输出图像文件名(转换为小写+下划线)。fromdiagramsimportDiagramfromdiagrams.aws.computeimportEC2withDiagram("SimpleDiagram"):EC2("web")运行上面的代码会生成一个包含EC2节点的架构图,保存在当前的simple_diagram.png中。Diagram类还支持如下参数:outformat:指定输出图片的类型,默认为png,可以是png、jpg、svg、pdfshow:指定是否显示图片,默认为Falsegraph_attr、node_attr、edge_attr:指定Graphviz属性选项,控制Diagram、点、线样式,详见参考链接4.2Node节点Diagrams目前支持AWS、Azure、AlibabaCloud、GCP、K8S五种云资源节点。节点之间的关系用运算符表示,有:>>:左节点指向右节点<<:右节点指向左节点-:节点之间相互连接,没有方向性以下是一个示例:fromdiagramsimportDiagramsfromdiagrams.aws.computeimportEC2fromdiagrams.aws.databaseimportRDSfromdiagrams.aws.networkimportELBfromdiagrams.aws.storageimportS3withDiagram("WebServices",show=False):ELB(“lb”)>>EC2(“web”)>>RDS(“userdb”)>>S3(“store”)ELB(“lb”)>>EC2(“web”)>>RDS(“userdb”)<>EC2("web"))-EC2("web")>>RDS("userdb")Diagrams不仅支持单个的关系建立节点,也支持一组节点与其他节点的关系建立,使用列表来表示一组节点。示例如下:fromdiagramsimportDiagramfromdiagrams.aws.computeimportEC2fromdiagrams.aws.databaseimportRDSfromdiagrams.aws.networkimportELBwithDiagram("GroupedWorkers",show=False,direction="TB"):ELB("lb")>>[EC2("worker1"),EC2("worker2"),EC2("worker3"),EC2("worker4"),EC2("worker5")]>>RDS("events")4.3cluster/GroupCluster当我们需要在架构图上标明几个节点属于一个集群时,就会用到Cluster。与Diagram的使用方式类似,它也是一个上下文管理器,使用with语法。示例如下:fromdiagramsimportCluster,Diagramfromdiagrams.aws.computeimportECSfromdiagrams.aws.databaseimportRDSfromdiagrams.aws.networkimportRoute53withDiagram("SimpleWebServicewithDBCluster",show=False):dns=Route53("dns")web=ECS("service")withCluster("DBCluster"):db_master=RDS("master")db_master-[RDS("slave1"),RDS("slave2")]dns>>web>>db_masterDiagrams还支持插件群,只需要插件使用withCluster()即可:fromdiagramsimportCluster,Diagramsfromdiagrams.aws.computeimportECS,EKS,Lambdafromdiagrams.aws.databaseimportRedshiftfromdiagrams.aws.integrationimportSQSfromdiagrams.aws.storageimportS3withDiagram("EventProcessing",show=False):source=EKS("k8ssource")withCluster("EventFlows"):withCluster("EventWorkers"):工人=[ECS("worker1"),ECS("worker2"),ECS("worker3")]queue=SQS(“事件队列”)与集群(“处理”):处理程序=[Lambda(“proc1”),Lambda(“proc2”),Lambda(“proc3”)]store=S3(“事件存储”)dw=Redshift("analytics")source>>workers>>queue>>handlershandlers>>storehandlers>>dw5.我是如何贡献代码的当我看到Diagrams库时,我非常兴奋。我们画图有两种方式,一种是通过UI来画,一种是通过DSL来制作。在流程图和时序图方面,PlantUML是我最喜欢的DSL。但是,在云系统架构图方面,之前一直没有找到相关的库,直到看到Diagrams。当我看到Diagrams时,它只支持AWS、Azure、GCP和K8S。我心想,怎么可能没有阿里云呢?我不能再使用这么好的图书馆了。既然如此,还不如自己动手,丰衣足食。看完Diagrams的代码,你会发现写的真的很好,代码清晰简洁,还提供了完善的脚手架。对于它支持的云提供商(比如AWS),当我们要更新里面的资源时,只需要更新resources/aws文件夹下的资源镜像,然后执行./autogen.sh即可。./autogen.sh会对resources/做以下事情:将特定云提供者的svg图片转为png将特定云提供者的图片调整为圆角图片自动生成节点类代码自动生成文档使用黑色格式为自动生成的代码不支持云提供商(比如阿里云),需要修改脚手架和配置文件支持新的云提供商,然后按照上面的方法。具体的变化可以在这个PR中找到。参与开源项目其实就是这么简单。当你发现无法满足你的需求时,你可以阅读它的源码了解实现原理,然后自己实现需求,最后提交PR给作者。