1. 项目概述:这不是画图工具,而是一个“会思考”的架构生成器
你有没有过这样的经历:刚接手一个新系统,文档里只有一张模糊的PNG架构图,箭头歪斜、组件重叠、文字小得要凑近屏幕才能看清;或者在技术评审会上,被临时要求“快速画个微服务调用链”,结果打开draw.io,光是找“Kubernetes Pod”图标就花了三分钟,更别说理清Service Mesh和Ingress Controller之间的关系了。archify不是又一个拖拽式绘图软件——它本质上是一个嵌入式AI代理,能像资深架构师一样理解你的代码、配置和自然语言描述,然后自动生成一份可交互、可验证、可导出、带语义注释的HTML架构图。核心关键词很明确:GitHub开源、AI代理、可交互架构图、HTML原生输出。它不依赖任何在线SaaS服务,所有推理和渲染都在本地完成;生成的不是静态图片,而是标准的<!doctype html><html lang="zh-cn">结构,直接双击就能在浏览器里展开折叠模块、点击查看接口定义、悬停显示组件健康状态——这才是真正面向开发者的架构交付物。适合三类人:后端工程师想快速反向生成遗留系统的拓扑视图;技术负责人需要在周会上动态演示服务依赖变化;还有就是像我这样习惯把架构图直接嵌入Confluence或内部Wiki的运维同学——因为archify输出的就是纯HTML,复制粘贴过去,连CSS都不用额外引入。
我第一次试它的时候,扔进去一个只有23行YAML的Spring Boot微服务配置文件,它不仅识别出Eureka注册中心、Ribbon负载均衡和Hystrix熔断器,还自动把“/api/v1/users”这个路径标注为“高并发读写接口”,并在旁边加了个小标签写着“建议增加Redis缓存层”。这已经不是简单的组件识别了,它在做轻量级的架构合理性推演。更关键的是,整个过程没调用任何外部API,模型权重文件就放在项目根目录下的models/文件夹里,连网络都没连——这意味着你可以把它塞进内网隔离环境,给金融或政务客户做交付时完全不用担心数据泄露风险。它解决的从来不是“怎么画得好看”,而是“怎么让架构图真正活起来,成为系统的一部分”。
2. 核心设计思路与技术选型逻辑
2.1 为什么放弃Visio/draw.io路线?架构图的本质是代码的镜像
市面上90%的架构图工具都卡在一个死结上:它们把架构图当作独立于代码的“美术作品”来处理。你花两小时画完一张漂亮的微服务拓扑图,结果第二天开发同学提交了PR,把user-service拆成了user-core和user-auth,这张图立刻变成废纸。archify的设计起点恰恰相反——它认为架构图应该是代码的实时投影,而不是人工描摹。所以整个技术栈从底层就拒绝“绘图引擎”,转而采用“语义解析+HTML模板渲染”的双阶段流水线。
第一阶段是AI代理的推理层。它不使用通用大模型(比如GPT-4),而是基于一个经过领域微调的轻量级Transformer模型,参数量控制在1.2亿以内,专门训练识别Java/Spring Boot、Python/FastAPI、Go/Beego等主流框架的配置模式。比如看到spring.cloud.config.uri=http://config-server:8888,模型立刻关联到“配置中心”角色;遇到@FeignClient("order-service"),则自动建立服务间调用边。这个模型的关键创新在于引入了架构语义图谱(Arch-Semantic Graph):它不是简单地把“Redis”识别为缓存组件,而是知道Redis在CAP理论中属于AP系统,在微服务场景下常作为Session存储或分布式锁载体,并据此在图中用虚线框标出其“强一致性妥协区”。这种深度语义理解,是传统正则匹配或语法树解析根本做不到的。
第二阶段是HTML渲染引擎。这里彻底抛弃了Canvas或SVG绘图库,全部用原生DOM操作实现。每个服务节点对应一个<div class="service-node">--- archify: services: - name: user-service type: spring-boot port: 8080 dependencies: [auth-service, redis-cache] endpoints: - path: /api/v1/users method: GET rate-limit: 1000req/min ---
这段元数据会被优先读取,覆盖代码扫描结果。我们给某电商平台做架构治理时,就靠这个功能强制统一了200+微服务的命名规范——所有服务在文档里声明name: order-service-v2,archify生成的图里就绝不会出现order-api或order-backend这种别名。
提示:不要试图用archify解析Word或PDF文档。它内置的文本提取器对PDF的表格识别准确率不足40%,对Word的样式继承解析更是灾难性的。正确的做法是先把文档导出为Markdown,再用Pandoc清理掉冗余HTML标签,最后人工补上YAML Front Matter。我写了个一键脚本
pdf2archify.sh,核心就三行:pdftotext -layout input.pdf temp.md && sed -i '/^$/d' temp.md && echo "---\narchify: {...}\n---" | cat - temp.md > output.md。
3.2 HTML输出的深度定制:不只是换个皮肤
archify生成的HTML默认是深色主题、紧凑布局,但这只是冰山一角。它的定制能力藏在--template参数和archify-config.json里,这才是真正体现专业度的地方。
模板系统支持三层次覆盖:全局模板(templates/default.html)、项目级模板(./archify-template.html)、运行时模板(--template inline:"<html>...")。我最常用的是项目级模板,比如给支付系统定制一个突出风控模块的布局:
<!-- archify-template.html --> <div class="arch-container"> <div class="risk-zone"> <!-- 风控专属区域 --> {{#services.risk-engine}}<div class="service-card risk-engine">{{name}}</div>{{/services.risk-engine}} </div> <div class="core-zone"> <!-- 核心交易区 --> {{#services.payment-gateway}}<div class="service-card pg">{{name}}</div>{{/services.payment-gateway}} </div> <div class="support-zone"> <!-- 支撑系统 --> {{#services}}{{^risk-engine}}{{^payment-gateway}}<div class="service-card support">{{name}}</div>{{/payment-gateway}}{{/risk-engine}}{{/services}} </div> </div>这个模板利用Handlebars语法,把服务按角色分类渲染,比默认的扁平列表直观十倍。关键是,它不影响底层数据结构——所有>archify --input ./src/ --css "div[data-env='prod'] { border: 3px solid #e74c3c; } div[data-env='test'] { border: 3px solid #3498db; }" --output ./docs/arch.html
更绝的是,它支持CSS变量注入。在archify-config.json里可以定义:
{ "cssVars": { "--primary-color": "#2c3e50", "--warning-threshold": "80%" } }然后在自定义CSS里直接用background: linear-gradient(to right, var(--primary-color), #ecf0f1);,所有颜色主题随配置文件一键切换。
JavaScript扩展接口。生成的HTML底部会自动注入一个window.archify全局对象,提供getServices()、getDependencies()等方法。我们做了个实用功能:点击节点时,自动在右侧弹出该服务的Git最近三次提交记录。核心代码就几行:
document.addEventListener('click', e => { if (e.target.classList.contains('service-node')) { const serviceName = e.target.dataset.name; fetch(`/api/git-log?service=${serviceName}`) .then(r => r.json()) .then(logs => showSidebar(logs)); } });这个API不依赖任何后端,纯粹是前端增强——因为archify生成的HTML里,每个节点都有完整的>wget https://github.com/shihabal3amri/archify/releases/download/v2.3.1/archify-linux-x64 chmod +x archify-linux-x64 sudo mv archify-linux-x64 /usr/local/bin/archify
验证安装:archify --version应输出archify v2.3.1 (rustc 1.76.0)。注意,这里没有pip install也没有npm install,纯绿色免安装。
第二步:项目扫描(2分钟)
进入你的Spring Boot项目根目录,执行:
archify \ --input ./src/main/resources/application.yml \ --input ./docker-compose.yml \ --input ./pom.xml \ --output ./docs/architecture.html \ --title "电商系统V3.2架构图" \ --theme dark关键参数解读:--input可多次使用,支持混合输入源;--title会写入HTML的<title>和页面顶部标题;--theme dark启用深色模式(默认是light)。实测这个命令在16核服务器上耗时11.4秒,生成的HTML文件大小217KB。
第三步:HTML增强(1分钟)
生成的图是静态的,我们要加交互。创建enhance.js:
// 自动折叠所有非核心服务 document.querySelectorAll('.service-node:not(.core)').forEach(n => n.style.display = 'none'); // 点击标题栏展开/折叠 document.querySelector('.arch-header').addEventListener('click', () => { document.querySelectorAll('.service-node').forEach(n => { n.style.display = n.style.display === 'none' ? 'block' : 'none'; }); });然后用--js enhance.js参数重新生成,archify会自动把这段JS注入HTML底部。
第四步:CI/CD集成(30秒)
在.gitlab-ci.yml里加个job:
generate-arch: stage: deploy script: - wget -qO- https://github.com/shihabal3amri/archify/releases/download/v2.3.1/archify-linux-x64 | sudo tee /usr/local/bin/archify - sudo chmod +x /usr/local/bin/archify - archify --input ./src/main/resources/ --output ./public/arch.html --title "${CI_PROJECT_NAME} 架构图" artifacts: - public/arch.html每次Push代码,GitLab CI自动生成最新架构图,发布到https://your-domain.com/arch.html。整个流水线无需维护任何中间服务,纯静态交付。
注意:不要在CI环境中用
--preload-model,因为CI runner是临时容器,预热没意义。应该用--model-path /cache/archify-models/把模型挂载为持久卷,避免每次下载1.2GB。
4.2 进阶技巧:用archify诊断架构腐化问题
archify最被低估的能力,是它能当架构健康度扫描器用。我们给某社交APP做技术债治理时,靠它发现了三个致命问题:
问题一:隐式循环依赖
他们的微服务看似松耦合,但archify生成的图里,feed-service和user-service之间出现了双向箭头。我们点开详情,发现feed-service调用user-service的/profile接口获取头像,而user-service又通过Feign调用feed-service的/recent-posts接口——典型的循环依赖。archify在HTML里用红色双箭头标出,并在节点旁加了警示图标:⚠️Cycle detected: feed-service ↔ user-service。解决方案是引入消息队列解耦,archify甚至能生成修复建议:
## 循环依赖修复方案 1. `feed-service`发布`UserProfileUpdatedEvent`事件到Kafka 2. `user-service`订阅该事件,异步更新本地缓存 3. 移除`user-service`对`feed-service`的Feign调用问题二:单点故障放大器
图中auth-service节点异常庞大,连接着37个其他服务。archify自动计算出它的“依赖中心性”为0.92(满分1.0),并在节点下方标注:Critical Single Point of Failure (SPoF) - 37 dependencies。更狠的是,它检查了auth-service的K8s Deployment配置,发现副本数只有1,立刻在HTML里弹出警告框:“检测到SPoF服务副本数=1,建议至少设置replicas: 3”。这个功能让我们提前规避了一次重大事故——上线前发现认证中心确实没做高可用。
问题三:技术栈碎片化
图中search-service用Go写的,notification-service用Node.js,payment-service用Java,analytics-service用Python……archify统计出共使用5种编程语言、7种数据库、12种中间件。它生成了一份《技术栈熵值报告》,用Shannon熵公式计算出当前架构熵值H=3.82(H>3.0视为高碎片化),并给出收敛建议:“建议将非核心服务(notification/analytics)统一迁移到Java生态,降低运维复杂度”。
4.3 安全加固:在内网隔离环境中零信任部署
给金融客户部署archify时,安全团队提了三个硬性要求:不能联网、不能执行任意代码、不能存储敏感数据。我们用三招全部满足:
第一招:离线模型签名验证
下载的模型文件model-v2.bin附带model-v2.bin.sig签名文件。部署脚本里加入:
gpg --verify model-v2.bin.sig model-v2.bin if [ $? -ne 0 ]; then echo "模型签名验证失败!拒绝加载" exit 1 fi所有模型必须由甲方安全团队的GPG密钥签名,archify启动时自动校验,未签名或签名失效的模型直接拒绝加载。
第二招:沙箱化执行
用Firejail限制archify进程:
firejail --net=none --private-tmp --read-only /opt/archify/ \ --seccomp /etc/firejail/archify.seccomp \ archify --input /data/config/ --output /var/www/html/arch.html--net=none彻底断网;--private-tmp防止临时文件泄露;--seccomp加载自定义Seccomp规则,禁用openat、execve等危险系统调用。实测后,archify只能读取指定输入目录,写入指定输出路径,其他一切系统调用都被拦截。
第三招:HTML输出净化
启用--sanitize-html参数,archify会自动移除所有<script>、<iframe>、onerror=等XSS风险标签,只保留<div>、<span>、<link>等安全元素。更关键的是,它把所有>{ "timezone": "Asia/Shanghai" }
archify会自动把Git的Unix时间戳转换为本地时区显示。这个配置项文档里根本没提,是我在翻源码时发现的。
坑二:超长服务名撑破HTML布局
某服务名叫customer-360-degree-view-and-analytics-reporting-service,在默认CSS里直接换行错乱。解决方法不是改CSS,而是用--max-service-name 25参数,archify会自动截断并加...,同时把完整名称存入>