一、diagrams 库概述
diagrams 是一款基于 Python 的架构图绘制库,无需借助 Visio、ProcessOn、Draw.io 等图形工具,仅通过代码即可快速生成云服务、微服务、Web 服务等架构图。其底层依赖 Graphviz 渲染图像,将代码逻辑转化为结构化图形,支持 AWS、Azure、阿里云、K8s 等主流云平台图标。

该库采用 MIT 开源许可证,可自由商用、修改与分发。优点是代码化绘图、版本可控、集成开发流程,适合程序员快速输出架构图;缺点是复杂自定义图形能力较弱,依赖 Graphviz 环境,过度复杂的流程图绘制效率较低。
二、环境准备与安装
2.1 依赖工具安装
diagrams 本身是 Python 库,但图像渲染依赖 Graphviz,必须先安装该工具,否则代码无法正常运行。
- Windows:前往 Graphviz 官网下载安装包,安装后配置系统环境变量
- macOS:使用 Homebrew 安装
brew install graphviz
- Linux(Ubuntu/Debian)
sudo apt-get install graphviz
2.2 diagrams 库安装
安装完 Graphviz 后,直接使用 pip 安装 diagrams 库:
pip install diagrams
安装完成后,可通过以下代码验证环境是否正常:
# 环境验证代码
from diagrams import Diagram
# 若执行无报错,说明环境配置成功
print("diagrams 环境就绪")
执行后无异常输出,即代表安装与依赖均正常,可进入正式使用。
三、diagrams 基础使用语法
3.1 核心组件介绍
diagrams 绘图的核心由三部分组成:
- Diagram:画布,定义图表名称、方向、输出格式等
- Node:节点,代表架构中的组件(服务器、数据库、客户端等)
- Cluster:集群,用于对节点进行分组,形成逻辑区域
3.2 基础绘图流程
- 导入 Diagram 与对应资源模块
- 创建 Diagram 对象,设置图表信息
- 定义节点,使用
>>符号建立节点间调用关系 - 运行代码,自动生成 PNG/SVG 格式图片
3.3 最简单的入门示例
# 导入基础依赖
from diagrams import Diagram
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS
from diagrams.aws.network import ELB
# 定义图表:名称、方向、输出格式
with Diagram("Web 服务架构", show=False, direction="LR"):
# 定义节点与调用关系
ELB("负载均衡") >> EC2("Web 服务器") >> RDS("数据库")
代码说明:
with Diagram(...)创建绘图上下文,自动管理资源direction="LR"表示从左到右绘图,也可使用TB(从上到下)show=False表示运行后不自动打开图片,仅保存- 节点使用对应云服务图标,名称可自定义
执行代码后,会在当前目录生成名为 web_服务架构.png 的架构图,直观展示负载均衡、Web 服务器、数据库的调用流程。
四、常用节点类型与分组使用
4.1 主流云平台节点
diagrams 内置大量云厂商图标,满足不同场景需求:
- AWS:EC2、RDS、S3、Lambda、ELB 等
- Azure:虚拟机、SQL 数据库、存储等
- 阿里云:ECS、RDS、OSS、SLB 等
- Kubernetes:Pod、Service、Ingress、Node 等
- 通用组件:Client、Server、DB、Nginx、Docker 等
4.2 集群(Cluster)分组用法
当架构中存在多个同类组件时,可使用 Cluster 进行分组,让图表结构更清晰。
from diagrams import Diagram, Cluster
from diagrams.aws.compute import EC2
from diagrams.aws.database import RDS, ElastiCache
from diagrams.aws.network import ELB
from diagrams.aws.storage import S3
with Diagram("复杂 Web 架构", show=False, direction="LR"):
# 定义客户端
client = EC2("用户客户端")
# 前端服务集群
with Cluster("前端服务组"):
lb = ELB("负载均衡")
servers = [
EC2("Web 1"),
EC2("Web 2"),
EC2("Web 3")
]
# 数据服务集群
with Cluster("数据层"):
db = RDS("主库")
cache = ElastiCache("Redis 缓存")
storage = S3("对象存储")
# 建立调用关系
client >> lb >> servers
servers >> db
servers >> cache
servers >> storage
代码说明:
Cluster可将多个节点包裹,形成独立视觉区域- 列表形式可批量定义同类节点,简化代码
- 支持一对多、多对一的连接关系,自动生成连线
该示例展示了带集群分组的完整 Web 架构,适合用于项目文档、技术分享场景。
五、微服务与中间件架构实战
5.1 微服务基础架构示例
from diagrams import Diagram, Cluster
from diagrams.onprem.client import User
from diagrams.onprem.compute import Server
from diagrams.onprem.database import PostgreSQL
from diagrams.onprem.inmemory import Redis
from diagrams.onprem.network import Nginx
from diagrams.onprem.queue import RabbitMQ
from diagrams.onprem.logging import ELK
with Diagram("微服务架构", show=False, direction="TB"):
user = User("用户")
with Cluster("网关层"):
gateway = Nginx("网关服务")
with Cluster("业务微服务"):
user_service = Server("用户服务")
order_service = Server("订单服务")
pay_service = Server("支付服务")
with Cluster("中间件"):
mq = RabbitMQ("消息队列")
cache = Redis("缓存")
db = PostgreSQL("数据库")
with Cluster("日志监控"):
elk = ELK("日志系统")
user >> gateway
gateway >> [user_service, order_service, pay_service]
[user_service, order_service, pay_service] >> mq
[user_service, order_service, pay_service] >> cache
[user_service, order_service, pay_service] >> db
[user_service, order_service, pay_service] >> elk
代码说明:
- 使用
onprem系列节点,适用于自建机房、私有部署架构 - 清晰划分网关层、业务服务、中间件、监控系统
- 多服务统一调用中间件,结构一目了然
该图表可直接用于毕业设计、项目方案书、技术架构评审等场景。
5.2 前后端分离项目架构
from diagrams import Diagram
from diagrams.onprem.client import User
from diagrams.onprem.compute import Server
from diagrams.onprem.container import Docker
from diagrams.onprem.database import MongoDB
from diagrams.onprem.network import Nginx
from diagrams.programming.language import Python, Javascript
from diagrams.devops import Git, Jenkins
with Diagram("前后端分离架构", show=False):
user = User("用户")
frontend = Javascript("前端 Vue/React")
web = Nginx("Web 服务")
backend = Python("后端服务")
db = MongoDB("数据库")
with Cluster("DevOps 流程"):
git = Git("代码仓库")
ci = Jenkins("CI/CD")
docker = Docker("容器部署")
user >> frontend >> web >> backend >> db
git >> ci >> docker >> backend
代码说明:
- 支持编程语言、DevOps 工具、容器等通用节点
- 完整展示从用户访问到开发部署的全流程
- 适合前后端分离项目、前端开发、全栈开发场景
六、DevOps 与容器云架构
6.1 Docker + Kubernetes 架构
from diagrams import Diagram, Cluster
from diagrams.onprem.client import User
from diagrams.onprem.container import Docker
from diagrams.k8s.compute import Pod, Deployment
from diagrams.k8s.network import Ingress, Service
from diagrams.k8s.cluster import Node
from diagrams.onprem.monitoring import Prometheus, Grafana
with Diagram("K8s 容器架构", show=False, direction="LR"):
user = User("用户")
with Cluster("K8s 集群"):
ingress = Ingress("入口")
svc = Service("服务")
deploy = Deployment("部署")
pods = [
Pod("Pod 1"),
Pod("Pod 2")
]
node = Node("工作节点")
with Cluster("监控系统"):
prom = Prometheus("监控采集")
graf = Grafana("可视化")
docker = Docker("容器")
user >> ingress >> svc >> deploy >> pods >> node
pods >> docker
pods >> prom
prom >> graf
代码说明:
- 专门提供 Kubernetes 全套图标,适配云原生场景
- 展示 Ingress、Service、Deployment、Pod 层级关系
- 适合运维、云原生、后端开发人员使用
七、多场景综合架构案例
7.1 电商平台极简架构
from diagrams import Diagram, Cluster
from diagrams.onprem.client import User
from diagrams.onprem.network import Nginx
from diagrams.onprem.compute import Server
from diagrams.onprem.database import MySQL
from diagrams.onprem.queue import RabbitMQ
from diagrams.onprem.inmemory import Redis
from diagrams.aws.storage import S3
from diagrams.onprem.security import Vault
with Diagram("电商平台架构", show=False):
users = User("用户")
with Cluster("接入层"):
lb = Nginx("负载均衡")
with Cluster("业务服务"):
goods = Server("商品服务")
order = Server("订单服务")
pay = Server("支付服务")
user_srv = Server("用户服务")
with Cluster("数据与中间件"):
db = MySQL("业务库")
redis = Redis("缓存")
mq = RabbitMQ("消息队列")
oss = S3("图片存储")
secret = Vault("密钥管理")
users >> lb >> [goods, order, pay, user_srv]
[goods, order, pay, user_srv] >> [db, redis, mq, oss, secret]
代码说明:
- 覆盖电商核心服务:用户、商品、订单、支付
- 包含数据库、缓存、消息队列、对象存储、密钥服务
- 结构简洁,可直接用于项目介绍与架构说明
7.2 个人项目/博客系统架构
from diagrams import Diagram
from diagrams.onprem.client import User
from diagrams.onprem.network import Nginx
from diagrams.programming.language import Python
from diagrams.onprem.database import SQLite
from diagrams.onprem.hosting import Server
from diagrams.devops import Vercel
with Diagram("个人博客架构", show=False):
user = User("访客")
nginx = Nginx("Web 服务")
backend = Python("Django/Flask")
db = SQLite("轻量数据库")
deploy = Vercel("云部署")
server = Server("轻量服务器")
user >> nginx >> backend >> db
deploy >> server
server >> backend
代码说明:
- 适合个人博客、小型工具、毕业设计项目
- 使用轻量组件,部署简单,成本低
- 图表清晰,适合写在项目 README 中
八、高级用法:样式与输出控制
8.1 图表样式配置
from diagrams import Diagram
from diagrams.aws.compute import EC2
with Diagram(
"自定义样式",
show=False,
direction="LR",
filename="custom_style",
outformat="svg",
graph_attr={
"fontsize": "16",
"bgcolor": "white",
"labeljust": "center"
},
node_attr={
"fontsize": "12",
"shape": "box",
"style": "filled"
}
):
EC2("自定义节点样式")
代码说明:
filename指定输出文件名outformat支持 png、svg、pdf 等格式graph_attr与node_attr可自定义背景、字体、形状、颜色
8.2 批量节点简化写法
from diagrams import Diagram
from diagrams.aws.compute import EC2
with Diagram("批量节点", show=False):
# 列表快速生成多个节点
web_servers = [EC2(f"Web{i}") for i in range(1, 4)]
[EC2("入口")] >> web_servers
代码说明:
- 使用列表推导式快速生成多个同类节点
- 适合大规模服务架构,减少重复代码
九、相关资源
- Pypi地址:https://pypi.org/project/diagrams/
- Github地址:https://github.com/mingrammer/diagrams
- 官方文档地址:https://diagrams.mingrammer.com/
关注我,每天分享一个实用的Python自动化工具。
