de_DEen_USes_ESfa_IRfr_FRhi_INid_IDjapl_PLpt_PTru_RUvizh_CNzh_TW

文档危机

每个工程团队都深知这种痛苦:你花费数周时间设计精美的微服务架构,精心制作令利益相关者印象深刻的 Visio 图表。然而六个月后,系统已经演进——新增了服务、迁移了数据库、废弃了 API 端点,但图表却凝固在原地。它成了一件文物,甚至是一种谎言。

这就是“文档腐烂”,它是工程生产力的隐形杀手。当图表失真时,开发人员会忽视它们;当开发人员忽视文档时,部落知识便会占据主导;当唯一了解系统的人离开时,你留下的将是一个复杂的代码库和一张缺失的地图。

图表即代码(DaC)是解决方案。其核心在于Mermaid——一款基于 JavaScript 的图表工具,能将纯文本转化为精美的可视化图形。

图表即代码(DaC):解决文档危机


核心理念:像对待软件一样对待图表

图表即代码带来的根本转变,在于以与应用程序代码相同的严谨性来对待图表。这意味着:

1. 版本控制成为标准

当你的图表是一个.mermaid文件时,它就与源代码一起存在于你的 Git 仓库中。每一次变更都会被追踪。你可以git blame来查看是谁添加了该新服务,git diff在合并前审查变更,并回滚到任意之前的状态。

gitGraph
    commit id: "初始架构"
    commit id: "添加用户服务"
    branch feature/order-service
    commit id: "订单服务 v1"
    commit id: "添加支付网关"
    checkout main
    merge feature/order-service
    commit id: "更新 API 网关"

示例:使用 Mermaid 的 Git Graph 语法可视化图表自身的 Git 历史

2. 图表的代码审查

拉取请求不再仅用于代码。当开发人员提议新增服务或修改数据流时,该变更会以可读的差异形式出现在拉取请求中。审查者可以直接对图表本身进行评论,确保架构决策在合并前经过讨论和批准。

3. CI/CD 流水线集成

你的图表可以在流水线中自动生成并验证。想象一个 GitHub Action 能够:

  • 将所有 Mermaid 图表渲染为 PNG/SVG 格式

  • 将它们上传至你的文档站点

  • 如果检测到无效的 Mermaid 语法,则构建失败

 

flowchart LR
    A[开发者推送代码] --> B[CI 流水线运行]
    B --> C[运行测试]
    B --> D[渲染 Mermaid 图表]
    D --> E{语法有效?}
    E -->|是| F[上传至文档]
    E -->|否| G[构建失败并通知团队]
    F --> H[部署应用程序]
    G --> I[开发者修复语法]
    I --> A

示例:用于图表验证和部署的 CI/CD 工作流


Mermaid 实战:真实世界示例

让我们通过实际、真实的示例,探索 Mermaid 支持的各类图表。

示例 1:微服务架构(流程图)

这是最常见的用例——可视化您的服务如何通信。

flowchart TB
    subgraph "客户端层"
        MobileApp[移动应用]
        WebApp[Web 应用程序]
    end

    subgraph "API 网关"
        Gateway[API 网关]
    end

    subgraph "微服务"
        UserSvc[用户服务]
        OrderSvc[订单服务]
        ProductSvc[产品服务]
        PaymentSvc[支付服务]
    end

    subgraph "数据层"
        UserDB[(用户数据库)]
        OrderDB[(订单数据库)]
        ProductDB[(产品数据库)]
        Redis[(Redis 缓存)]
    end

    subgraph "外部服务"
        Stripe[Stripe 支付]
        EmailAPI[电子邮件 API]
    end

    MobileApp --> Gateway
    WebApp --> Gateway
    Gateway --> UserSvc
    Gateway --> OrderSvc
    Gateway --> ProductSvc
    Gateway --> PaymentSvc

    UserSvc --> UserDB
    UserSvc --> Redis
    OrderSvc --> OrderDB
    OrderSvc --> Redis
    ProductSvc --> ProductDB
    ProductSvc --> Redis

    PaymentSvc --> Stripe
    OrderSvc --> EmailAPI
    PaymentSvc --> EmailAPI

