
你是不是也有这样的困扰?
每次要画系统架构图,都得打开Visio或者Draw.io,一个个拖组件、画连线,折腾半天。
好不容易画完了,架构一改又得重来。
说实话,我之前也是这样。
直到我发现了一个神器——Python的diagrams库,从此告别手动画图。
简单来说,就是用代码生成架构图。
你只需要几行Python代码,就能生成专业的云服务架构图。
不用再手动拖拽组件,不用再调整布局,代码写完,图就出来了。
就像写文档一样自然。
代码就是最好的架构文档。
先安装两个东西:Python和GraphViz。
安装命令:
# macOS / Linuxsudo apt-get install graphviz # Ubuntu/Debianbrew install graphviz # macOS# Windows → 下载 MSI:https://graphviz.org/download/pip install -U diagrams graphviz验证是否安装成功:
dot -V>>> dot - graphviz version 8.1.0 (20230707.0739)diagrams库有几个核心概念,一学就会:
Diagram | with Diagram(...) | |
Node | EC2("web") | |
Cluster | with Cluster("DMZ"): | |
Edge | >>- | |
Custom | Custom("CDN", "./cdn.png") |
不用记,用多了就熟了。
咱们画一个微服务架构图,包含API网关、用户服务和订单服务。
代码是这样的:
from diagrams import Diagram, Clusterfrom diagrams.aws.compute import ECSfrom diagrams.aws.network import APIGateway, ELBfrom diagrams.aws.database import RDS, ElastiCachefrom diagrams.aws.storage import S3from diagrams.aws.security import WAFwith Diagram("Microservice Architecture", show=True, direction="LR", filename="micro"): waf = WAF("WAF") api = APIGateway("API Gateway") with Cluster("User Service"): user_lb = ELB("User-LB") user_ecs = ECS("User-API") user_db = RDS("User-DB") user_cache = ElastiCache("Redis") user_lb >> user_ecs >> user_cache user_ecs >> user_db with Cluster("Order Service"): order_lb = ELB("Order-LB") order_ecs = ECS("Order-API") order_db = RDS("Order-DB") order_lb >> order_ecs >> order_db storage = S3("Static/Avatar") user_ecs >> storage order_ecs >> storage waf >> api >> user_lb waf >> api >> order_lb运行一下:
python 00_microservice.py# 生成 micro.png(高清,4000×1800)你看,就这么简单。
一个包含WAF、API网关、两个微服务集群(各自有负载均衡、服务实例、数据库、缓存)以及共享存储的架构图就生成了。
用EventBridge、SQS和Lambda组合,画一个事件驱动的架构:
from diagrams import Diagramfrom diagrams.aws.compute import Lambdafrom diagrams.aws.database import DynamoDBfrom diagrams.aws.integration import SQS, Eventbridgewith Diagram("Event-Driven", show=True, direction="TB"): bus = Eventbridge("EventBridge") queue = SQS("Order Queue") producer = Lambda("Producer") consumer = Lambda("Consumer") db = DynamoDB("Order DB") producer >> bus >> queue >> consumer >> db db << producer # 双向连接AWS、GCP、Azure三家云服务放在一起:
from diagrams import Diagram, Cluster, Edgefrom diagrams.aws.compute import EC2from diagrams.gcp.compute import ComputeEnginefrom diagrams.azure.compute import VirtualMachinesfrom diagrams.onprem.network import Internetwith Diagram("Hybrid-Cloud", show=True): inet = Internet("Internet") with Cluster("AWS"): aws_vpc = EC2("EC2-VPC") with Cluster("GCP"): gcp_vpc = ComputeEngine("GCE-VPC") with Cluster("Azure"): az_vpc = VirtualMachines("VM-VNet") inet >> [aws_vpc, gcp_vpc, az_vpc] aws_vpc - Edge(label="IPSec VPN") - gcp_vpc gcp_vpc - Edge(label="专线") - az_vpcAPI Gateway + Cognito + Lambda + DynamoDB:
from diagrams import Diagramfrom diagrams.aws.compute import Lambdafrom diagrams.aws.database import DynamoDBfrom diagrams.aws.network import APIGatewayfrom diagrams.aws.security import Cognitowith Diagram("Serverless Backend", show=True): api = APIGateway("API") auth = Cognito("Auth") func = Lambda("Lambda") db = DynamoDB("DynamoDB") api >> auth >> func >> db还有CI/CD流水线、自定义图标、多层架构等等,玩法太多写不完。
给你几个我常用的技巧:
保持简洁:别在一张图里塞太多东西,太乱了就拆成多张。
逻辑分组:用Cluster把相关的组件包在一起,一眼就能看懂。
一致方向:统一从左到右或者从上到下,别一会儿横一会儿竖。
版本控制:图表代码和项目代码放一起,用Git管理,改架构有历史记录。
自动化生成:把图表生成集成到CI/CD流程里,每次发布自动更新文档。
说实话,我为什么这么喜欢diagrams这个库?
因为它解决了一个痛点:架构文档和代码不同步。
传统的架构图是静态的,代码改了,图忘了改,文档就过期了。
用diagrams,架构图就是代码。
代码更新了,重新运行一下,架构图就自动更新了。
架构文档永远和代码保持同步。
这就是我说的:代码就是最好的架构文档。
💬 你平时怎么画架构图?用的什么工具?评论区聊聊~
https://ima.qq.com/wiki/?shareId=f2628818f0874da17b71ffa0e5e8408114e7dbad46f1745bbd1cc1365277631c
