图表让您可以在 Python 代码中绘制云系统架构,它的诞生是为了在没有任何设计工具的情况下对新的系统架构进行原型设计。您还可以描述或可视化现有系统架构,Diagram as Code允许您跟踪任何版本控制系统中的架构图更改。相比于在 UI 上面对各种图标进行拖拽和调整,这种方式更符合我们程序员的使用习惯。
安装它需要Python 3.6或更高版本,请先检查您的 Python 版本。
它使用Graphviz来呈现图表,因此您需要安装 Graphviz才能使用图表。安装 graphviz(或已经安装)后,安装图表。

brew install graphviz如果您使用的是Homebrew,macOS 用户可以通过以下方式下载 Graphviz 。同样,安装Chocolatey的 Windows 用户可以运行choco install graphviz.
# using pip (pip3)$ pip install diagrams# using pipenv$ pipenv install diagrams# using poetry$ poetry add diagrams
快速开始

# diagram.pyfrom diagrams import Diagramfrom diagrams.aws.compute import EC2from diagrams.aws.database import RDSfrom diagrams.aws.network import ELBwith Diagram("Web Service", show=False): ELB("lb") >> EC2("web") >> RDS("userdb")
此代码生成如下图:
$ python diagram.py
AWS 上的分组工作人员
from diagrams import Diagramfrom diagrams.aws.compute import EC2from diagrams.aws.database import RDSfrom diagrams.aws.network import ELBwith Diagram("Grouped Workers", show=False, direction="TB"): ELB("lb") >> [EC2("worker1"), EC2("worker2"), EC2("worker3"), EC2("worker4"), EC2("worker5")] >> RDS("events")
集群 Web 服务
from diagrams import Cluster, Diagramfrom diagrams.aws.compute import ECSfrom diagrams.aws.database import ElastiCache, RDSfrom diagrams.aws.network import ELBfrom diagrams.aws.network import Route53with Diagram("Clustered Web Services", show=False): dns = Route53("dns") lb = ELB("lb") with Cluster("Services"): svc_group = [ECS("web1"), ECS("web2"), ECS("web3")] with Cluster("DB Cluster"): db_primary = RDS("userdb") db_primary - [RDS("userdb ro")] memcached = ElastiCache("memcached") dns >> lb >> svc_group svc_group >> db_primary svc_group >> memcached
AWS 上的事件处理
from diagrams import Cluster, Diagramfrom diagrams.aws.compute import ECS, EKS, Lambdafrom diagrams.aws.database import Redshiftfrom diagrams.aws.integration import SQSfrom diagrams.aws.storage import S3with 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
图表
图表示全局图上下文,您可以使用 Diagram 类创建图表上下文。Diagram 构造函数的第一个参数将用于输出文件名。
from diagrams import Diagramfrom diagrams.aws.compute import EC2with Diagram("Simple Diagram"): EC2("web")
如果您使用以下命令运行上述脚本
$ python diagram.py
它将在您的工作目录上生成一个带有单个EC2节点的图像文件,并立即打开该创建的图像文件。simple_diagram.png
节点
节点是一个抽象概念,表示单个系统组件的对象,一个节点对象由三部分组成:提供者、资源类型和名称。您可能已经看过前面示例中的每个部分
from diagrams import Diagramfrom diagrams.aws.compute import EC2with Diagram("Simple Diagram"): EC2("web")
在上面的例子中,是提供者提供的资源类型EC2的节点。computeaws您可以以类似的方式使用其他节点对象,例如:
# aws resourcesfrom diagrams.aws.compute import ECS, Lambdafrom diagrams.aws.database import RDS, ElastiCachefrom diagrams.aws.network import ELB, Route53, VPC...# azure resourcesfrom diagrams.azure.compute import FunctionAppsfrom diagrams.azure.storage import BlobStorage...# alibaba cloud resourcesfrom diagrams.alibabacloud.compute import ECSfrom diagrams.alibabacloud.storage import ObjectTableStore...# gcp resourcesfrom diagrams.gcp.compute import AppEngine, GKEfrom diagrams.gcp.ml import AutoML ...# k8s resourcesfrom diagrams.k8s.compute import Pod, StatefulSetfrom diagrams.k8s.network import Servicefrom diagrams.k8s.storage import PV, PVC, StorageClass...# oracle resourcesfrom diagrams.oci.compute import VirtualMachine, Containerfrom diagrams.oci.network import Firewallfrom diagrams.oci.storage import FileStorage, StorageGateway
数据流
您可以通过使用以下运算符连接节点来表示数据流>>:<<和-。
>> : 从左到右连接节点。<< : 从右到左连接节点。-:无方向连接节点。无向的。from diagrams import Diagramfrom diagrams.aws.compute import EC2from diagrams.aws.database import RDSfrom diagrams.aws.network import ELBfrom diagrams.aws.storage import S3with 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")
集群
Cluster 表示本地集群上下文,您可以使用 Cluster 类创建集群上下文。您还可以将集群中的节点连接到集群外的其他节点。
from diagrams import Cluster, Diagramfrom diagrams.aws.compute import ECSfrom diagrams.aws.database import RDSfrom diagrams.aws.network import Route53with Diagram("Simple Web Service with DB Cluster", show=False): dns = Route53("dns") web = ECS("service") with Cluster("DB Cluster"): db_primary = RDS("primary") db_primary - [RDS("replica1"), RDS("replica2")] dns >> web >> db_primary
边缘
Edge 是一个对象,表示具有一些附加属性的节点之间的连接。边缘对象包含三个属性:标签、颜色和样式,它们反映了相应的 graphviz 边缘属性。
from diagrams import Cluster, Diagram, Edgefrom diagrams.onprem.analytics import Sparkfrom diagrams.onprem.compute import Serverfrom diagrams.onprem.database import PostgreSQLfrom diagrams.onprem.inmemory import Redisfrom diagrams.onprem.aggregator import Fluentdfrom diagrams.onprem.monitoring import Grafana, Prometheusfrom diagrams.onprem.network import Nginxfrom diagrams.onprem.queue import Kafkawith 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"): primary = Redis("session") primary \ - Edge(color="brown", style="dashed") \ - Redis("replica") \ << Edge(label="collect") \ << metrics grpcsvc >> Edge(color="brown") >> primary with Cluster("Database HA"): primary = PostgreSQL("users") primary \ - Edge(color="brown", style="dotted") \ - PostgreSQL("replica") \ << Edge(label="collect") \ << metrics grpcsvc >> Edge(color="black") >> primary 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
—END—
开源协议:MIT License
开源地址:https://github.com/mingrammer/diagrams