示例:包含缓存、数据库和外部依赖的完整微服务架构

示例 2:用户认证流程(序列图)

序列图非常适合记录服务之间复杂的交互。

sequenceDiagram
    autonumber
    participant 用户
    participant 前端
    participant AuthSvc as 认证服务
    participant UserDB as 用户数据库
    participant Cache as Redis 缓存
    participant EmailSvc as 邮件服务

    用户->>前端:输入凭据
    前端->>AuthSvc:POST /login (邮箱,密码)
    AuthSvc->>UserDB:按邮箱查询用户
    UserDB-->>AuthSvc:返回加密后的密码及用户数据
    AuthSvc->>AuthSvc:使用 bcrypt 验证密码
    
    alt 凭据有效
        AuthSvc->>AuthSvc:生成 JWT 令牌
        AuthSvc->>Cache:存储会话(键:user_id,过期时间:1 小时)
        AuthSvc-->>前端:200 OK + JWT 令牌
        前端-->>用户:重定向至仪表板
    else 凭据无效
        AuthSvc->>EmailSvc:触发登录失败警报
        AuthSvc-->>前端:401 未授权
        前端-->>用户:显示错误消息
    end
    
    Note over AuthSvc,EmailSvc:5 次失败尝试后,锁定账户 15 分钟

示例:详细的认证流程,展示成功与失败路径,包括缓存和警报等副作用

示例 3:AWS 云基础设施(类图)

类图不仅用于代码,还可以建模云资源及其关系。

classDiagram
    class VPC {
        +string cidr_block
        +string region
        +createSubnet()
        +deleteSubnet()
    }

    class Subnet {
        +string availability_zone
        +string cidr_block
        +boolean is_public
        +attachRouteTable()
    }

    class EC2Instance {
        +string instance_type
        +string ami_id
        +int storage_gb
        +start()
        +stop()
        +reboot()
    }

    class RDSDatabase {
        +string engine
        +string version
        +int storage_gb
        +boolean multi_az
        +takeSnapshot()
        +restoreFromSnapshot()
    }

    class S3Bucket {
        +string bucket_name
        +string region
        +boolean versioning_enabled
        +uploadFile()
        +downloadFile()
    }

    class IAMRole {
        +string role_name
        +string policy_document
        +attachPolicy()
        +detachPolicy()
    }

    VPC "1" --> "*" Subnet
    Subnet "1" --> "*" EC2Instance
    Subnet "1" --> "0..1" RDSDatabase
    VPC "1" --> "0..*" S3Bucket
    EC2Instance --> IAMRole
    RDSDatabase --> IAMRole

示例:将 AWS 基础设施建模为具有属性和方法的类,适用于文档编写和基础设施即代码规划

示例 4:电子商务订单处理(状态图)

状态图擅长展示实体如何在不同状态之间转换。

stateDiagram-v2
    [*] --> Cart: 用户添加商品
    Cart --> Checkout: 用户进入结算
    
    Checkout --> PaymentPending: 用户提交订单
    PaymentPending --> PaymentProcessing: 启动支付网关
    
    PaymentProcessing --> Paid: 支付成功
    PaymentProcessing --> PaymentFailed: 支付被拒
    
    PaymentFailed --> Checkout: 用户重试支付
    PaymentFailed --> [*]: 用户放弃购物车
    
    Paid --> OrderConfirmed: 发送确认邮件
    OrderConfirmed --> Preparing: 分配至仓库
    
    Preparing --> Shipped: 移交承运商
    Shipped --> InTransit: 承运商取件
    
    InTransit --> Delivered: 配送确认
    Delivered --> ReviewPrompted: 请求用户评价
    
    ReviewPrompted --> [*]: 用户提交评价
    Delivered --> RefundRequested: 用户发起退款
    
    RefundRequested --> RefundApproved: 客服批准
    RefundApproved --> RefundProcessed: 退款完成
    RefundProcessed --> [*]: 订单关闭
    
    state "高风险欺诈检查" as FraudCheck {
        [*] --> CheckScore
        CheckScore --> LowRisk: 分数 < 50
        CheckScore --> HighRisk: 分数 >= 50
        HighRisk --> ManualReview: 标记供团队审核
        ManualReview --> LowRisk: 批准
        ManualReview --> PaymentFailed: 拒绝
    }
    
    PaymentPending --> FraudCheck: 触发风险评估
    FraudCheck --> PaymentProcessing: 低风险

