序
最近发现一个画架构图的神器diagrams,提供了很多云厂商及开源组件的图标,相比于C4-PlantUML显得更专业一点。
之前写过技术文档画图工具箱,diagrams属于diagram as code工具派别。
mac安装
brew install graphviz pip install diagrams brew install [email protected]
示例1
from diagrams import Diagram from diagrams.aws.compute import EC2 from diagrams.aws.database import RDS from diagrams.aws.network import ELB # python aws_example.py with Diagram("Grouped Workers", show=False, direction="TB"): ELB("lb") >> [EC2("worker1"), EC2("worker2"), EC2("worker3"), EC2("worker4"), EC2("worker5")] >> RDS("events")
执行python example.py即可以在当前目录生成png图片。
示例2
from diagrams import Cluster, Diagram from diagrams.aws.compute import ECS from diagrams.aws.database import ElastiCache, RDS from diagrams.aws.network import ELB from diagrams.aws.network import Route53 with 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
基本语法就是import node,以with Diagram开始,之后声明组件,然后使用with来进行分组,最后通过>>来串联。
默认文件名是Diagram名,空格替换为下划线,可以用filename指定。
图片格式默认是png,可以用outformat=[“jpg”, “png”, “dot”]来指定要生成的图片类型。
show默认为True,也就是python生成完图片会默认打开图片。
k8s示例
from diagrams import Cluster, Diagram from diagrams.k8s.compute import Pod, StatefulSet from diagrams.k8s.network import Service from diagrams.k8s.storage import PV, PVC, StorageClass with Diagram("Stateful Architecture", show=False): with Cluster("Apps"): svc = Service("svc") sts = StatefulSet("sts") apps = [] for _ in range(3): pod = Pod("pod") pvc = PVC("pvc") pod - sts - pvc apps.append(svc >> pod >> pvc) apps << PV("pv") << StorageClass("sc")
开源组件示例
from diagrams import Cluster, Diagram from diagrams.onprem.analytics import Spark from diagrams.onprem.compute import Server from diagrams.onprem.database import PostgreSQL from diagrams.onprem.inmemory import Redis from diagrams.onprem.aggregator import Fluentd from diagrams.onprem.monitoring import Grafana, Prometheus from diagrams.onprem.network import Nginx from diagrams.onprem.queue import Kafka with Diagram("Advanced Web Service with On-Premise", show=False): ingress = Nginx("ingress") metrics = Prometheus("metric") metrics << Grafana("monitoring") with Cluster("Service Cluster"): grpcsvc = [ Server("grpc1"), Server("grpc2"), Server("grpc3")] with Cluster("Sessions HA"): primary = Redis("session") primary - Redis("replica") << metrics grpcsvc >> primary with Cluster("Database HA"): primary = PostgreSQL("users") primary - PostgreSQL("replica") << metrics grpcsvc >> primary aggregator = Fluentd("logging") aggregator >> Kafka("stream") >> Spark("analytics") ingress >> grpcsvc >> aggregator
主要结构
node
# aws resources from diagrams.aws.compute import ECS, Lambda from diagrams.aws.database import RDS, ElastiCache from diagrams.aws.network import ELB, Route53, VPC ... # azure resources from diagrams.azure.compute import FunctionApps from diagrams.azure.storage import BlobStorage ... # alibaba cloud resources from diagrams.alibabacloud.compute import ECS from diagrams.alibabacloud.storage import ObjectTableStore ... # gcp resources from diagrams.gcp.compute import AppEngine, GKE from diagrams.gcp.ml import AutoML ... # k8s resources from diagrams.k8s.compute import Pod, StatefulSet from diagrams.k8s.network import Service from diagrams.k8s.storage import PV, PVC, StorageClass ... # oracle resources from diagrams.oci.compute import VirtualMachine, Container from diagrams.oci.network import Firewall from diagrams.oci.storage import FileStorage, StorageGateway
完整版见nodes
数据流及布局
>>表示从左到右连接<<表示从右到左连接-表示无方向的连接
Diagram有个属性direction来表示整体布局,可选的值有TB, BT, LR及RL,默认是LR,即从左到右
TB: top to bottom
BT: bottom to top
LR: left to right
RL: right to left
Cluster用于分组,也支持内嵌,比如
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")]
连接符之间可以用Edge来衔接,用于个性化处理边的属性,比如
metrics = Prometheus("metric") metrics << Edge(color="firebrick", style="dashed") << Grafana("monitoring")