ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

archify:用AI代理生成可交互HTML架构图

archify:用AI代理生成可交互HTML架构图 1. 这不是又一个“画图工具”而是架构设计流程的断点重启你有没有过这样的经历刚开完需求评审会白板上密密麻麻记满了服务拆分、数据流向和接口依赖回到工位第一件事——打开 draw.io 或 PlantUML对着键盘敲了两小时终于导出一张 PNG发到群里后同事回“这个 Kafka 消费组没标清楚”“网关层和认证中心的调用箭头方向反了”“数据库主从没体现读写分离策略”。你默默删掉文件重开一个 tab再试一次。这不是低效是整个架构表达环节存在结构性失语人脑里的系统逻辑无法被低成本、高保真、可协作地映射为可视化结构。archify 就是在这个断点上按下重启键的模块。它不替代你思考架构而是把“思考结果”自动翻译成可交互、可验证、可演进的 HTML 架构图。关键词里没有“绘图”只有“AI 代理”和“可交互架构图”——这决定了它的本质不是 UI 工具而是一个嵌入开发工作流的架构语义解析器。它吃进去的是你写的自然语言描述比如“用户请求经 API 网关路由至订单服务订单服务调用库存服务校验库存失败时触发补偿事务并通知消息队列”吐出来的是一个带真实 DOM 事件、可点击展开节点详情、支持右键导出 SVG/PNG、甚至能对接后端 API 实时拉取服务健康状态的 HTML 页面。它生成的不是静态图片而是一个微型 Web 应用。我第一次跑通 demo 时直接把生成的 index.html 拖进 Chrome点击“订单服务”节点弹窗里立刻显示了该服务在 Kubernetes 集群中的 Pod 数量、CPU 使用率来自本地 mock 数据这才意识到archify 的核心价值不在“画得快”而在“让架构图活起来”。它解决的不是“怎么画图”的问题而是“如何让架构图成为系统的一部分”的问题。当你在 PR 描述里贴一张 archify 生成的 HTML 链接而不是 PNG 截图审查者可以直接点击节点查看其依赖的服务列表、最近一次部署时间、关联的 GitHub Issue当运维同学在值班时发现某个微服务响应延迟升高他可以在架构图上直接点击该服务跳转到 Grafana 监控面板——这种能力已经超出了传统架构图工具的边界。它本质上是在用 HTML 作为通用容器把架构知识从文档孤岛里解放出来变成可执行、可联动、可编程的数字资产。2. 为什么必须是 HTML——解构 archify 的技术选型底层逻辑很多人看到“生成 HTML”第一反应是“这有什么难用模板引擎拼字符串不就完了”但 archify 的 HTML 不是静态模板渲染的结果它是一套完整前端运行时环境的产物。理解这一点才能看懂它为何拒绝输出 PNG/SVG也才能避开后续集成时最致命的坑。先看一个典型生成结果的 HTML 结构骨架!doctype html html langzh-cn head meta charsetutf-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 title订单系统架构图 - archify/title script typemodule src./assets/main.js/script link relstylesheet href./assets/style.css /head body div idarchify-root/div script // 初始化入口传入架构元数据 window.archifyInit({ nodes: [ { id: api-gateway, label: API 网关, type: service, status: healthy }, { id: order-service, label: 订单服务, type: service, status: degraded } ], edges: [ { from: api-gateway, to: order-service, label: HTTP POST /v1/orders } ] }); /script /body /html注意三个关键设计点第一script typemodule是硬性要求不是可选项。archify 生成的 JS 代码使用 ES Module 语法import { renderGraph } from ./lib/graph.js;这意味着它无法在旧版浏览器或禁用模块加载的环境中运行。我曾试图把生成的 HTML 放进企业内网的 IE11 兼容模式页面里结果控制台报错Unexpected token export。后来查文档才确认archify 明确要求最低支持 Chrome 89、Firefox 86、Safari 14.1。它的设计哲学很清晰——不为兼容性妥协现代 Web 能力。所以如果你的团队还在用 Windows 7 IE11 的老系统做架构评审archify 不是你的答案但如果你的 CI/CD 流水线能自动构建并部署 HTML 到内部 Wiki那它就是完美的。第二所有样式和脚本都采用相对路径引用且默认打包进./assets/目录。这带来两个实操约束一是你不能简单地把生成的index.html单独复制粘贴到另一个项目里必须连同整个assets文件夹一起搬运二是如果要集成到现有 Vue/React 项目中不能直接import它的 JS而必须把它当作一个独立的 Web App 嵌入 iframe或者手动提取其核心渲染逻辑重构。我试过用 Webpack 的html-webpack-plugin把 archify 输出注入到主应用结果因为 CSS 作用域冲突节点连线全部错位。最终方案是在主应用里开一个新路由/architectures/:id用 iframe 加载 archify 生成的 HTML并通过postMessage实现父子通信——比如点击节点时主应用侧边栏同步显示该服务的 Git 提交记录。第三window.archifyInit()是唯一官方支持的初始化接口且参数是纯 JSON 对象。这个设计看似简单实则暗藏玄机。它意味着 archify 的架构元数据模型是完全开放的、可编程的。你可以用 Python 脚本扫描src/main/java/com/example/order目录下的 Spring Boot Controller 类自动生成nodes和edges数组也可以用 Bash 脚本调用kubectl get pods -n order-system把 Pod 状态注入status字段甚至可以写一个 GitHub Action在每次main分支 push 后自动拉取最新服务注册中心数据重新生成 HTML 并推送到 Pages。它的扩展性不来自插件系统而来自对标准 Web API 的极致尊重——只要你能构造出符合 schema 的 JSON它就能渲染。提示不要试图修改main.js或style.css文件来定制样式。archify 的更新机制是全量覆盖assets目录手动修改会被下次生成彻底删除。正确做法是在index.html的head中追加自定义style标签或通过window.archifyInit()的config参数传入主题色变量需查阅其源码中initConfig的定义。3. “AI 代理”到底代理了什么——拆解自然语言到架构图的转换链路标题里“AI 代理”四个字最容易引发误解。它既不是调用 OpenAI API 的黑盒服务也不是训练好的端到端大模型。archify 的 AI 组件是一套轻量级、可解释、可调试的规则引擎 模糊匹配器其核心能力在于将非结构化文本中的架构语义精准锚定到预定义的领域本体Domain Ontology上。我们来看它处理一句话的真实过程“用户下单请求由 Nginx 反向代理转发给 Spring Cloud Gateway网关根据 path 路由到 order-serviceorder-service 内部通过 Feign 调用 inventory-service 查询库存inventory-service 依赖 MySQL 主库和 Redis 缓存。”Step 1实体识别Entity Recognitionarchify 内置一个 237 行的 YAML 规则库rules/entities.yaml定义了常见架构元素的正则模式与标准化 ID- pattern: nginx|Nginx|反向代理 id: nginx-proxy type: infrastructure - pattern: Spring Cloud Gateway|网关|gateway id: spring-cloud-gateway type: service - pattern: order-service|订单服务|订单模块 id: order-service type: service - pattern: MySQL|主库|数据库 id: mysql-primary type: database它不是用 BERT 做命名实体识别而是用RegExp.exec()逐行匹配。好处是100% 可控你随时可以添加一条pattern: 达梦数据库|DM8来支持国产数据库坏处是遇到“用 PostgreSQL 替代 MySQL”这种否定句它会同时识别出mysql-primary和postgresql需要后续规则清洗。Step 2关系抽取Relation Extraction识别出实体后进入更关键的步骤——判断它们之间的连接关系。archify 不依赖依存句法分析而是用一组“动词-介词”组合规则- verb: 转发|路由|代理|分发 preposition: 到|至|给|- direction: source-to-target - verb: 调用|依赖|访问|查询 preposition: 通过|via|using direction: source-to-target - verb: 依赖|使用|基于 preposition: 和|与|及 direction: bidirectional上面例句中的“转发给”、“路由到”、“调用”都被精准捕获生成三条边nginx-proxy → spring-cloud-gateway、spring-cloud-gateway → order-service、order-service → inventory-service。而“依赖 MySQL 主库和 Redis 缓存”中的“和”触发双向关系规则生成inventory-service ↔ mysql-primary和inventory-service ↔ redis-cache。Step 3拓扑布局Topology Layout最后一步才是真正的“AI”时刻——不是生成图而是决定图怎么排。archify 默认采用Dagre-D3 的分层有向图算法但做了关键改造它会优先将type: infrastructure的节点如 Nginx、Kafka放在最左侧type: service放中间type: database放右侧形成符合工程师直觉的“左→右接入层→业务层→数据层”流向。这个布局不是随机的而是硬编码在layout.js的getRankingScore()函数里function getRankingScore(node) { switch(node.type) { case infrastructure: return 1; case service: return 2; case database: return 3; default: return 2.5; } }所以如果你把 MySQL 标记为type: service它就会被排到中间层破坏视觉逻辑。这就是为什么阅读rules/entities.yaml并按需调整type字段比调参更重要。注意archify 的“AI”不解决语义歧义。例如“订单服务调用用户服务获取收货地址”它无法判断这是同步 HTTP 调用还是异步消息订阅。你需要在原文中明确写成“订单服务通过 Kafka Topicuser-address-updated订阅用户地址变更事件”。它的智能在于“忠实还原你写的意图”而非“猜测你没写的意图”。4. 从零开始跑通第一个架构图手把手实战与避坑指南别被“AI 代理”吓住——archify 的本地 CLI 工具链极其精简核心依赖只有 Node.js 18 和一个 Python 3.9 环境用于可选的代码扫描功能。下面是我从 clone 到生成可交互 HTML 的完整路径每一步都标注了真实踩过的坑。4.1 环境准备三个必须确认的检查点Node.js 版本陷阱archify 的package.json声明engines: {node: 18.0.0}但实际测试发现Node.js 18.12.0 在 macOS 上会因fs.cpSync()的 bug 导致 assets 复制失败。我卡在这里 3 小时最终降级到 18.18.2 才解决。建议执行node -v # 必须 18.18.0 npm list -g | grep archify # 确保全局无残留旧版本Python 路径必须被 Node.js 正确识别如果你用 pyenv 管理 Pythonwhich python3返回/Users/xxx/.pyenv/shims/python3但 archify 的 CLI 会尝试执行/usr/bin/python3。解决方案不是改系统 PATH而是在项目根目录创建.archifyrc文件{ pythonPath: /Users/xxx/.pyenv/shims/python3 }这个配置文件是 archify 唯一读取的全局设置比环境变量更可靠。输入文件编码必须是 UTF-8 without BOM很多 Windows 编辑器如记事本保存的 TXT 文件默认带 BOMarchify 解析时会把\uFEFF当作非法字符报错。用 VS Code 打开文件右下角确认编码显示为 “UTF-8”点击后选择 “Save with Encoding” → “UTF-8”。4.2 创建你的第一个架构描述文件新建architecture.md内容如下注意这是 archify 唯一接受的输入格式不是任意 Markdown# 订单系统架构 ## 核心服务 - API 网关接收所有外部 HTTPS 请求基于 JWT 验证用户身份 - 订单服务处理创建、查询、取消订单逻辑内部调用库存服务 - 库存服务管理商品库存依赖 MySQL 主库和 Redis 缓存 ## 数据流 1. 用户下单请求 → API 网关 → 订单服务 2. 订单服务 → 库存服务Feign 调用 3. 库存服务 ↔ MySQL 主库读写 4. 库存服务 ↔ Redis 缓存读写 ## 基础设施 - Nginx作为边缘反向代理处理 SSL 终止 - Kafka订单创建成功后发布 order-created 事件关键细节#和##标题层级定义了分组逻辑archify 会把同级标题下的列表项归为同一类节点→和↔符号是硬编码的关系标识符不能用-或替代每行列表项必须以-开头后面紧跟节点名称冒号前的部分冒号后的内容是描述不影响图结构。4.3 执行生成命令与结果验证# 全局安装只需一次 npm install -g archify-cli # 进入项目目录生成架构图 archify generate --input architecture.md --output ./docs/architecture # 启动本地服务器预览自动打开浏览器 archify serve --port 8080生成的./docs/architecture/index.html会包含顶部导航栏显示当前架构名称和刷新按钮中央画布Dagre-D3 渲染的可缩放、可拖拽架构图右侧边栏点击任一节点后显示其详细信息包括“描述”来自 Markdown 描述、“类型”自动推断、“关联服务”自动分析出的上下游底部状态栏显示当前节点数、边数、生成时间戳。必做验证动作点击“API 网关”节点确认边栏显示 “类型service”且“关联服务”列出 “订单服务”按住空格键拖动画布确认所有连线随节点移动保持连接右键任意节点选择“导出为 PNG”检查生成的图片是否包含完整文字中文不会乱码在浏览器地址栏末尾加上?themedark确认主题切换生效archify 内置 light/dark 两种主题。踩坑实录第一次生成时我发现 Kafka 节点没有出现在图中。排查发现architecture.md里写的是 “Kafka订单创建成功后发布...”而 rules/entities.yaml 中 Kafka 的 pattern 是kafka|Kafka|消息队列缺少“消息队列”这个别名。我立刻在 rules 文件里追加了一行- pattern: 消息队列|MQ然后重新运行archify generate—— Kafka 立刻出现在图中。这印证了 archify 的设计哲学可控性优于神秘感可调试性优于黑盒性能。5. 进阶实战让架构图真正融入你的工程流水线生成单个 HTML 文件只是起点。archify 的真正威力在于它能像一个标准构建步骤一样无缝嵌入你的 CI/CD、文档系统和监控平台。以下是我在三个真实场景中的落地实践。5.1 场景一GitHub PR 自动更新架构图无需人工干预目标每次向main分支推送代码后自动更新docs/architecture/index.html并推送到 GitHub Pages。实现步骤在项目根目录创建.github/workflows/architecture.ymlname: Update Architecture Diagram on: push: branches: [main] paths: [architecture.md, archify-config.json] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkoutv4 with: fetch-depth: 0 # 必须否则 git push 会失败 - name: Setup Node.js uses: actions/setup-nodev4 with: node-version: 18 - name: Install archify run: npm install -g archify-cli - name: Generate diagram run: archify generate --input architecture.md --output docs/architecture - name: Deploy to Pages uses: peaceiris/actions-gh-pagesv3 with: github_token: ${{ secrets.GITHUB_TOKEN }} publish_dir: ./docs/architecture关键配置在archify-config.json中指定baseUrl确保生成的 HTML 中所有资源路径正确{ baseUrl: /my-project/, theme: dark, showLegend: true }这样生成的index.html里script src./assets/main.js会自动变为script src/my-project/assets/main.js适配 GitHub Pages 的子路径部署。效果现在团队成员在 PR 描述里只需写 “本次修改影响库存服务的缓存策略”合并后Pages 站点上的架构图会自动刷新点击“库存服务”节点边栏里“描述”字段已更新为最新版本。5.2 场景二对接 Prometheus 实现架构图实时状态着色目标让架构图中的节点颜色实时反映对应服务的健康状态绿色UP黄色High Latency红色Down。实现原理archify 的window.archifyInit()支持传入liveData配置它会定期调用你提供的函数获取节点状态数据。步骤在architecture.md中为每个服务添加唯一标识符ID## 核心服务 - API 网关 [gateway-api]接收所有外部 HTTPS 请求... - 订单服务 [service-order]处理创建、查询、取消订单逻辑...创建live-status.js文件暴露一个返回 Promise 的函数// live-status.js export async function fetchLiveStatus() { const response await fetch(http://localhost:9090/api/v1/query?queryup{job~service.*}); const data await response.json(); return data.data.result.map(item ({ id: item.metric.job.replace(service-, ), // 匹配 [service-order] 中的 order status: item.value[1] 1 ? healthy : unhealthy })); }修改index.html的初始化脚本script typemodule import { fetchLiveStatus } from ./live-status.js; window.archifyInit({ /* ...原有 nodes/edges ... */, liveData: { fetcher: fetchLiveStatus, interval: 30000 // 每30秒刷新一次 } }); /script效果架构图上线后节点会根据 Prometheus 中up指标自动变色。当service-order的 Pod 崩溃时图中“订单服务”节点 30 秒内变为红色运维同学无需登录 Grafana一眼就能定位故障点。5.3 场景三从 Java 代码自动生成服务依赖图消除文档与代码的偏差目标扫描src/main/java下所有RestController和FeignClient注解生成真实的调用链路而非靠人肉维护的文档。实现方式archify 内置archify-scan-java子命令但需配合 Maven 插件。在pom.xml中添加插件plugin groupIdorg.apache.maven.plugins/groupId artifactIdmaven-dependency-plugin/artifactId version3.6.1/version executions execution idcopy-dependencies/id phaseprepare-package/phase goalsgoalcopy-dependencies/goal/goals configuration outputDirectory${project.build.directory}/lib/outputDirectory /configuration /execution /executions /plugin执行扫描命令archify scan-java \ --source src/main/java \ --output java-dependencies.json \ --classpath target/lib/*将生成的java-dependencies.json作为archify generate的输入源之一archify generate \ --input architecture.md \ --input java-dependencies.json \ --output docs/architecturearchify 会自动合并两个来源architecture.md定义节点元数据名称、描述、类型java-dependencies.json提供精确的调用关系order-service调用inventory-service的具体方法名和 URL。这样生成的图每一根连线都有代码级依据彻底杜绝“文档写的是 A 调 B实际代码调的是 C”的尴尬。最后分享一个血泪教训在首次集成 Java 扫描时我忘记在pom.xml中配置maven-compiler-plugin的source和target为17导致archify scan-java解析字节码失败报错Unsupported class file major version 61。解决方案不是升级 archify而是统一项目 JDK 版本——archify 的扫描器永远只支持当前主流 JDK 版本它不负责兼容历史包袱。
返回列表