示例:包含欺诈检测嵌套状态的完整电商订单状态机

示例 5:使用 GitHub 问题(Git 图)进行冲刺规划

Git 图可以表示超越 Git 本身的工作流。

gitGraph
    commit id: "Sprint Planning" type: HIGHLIGHT
    
    branch sprint-1
    commit id: "用户故事 #101: 登录页面"
    commit id: "用户故事 #102: 用户注册"
    
    branch bugfix/hotfix
    commit id: "热修复:认证令牌过期"
    checkout sprint-1
    merge bugfix/hotfix
    
    commit id: "用户故事 #103: 密码重置"
    
    checkout main
    merge sprint-1 tag: "v1.0.0"
    
    branch sprint-2
    commit id: "功能 #201: 购物车"
    commit id: "功能 #202: 结账流程"
    
    branch experiment/ai-recommendations
    commit id: "概念验证:机器学习推荐引擎"
    
    checkout sprint-2
    commit id: "功能 #203: 订单历史"
    
    checkout main
    merge sprint-2 tag: "v2.0.0"
    
    commit id: "发布说明:第 1 和第 2 次冲刺完成"

示例:将项目管理、冲刺和功能分支可视化为 Git 图


图表绘制领域的 AI 革命

尽管 Mermaid 优雅,但其语法可能成为障碍。谁想在记录系统时还要调试错位箭头或缺失的括号呢?

这正是 AI 驱动工具改变一切的地方。

AI 自动修复

像这样的工具VPasCode(Visual Paradigm 的图表即代码平台)以及Mermaid Chart已集成 AI 模型(如 Google Gemini 和 OpenAI),能够:

  • 自动检测语法错误

  • 修复损坏的图表只需单击一次

  • 建议图表结构的改进方案

让我们看看实际效果:

损坏的 Mermaid 代码:

 

 

