1. 这不是画图工具,而是一个“架构语言翻译器”
你有没有过这样的经历:刚接手一个新项目,技术负责人甩过来一份PDF架构图,箭头密密麻麻,组件名全是缩写,图例藏在角落第三页,看完之后只留下一句“这图到底想表达什么?”;或者你花两小时用draw.io拖拽出一张自认为清晰的微服务拓扑图,发到群里,同事回复:“这个API网关和认证中心的调用关系是不是反了?还有,数据库主从没标读写分离策略啊。”——不是图不美,是图没“活”起来。
archify 就是为解决这种“静态图失语症”而生的。它不叫“AI绘图工具”,更不是又一个在线流程图网站的变种。它的本质,是一个可执行的架构语言翻译器:你用自然语言(比如“用户请求经Nginx负载均衡后,路由至Auth Service进行JWT校验,校验通过后转发至Order Service,Order Service依赖Redis缓存订单状态,并异步写入MySQL主库,同时通过Kafka通知Inventory Service扣减库存”),它就能生成一张带交互能力、可点击、可展开、可验证逻辑的动态架构图。这里的“交互”,不是指鼠标悬停变色,而是点击“Order Service”节点,能立刻弹出它的Dockerfile路径、健康检查端点、最近一次CI构建状态;双击“Kafka”连线,能直接跳转到该消息Topic的Schema定义文档。它把架构图从“说明书”变成了“控制台”。
我第一次用archify跑通demo时,输入的是一段关于IoT边缘计算网关的描述,它不仅生成了包含MQTT Broker、规则引擎、OTA升级模块的拓扑图,还自动识别出“规则引擎需访问设备影子库”这一隐含依赖,并在图中用虚线红色箭头标出,旁边附注:“检测到未声明的跨服务数据访问,请确认是否需添加RBAC策略”。这种能力,已经超出了可视化范畴,进入了架构意图理解与合规性预检层面。它面向的不是UI设计师,而是那些每天在代码、文档、会议纪要之间反复横跳,试图把模糊共识变成可落地契约的系统架构师、Tech Lead和资深后端工程师。如果你的工作里常出现“我们先画个图对齐下”、“这个依赖关系文档里没写清楚”、“上线前再review一遍调用链”,那么archify不是锦上添花,而是帮你省下每周至少5小时无效沟通的刚需工具。
2. 核心设计思路:为什么放弃传统UML,选择“语义驱动+运行时注入”?
2.1 传统架构图工具的三大死穴
市面上绝大多数架构图工具(无论是Visio、Lucidchart还是开源的Mermaid)都建立在一个脆弱的前提上:绘图者=架构知识拥有者。这个假设在现实中早已崩塌。真实场景中,架构图往往由三类人协作完成:架构师写初稿、开发工程师填细节、运维同事补监控链路。结果就是一张图里混杂着不同抽象层级的信息——左边是“Kubernetes Cluster”这种宏观容器,右边是“/healthz endpoint timeout=3s”这种微观配置,整张图既无法向上支撑技术决策,也无法向下指导具体实施。archify的设计哲学,正是从解构这个前提开始的。
第一大死穴是信息孤岛化。你在draw.io里画了一个“PostgreSQL”图标,它就只是一个像素块。你无法告诉它“这个实例启用了pg_stat_statements插件”或“连接池最大数设为200”。图与真实系统之间隔着一堵墙,墙那边是代码、配置、监控指标,墙这边只有静态符号。archify的破局点在于,它默认将架构图视为一个活的系统索引入口,而非最终产物。它生成的HTML页面底层,是一个轻量级的JSON-LD Schema,每个节点都预留了runtimeMetadata字段,允许你后续注入来自CI/CD流水线、Prometheus监控、甚至Git仓库的实时数据。
第二大死穴是语义贫瘠化。UML类图里的“依赖”箭头,和微服务间HTTP调用的“依赖”,在语义上天差地别。前者可能只是编译期引用,后者却涉及网络延迟、重试策略、熔断阈值。传统工具用同一根线表示所有关系,导致关键风险被平均化。archify引入了一套精简但强约束的关系语义谱系:calls(同步HTTP)、publishes-to(异步消息)、reads-from(只读数据源)、writes-to(写入目标)、monitors(监控探针)。当你写“Order Service publishes-to Kafka topic: order-created”,它不会生成一根普通箭头,而是在连线旁自动标注QoS等级(根据Kafka Topic配置推断)、消息序列化格式(从Service代码注释中提取)、以及该Topic的消费者组列表(从K8s ConfigMap中拉取)。这种语义深度,让图本身具备了初步的“可推理”能力。
第三大死穴是演进滞后性。一个系统上线后,架构图往往半年不更新。不是没人维护,而是维护成本太高——改一行代码,要同步打开三个工具:IDE改逻辑、Git提交、draw.io更新图。archify用“单源真相(Single Source of Truth)”原则切断这个恶性循环。它的输入源可以是Markdown文档中的特定代码块(```archify),也可以是YAML格式的架构描述文件。这个文件本身就被纳入Git版本管理。当开发工程师提交一个PR,新增了一个“Payment Gateway”服务,他必须同时更新archify描述文件。CI流水线会自动触发archify CLI,生成新图并推送到文档站点。图的更新,成了代码变更的强制副产品,而不是可选项。
2.2 “AI代理”的真实角色:不是画手,而是架构语义解析器
标题里写的“AI代理”,很容易让人联想到Stable Diffusion那种端到端生成图像的模型。但archify里的AI,扮演的是一个极其克制且专业的角色:领域特定语言(DSL)解析器。它背后没有庞大的多模态大模型,而是一个经过数千份真实架构文档微调的BERT变体,专精于识别技术名词、关系动词和约束条件。它的训练数据不是通用语料库,而是GitHub上Star数超过500的开源项目的ARCHITECTURE.md、DESIGN_DECISIONS.md等文档,以及CNCF云原生全景图中的组件关系描述。
这个AI的核心任务有且仅有三个:
- 实体消歧:当文本中出现“Redis”,它要判断这是指缓存实例(
redis://cache-prod:6379)、消息队列(redis://queue-broker:6379)还是Session存储(redis://session-store:6379)。判断依据来自上下文动词——“缓存用户会话”指向Session,“作为消息中间件”指向Queue。 - 关系抽取:识别“通过gRPC调用”、“经由API网关路由”、“订阅Kafka事件流”等短语,并映射到前述的五类语义关系。它甚至能处理否定句:“Inventory Servicedoes notdirectly access MySQL, but relies on Order Service’s read-only replica.”——这里会生成
Inventory Service reads-from Order Service (replica),而非直连MySQL。 - 约束推导:从“要求99.99%可用性”、“峰值QPS不低于5000”、“数据保留周期7天”等非功能性需求中,自动关联到相关组件,并在图中用颜色编码(如红色边框表示SLA敏感组件)或图标(⏱️表示性能瓶颈点)进行标记。
我实测过一个案例:输入一段关于“基于OpenCLAW+ROS的机器人AI代理”的描述。archify准确识别出OpenCLAW是任务编排框架,ROS是通信中间件,并推断出“OpenCLAW节点需订阅ROS的/camera/image_rawTopic”,从而在图中生成一条subscribes-to关系线。但它没有强行画出一个叫“OpenCLAW-ROS Bridge”的虚构组件——因为原文没提,AI就不会编造。这种“只说已知,不说臆测”的克制,恰恰是它区别于其他所谓“AI绘图”的关键。它的AI不是创造者,而是最严谨的读者和翻译官。
3. 实操全流程:从一句话描述到可交互架构图的七步闭环
3.1 环境准备与CLI安装:轻量级,无服务器依赖
archify 的核心是一个命令行工具(CLI),这意味着它不依赖任何云端服务,所有解析、渲染都在本地完成。这对重视数据安全的金融、政企客户至关重要。安装过程极简,仅需两步:
# 方式一:使用curl一键安装(推荐) curl -sL https://raw.githubusercontent.com/archify/cli/main/install.sh | bash # 方式二:通过包管理器(macOS) brew tap archify/tap brew install archify-cli # 方式三:手动下载二进制(Linux x64) wget https://github.com/archify/cli/releases/download/v1.2.0/archify-linux-amd64 chmod +x archify-linux-amd64 sudo mv archify-linux-amd64 /usr/local/bin/archify提示:安装脚本会自动检测系统架构(ARM64/M1芯片、Windows WSL2等)并下载对应二进制。它不修改系统PATH,而是将可执行文件放在
~/.archify/bin/,并提示你手动添加。这是刻意为之——避免与其他工具链冲突,也方便多版本共存。
验证安装是否成功:
archify --version # 输出:archify v1.2.0 (commit: a1b2c3d) archify --help # 查看完整命令列表与某些需要Docker Compose启动一堆服务的工具不同,archify CLI自身就是一个静态链接的Go二进制,体积仅12MB,启动时间小于100ms。它不监听任何端口,不创建后台进程,完全符合“工具即命令”的Unix哲学。这也是它能无缝集成到现有CI/CD的关键——你不需要为它单独申请一台构建机。
3.2 架构描述文件编写:用Markdown写“可执行文档”
archify 的输入不是图形界面,而是一个纯文本文件。官方推荐使用.archify.md扩展名,但实际支持任意文本格式(.yml,.json,.txt)。我们以一个典型的电商订单服务为例,展示如何编写:
# 订单服务架构描述 ## 核心组件 - **Order API Gateway** 类型:Kong API网关 职责:统一入口,JWT鉴权,限流(1000 req/s per IP) 部署:Kubernetes Deployment, replicas=3 - **Order Service** 类型:Spring Boot微服务 职责:订单创建、查询、状态流转 依赖:Redis(缓存订单状态)、MySQL(持久化)、Kafka(发布订单事件) 健康检查:GET /actuator/health, timeout=2s - **Inventory Service** 类型:Go微服务 职责:库存扣减与查询 数据源:MySQL只读副本 监控:暴露Prometheus metrics端点 `/metrics` ## 组件关系 - Order API Gateway `calls` Order Service via HTTP/2 - Order Service `writes-to` MySQL (primary) - Order Service `reads-from` Redis (cache) - Order Service `publishes-to` Kafka topic: `order-created` - Inventory Service `reads-from` MySQL (replica) - Inventory Service `subscribes-to` Kafka topic: `order-created` - Order Service `monitors` Inventory Service via `/healthz` ## 非功能性需求 - 全链路P99延迟 < 200ms - 订单创建成功率 ≥ 99.95% - 数据保留:MySQL归档7天,Kafka日志保留3天注意:这里的语法不是随意的。
calls、writes-to等关键词必须严格匹配archify预定义的关系词汇表(可在archify list-relationships中查看完整列表)。大小写敏感,空格不可省略。这种“语法糖”设计,是为了让AI解析器能100%确定语义,避免自然语言的歧义。它牺牲了一点自由度,换来了极高的解析准确率(官方测试集上达99.2%)。
3.3 生成基础架构图:CLI命令与参数详解
准备好描述文件后,执行生成命令:
archify generate --input ./order.archify.md --output ./docs/architecture.html这条命令会做三件事:
- 解析(Parse):加载Markdown,调用内置AI模型提取实体、关系、约束;
- 布局(Layout):使用改进版的Cose算法(针对微服务拓扑优化),自动计算节点位置,避免连线交叉。它会识别“中心辐射型”结构(如API网关为中心),并优先将高连接度节点置于画面中央;
- 渲染(Render):生成一个单HTML文件,内嵌所有JavaScript(D3.js + custom renderer),无需外部CDN。文件大小通常在800KB以内,可直接用浏览器打开。
常用参数说明:
--theme dark:切换深色主题,适合夜间阅读;--format svg:输出SVG矢量图,用于嵌入PPT或PDF报告;--include-runtime:启用运行时数据注入模式(需配合后续步骤);--validate-only:只做语法和逻辑校验,不生成图,适合CI流水线中的前置检查。
实操心得:我建议在团队内部约定一个标准模板,比如所有
.archify.md文件都放在项目根目录下的/docs/architecture/子目录。这样archify generate --input docs/architecture/*.archify.md就能批量生成全系统视图。我们曾用此方式,在一个20+微服务的项目中,5分钟内生成了覆盖所有服务的全局架构图。
3.4 注入运行时数据:让架构图“活”起来
生成的静态HTML只是起点。archify真正的威力,在于其--include-runtime模式。这需要你提供一个JSON格式的运行时元数据文件,例如runtime.json:
{ "Order Service": { "git_commit": "a1b2c3d4e5f67890", "build_time": "2024-05-20T14:22:31Z", "health_status": "UP", "latency_p99_ms": 187, "k8s_pod_count": 5 }, "Inventory Service": { "git_commit": "f0e9d8c7b6a54321", "build_time": "2024-05-19T09:15:44Z", "health_status": "DOWN", "error_log_count_24h": 127, "k8s_pod_count": 3 } }然后重新生成:
archify generate \ --input ./order.archify.md \ --runtime ./runtime.json \ --output ./docs/architecture.html生成的HTML中,每个服务节点右下角会出现一个状态徽章(🟢 UP / 🔴 DOWN),点击节点会弹出详情面板,显示Git提交哈希、构建时间、P99延迟等实时指标。更重要的是,它会自动高亮异常项——比如Inventory Service状态为DOWN,整个节点会变成红色脉冲动画,并在图例区添加一条警告:“检测到1个组件健康状态异常”。
注意:
runtime.json的key必须与.archify.md中定义的组件名称完全一致(包括大小写和空格)。这是唯一可能出错的地方。我的经验是,在CI流水线中,用一个简单的Shell脚本自动生成runtime.json,从K8s API或Prometheus中拉取数据,避免人工维护。
3.5 集成到CI/CD:自动化更新,杜绝“图比代码老”
将archify集成到CI/CD,是让它发挥最大价值的关键。以下是我们团队在GitHub Actions中的实践配置(.github/workflows/archify.yml):
name: Generate Architecture Diagram on: push: paths: - 'docs/architecture/*.archify.md' - '.github/workflows/archify.yml' jobs: generate: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: fetch-depth: 0 # 必须获取完整历史,用于获取git commit - name: Install archify CLI run: | curl -sL https://raw.githubusercontent.com/archify/cli/main/install.sh | bash echo "$HOME/.archify/bin" >> $GITHUB_PATH - name: Generate HTML diagram run: | # 生成runtime.json:从当前分支获取各服务最新commit jq -n \ --arg order_commit "$(git log -1 --pretty=%H -- docs/src/order-service)" \ --arg inventory_commit "$(git log -1 --pretty=%H -- docs/src/inventory-service)" \ '{ "Order Service": {"git_commit": $order_commit}, "Inventory Service": {"git_commit": $inventory_commit} }' > runtime.json archify generate \ --input docs/architecture/order.archify.md \ --runtime runtime.json \ --output docs/architecture/index.html - name: Deploy to GitHub Pages uses: peaceiris/actions-gh-pages@v3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/architecture这个Workflow实现了:
- 触发精准:只有当架构描述文件(
.archify.md)或CI配置本身变更时才运行; - 数据新鲜:自动从Git历史中提取各服务的最新提交哈希,确保
runtime.json真实反映代码状态; - 零人工干预:生成的
index.html自动部署到GitHub Pages,URL形如https://your-org.github.io/your-repo/architecture/,成为团队共享的权威架构入口。
实操心得:我们曾把这个Workflow加到一个遗留系统中。第一天运行后,发现生成的图里有3个服务节点显示“UNKNOWN”,追查发现是
.archify.md里写的组件名(如“User Auth”)和实际代码仓库名(user-authentication-service)不一致。这反而帮我们发现了长期存在的命名规范问题。archify在这里,成了团队技术治理的“照妖镜”。
4. 深度应用与避坑指南:那些文档里不会写的实战经验
4.1 处理复杂依赖:分层建模与跨文件引用
当系统规模扩大,单个.archify.md文件会变得臃肿难维护。archify支持分层建模和跨文件引用。例如,你可以将基础设施层(K8s、网络、存储)单独放在infra.archify.md,应用层放在app.archify.md,再用一个system.archify.md作为总入口:
# system.archify.md ## 引用子模块 - include: ./infra.archify.md - include: ./app.archify.md ## 跨层关系 - Kubernetes Control Plane `manages` Order Service - AWS EBS `provides-storage-for` MySQL Primaryarchify CLI会递归解析所有include语句,合并成一个逻辑上的完整模型。这解决了大型系统中“谁该画在哪一层”的经典难题。我们一个客户有12个业务域,他们为每个域建立了独立的.archify.md,再用一个enterprise.archify.md做全局聚合,效果极佳。
常见问题:
include路径错误导致解析失败。archify的错误提示非常友好,会明确指出“File not found: ./network.archify.md at line 5”。但要注意,路径是相对于当前正在解析的文件,不是CLI执行目录。解决方案:一律使用相对路径,并在团队Wiki中明确定义“所有架构描述文件必须放在/docs/architecture/下,include路径以此为基准”。
4.2 与现有工具链打通:从Mermaid到Confluence的平滑迁移
很多团队已经在用Mermaid写架构图。archify提供了convert子命令,可将Mermaid代码块自动转换为archify DSL:
echo 'graph TD A[API Gateway] --> B[Order Service]; B --> C[(MySQL)]' | archify convert --from mermaid --to archify输出:
- **API Gateway** 类型:未知 职责:未知 - **Order Service** 类型:未知 职责:未知 - **MySQL** 类型:数据库 职责:未知 ## 组件关系 - API Gateway `calls` Order Service - Order Service `writes-to` MySQL这并非完美转换(Mermaid不包含语义信息),但它能保住90%的拓扑结构,剩下10%的语义补全(如类型、职责、关系强度)只需人工微调。我们帮助一家公司迁移了200+份Mermaid文档,平均每人每天可处理30份,一周内完成。
对于Confluence用户,archify CLI支持--format confluence,生成可以直接粘贴到Confluence编辑器中的存储格式(含宏指令)。它甚至能自动将图中的组件名链接到Jira项目(需配置jira_base_url环境变量)。
4.3 性能调优与大规模图渲染:当节点超过200个时
archify默认的Cose布局算法,在节点数<100时表现完美。但当处理像“全公司技术栈全景图”(含300+组件)时,浏览器渲染会明显卡顿。这时需要启用--layout-force-directed参数,并调整几个关键参数:
archify generate \ --input enterprise.archify.md \ --layout-force-directed \ --physics-iterations 200 \ --node-separation 80 \ --link-distance 120 \ --output ./docs/enterprise.html--physics-iterations:增加模拟迭代次数,让布局更稳定(默认100,可增至200-300);--node-separation:增大节点最小间距,避免重叠(默认50,密集图建议80+);--link-distance:设置连线理想长度,影响整体紧凑度(默认100,长链路系统建议120+)。
实操心得:我们曾为一个超大型客户生成包含412个节点的图。开启上述参数后,首次渲染耗时从12秒降至3.8秒,且拖拽、缩放流畅度显著提升。但要注意,过度增大
--node-separation会导致图幅过大,需配合--zoom-fit参数确保初始视图适配屏幕。
4.4 安全与合规:离线使用、审计日志与权限控制
archify的离线特性,使其天然符合金融、医疗等强监管行业的安全要求。所有AI解析都在本地完成,不上传任何数据到云端。CLI还内置了审计日志功能:
archify generate --input ... --audit-log ./logs/archify-audit.log生成的日志文件记录每一次解析的输入哈希、输出哈希、执行时间、CLI版本,可用于SOX或等保审计。日志格式为JSON Lines,便于ELK栈采集。
对于企业级部署,archify支持LDAP/SSO集成(需自建轻量API网关)。我们为客户定制了一个方案:将archify CLI封装为内部Web服务,前端是React管理界面,后端调用CLI并校验用户权限(基于Git仓库的Read权限)。这样,普通开发人员只能查看自己负责的服务图,架构师才能看到全局视图。
避坑提醒:不要在
.archify.md中硬编码敏感信息(如数据库密码、API密钥)。archify虽不上传,但文件在Git中是明文的。正确做法是使用占位符(如DB_PASSWORD: ${ENV.DB_PASSWORD}),并在CI中通过Secrets注入。archify CLI会自动替换这些占位符。
5. 常见问题速查表与独家排查技巧
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| 生成的图中,某个组件完全消失 | .archify.md中该组件名与runtime.json的key不一致;或组件名包含特殊字符(如/、()未转义 | 1. 运行archify validate --input file.md检查语法2. 对比 file.md中的组件名和runtime.json的key | 使用archify normalize --input file.md自动标准化组件名(移除非法字符,统一空格) |
| 连线全部堆叠在左上角,无法布局 | 输入关系过多且缺乏层次暗示;或存在循环依赖(A→B→C→A) | 1. 运行archify analyze --input file.md查看依赖环2. 检查是否有 calls和publishes-to混用 | 在.archify.md中添加group指令,显式定义逻辑分组:“## 订单域”、“## 支付域”;或用--layout-hierarchical强制分层布局 |
| 点击节点无响应,详情面板空白 | --include-runtime启用,但runtime.json中缺少该组件的键 | 1. 打开浏览器开发者工具,查看Console是否有Key not found in runtime data警告2. 检查 runtime.json文件权限(CLI需有读取权限) | 运行archify inject-missing --input file.md --runtime runtime.json,自动生成缺失组件的空对象 |
| 生成的HTML文件在IE11中白屏 | archify使用现代JS特性(ES2015+),IE11不支持 | 1. 查看浏览器控制台报错 2. 检查 archify --version是否为v1.1.0+(旧版有兼容问题) | 升级到v1.2.0+;或使用--legacy-js参数生成兼容IE11的版本(体积增大30%,但功能完整) |
CI流水线中生成图失败,报错command not found | GitHub Actions runner未正确加载$HOME/.archify/bin路径 | 1. 在Workflow中添加echo "$HOME/.archify/bin" >> $GITHUB_PATH2. 检查 archify --version是否在install步骤后执行 | 将archify安装和generate命令放在同一个run步骤中,避免PATH环境变量丢失 |
独家排查技巧:当遇到难以复现的布局问题时,不要反复修改
.archify.md。先用archify export-json --input file.md > debug.json导出解析后的中间JSON模型。这个JSON是archify内部使用的标准格式,你可以用VS Code的JSON Viewer插件直观查看所有节点、关系、属性。很多时候,问题根源在于AI误判了一个关系(如把depends-on当成calls),直接在debug.json里修正,再用archify import-json --input debug.json重新生成,比改原文快得多。
最后分享一个小技巧:archify生成的HTML文件,支持键盘快捷键。按F键进入全屏模式;Ctrl+Shift+D切换深色/浅色主题;Ctrl+0重置缩放;Ctrl+Click节点可多选,然后按Delete键临时隐藏——这些功能在向老板演示时特别实用,能让你的架构图讲解像操作一个真正的系统控制台,而不是翻PPT。