
你是不是也有这样的困扰?
每次要画系统架构图,都得打开Visio或者Draw.io,一个个拖组件、画连线,折腾半天。
好不容易画完了,架构一改又得重来。
说实话,我之前也是这样。
直到我发现了一个神器——Python的diagrams库,从此告别手动画图。
简单来说,就是用代码生成架构图。
你只需要几行Python代码,就能生成专业的云服务架构图。
不用再手动拖拽组件,不用再调整布局,代码写完,图就出来了。
就像写文档一样自然。
代码就是最好的架构文档。
先安装两个东西:Python和GraphViz。
安装命令:
# macOS / Linux
sudo apt-get install graphviz # Ubuntu/Debian
brew 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, Cluster
from diagrams.aws.compute import ECS
from diagrams.aws.network import APIGateway, ELB
from diagrams.aws.database import RDS, ElastiCache
from diagrams.aws.storage import S3
from diagrams.aws.security import WAF
with 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 Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.database import DynamoDB
from diagrams.aws.integration import SQS, Eventbridge
with 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, Edge
from diagrams.aws.compute import EC2
from diagrams.gcp.compute import ComputeEngine
from diagrams.azure.compute import VirtualMachines
from diagrams.onprem.network import Internet
with 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 Diagram
from diagrams.aws.compute import Lambda
from diagrams.aws.database import DynamoDB
from diagrams.aws.network import APIGateway
from diagrams.aws.security import Cognito
with 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,架构图就是代码。
代码更新了,重新运行一下,架构图就自动更新了。
架构文档永远和代码保持同步。
这就是我说的:代码就是最好的架构文档。
💬 你平时怎么画架构图?用的什么工具?评论区聊聊~
如果你觉得这篇文章有用,欢迎点赞、转发、收藏、留言、推荐❤!
本文分享自 Nicholas与Pypi 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!