flowchart LR
    A[前端] --> B(API 网关
    B --> C[用户服务]
    C --> D[(数据库
    D --> E[缓存]

AI 修复的代码:

 

flowchart LR
    A[前端] --> B(API 网关)
    B --> C[用户服务]
    C --> D[(数据库)]
    D --> E[缓存]

AI 能够识别缺失的右括号和右方括号,并立即修复它们。

自然语言转图表

也许最强大的功能是从自然语言描述生成图表。借助像OpenDocs(VP 的文档平台),你可以简单地描述你想要的内容:

“创建一个流程图,显示用户登录。如果凭据有效,则重定向到仪表板。如果无效,则显示错误并允许尝试 3 次。3 次失败后,锁定账户。”

AI 生成的 Mermaid:

 

 

flowchart TD
    Start([用户尝试登录]) --> EnterCreds[输入电子邮件和密码]
    EnterCreds --> Validate{验证凭据}
    Validate -->|有效| Dashboard[重定向到仪表板]
    Validate -->|无效| CheckAttempts{尝试次数 < 3}
    CheckAttempts -->|是| Increment[增加尝试计数器]
    Increment --> ShowError[显示错误消息]
    ShowError --> EnterCreds
    CheckAttempts -->|否| LockAccount[锁定账户 15 分钟]
    LockAccount --> SendAlert[发送安全警报邮件]
    SendAlert --> End([流程结束])
    Dashboard --> End

图表类型之间的转换

AI 还可以在不同图表格式之间进行转换。需要将 PlantUML 图表转换为 Mermaid 吗?AI 工具可以处理:

PlantUML 输入:

 

 

@startuml
actor User
participant "前端" as FE
participant "后端" as BE
database "数据库" as DB

User -> FE: 点击登录
FE -> BE: POST /login
BE -> DB: SELECT user
DB --> BE: 用户数据
BE --> FE: JWT token
FE --> User: 显示仪表板
@enduml

AI 转换的 Mermaid:

 

 

sequenceDiagram
    actor User
    participant Frontend
    participant Backend
    participant Database
    
    User->>Frontend: 点击登录
    Frontend->>Backend: POST /login
    Backend->>Database: SELECT user
    Database-->>Backend: 用户数据
    Backend-->>Frontend: JWT token
    Frontend-->>User: 显示仪表板

交互式聊天机器人集成

一些平台现在提供用于创建图表的聊天机器人界面。你可以进行对话:

用户: “在我的架构图中添加一个名为‘库存服务’的新服务。”

AI: “我将添加一个库存服务,连接到您现有的产品和服务和订单服务。”

图表会自动更新

用户: “实际上,让它也连接到一个名为‘InventoryDB’的新数据库。”

AI: “完成。库存服务现在已连接到产品服务、订单服务以及新的InventoryDB。”


将“图表即代码”集成到您的工作流中

步骤 1:从小处着手

不要试图一次性绘制整个系统的图表。从一个组件开始——比如您的身份验证流程或您正在构建的新功能。

步骤 2:嵌入到文档中

将您的.mermaid文件与您的文档放在一起(例如,在/docs文件夹中)。使用如mermaid-cli等工具在构建过程中渲染它们。

步骤 3:利用 VPasCode 的统一引擎

如果您在一个偏好各异的团队中工作,VPasCode将极具价值。它在一个地方支持多种图表即代码语言:

# 在 VPasCode 中,您可以混合搭配:
diagrams/
  ├── architecture.mermaid
  ├── deployment.puml      # PlantUML
  ├── database-erd.mermaid
  └── workflow.d2          # D2 语言

步骤 4:通过 CI/CD 实现自动化

在您的 GitHub Actions 或 GitLab CI 中添加一个步骤:

- name: 渲染 Mermaid 图表
  run: |
    for file in $(find docs -name "*.mermaid"); do
      npx @mermaid-js/mermaid-cli -i $file -o ${file%.mermaid}.png
    done

- name: 上传到文档站点
  run: |
    aws s3 sync docs/ s3://your-docs-bucket/

步骤 5:在拉取请求中审查

制定一项政策:所有架构变更都必须更新图表。使用拉取请求评论来讨论视觉变更:

审查者:“缓存不应该位于订单服务和数据库之间吗?目前它仅附加到用户服务。”

作者:“抓得准。我会更新图表。”


实际影响:案例研究

考虑一家采用 Mermaid 和 VPasCode 实施“图表即代码”的金融科技公司:

  • 之前:47 个静态 Visio 文件,大多数超过 6 个月未更新。新员工花费 3 周时间理解架构。

  • 之后:12 个 Mermaid 图表,全部存储在 Git 中,随每个功能更新。新员工在第一周即开始高效工作。

团队首席技术官指出:“我们从将图表视为合规性勾选项,转变为将其作为开发流程中的活跃组成部分。当我们讨论新架构时,我们会打开 Mermaid 编辑器,直接用代码绘制草图。这彻底改变了我们的工作方式。”


未来:持续文档

最终目标是实现“持续文档”,即根据基础设施或代码自动生成图表。相关工具已经出现,能够:

  • 扫描您的 Kubernetes 清单并生成服务拓扑图

  • 解析 OpenAPI/Swagger 文件并创建 API 流程图

  • 监控您的云资源并自动更新架构图

Mermaid 处于这场运动的核心,提供了一种简单、基于文本的格式,机器可以生成,人类也能理解。


今日开始

准备好超越静态图像了吗?这是您的行动计划:

  1. 安装 Mermaid 扩展在您喜欢的 IDE 中(VS Code、IntelliJ)

  2. 创建您的第一个图表在.md文件中,使用 Mermaid 语法

  3. 体验 VPasCode 的免费层级以体验 AI 驱动的图表绘制功能

  4. 启动一个动态更新的文档仓库与你的代码库并存

  5. 与你的团队分享这篇文章并开启讨论

你的架构值得拥有比被遗忘文件夹中积灰的图表更好的待遇。是时候将你的图表视为关键资产来对待了。