news 2026/10/7 8:24:53

从拓扑图工具到一体化网管:一个 Vert.x 项目的 3.4 版本演进复盘

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从拓扑图工具到一体化网管:一个 Vert.x 项目的 3.4 版本演进复盘

先说结论:整套系统最后打包出来是一个约 45MB 的 fat jar + 一个 SQLite 单文件库,不依赖 Tomcat/MySQL/Redis,一台普通 Windows 主机双击就能跑。它现在能管设备拓扑、无线终端、射频信道、告警工单、配置回滚,还能被 AI 助手通过 MCP 协议直接调用。

这篇文章想聊聊它是怎么一步步长出来的,以及 Vert.x 在这个场景里到底香不香。

起点:一个极简的拓扑工具

最初的需求很朴素——网络里的 Mikrotik 设备越来越多,登 Winbox 一台台看状态太痛苦,能不能有张图实时显示谁在线谁离线、CPU 多少、流量多大?

于是第一版就是个 Vert.x + AntV G6 的拓扑图工具:设备通过 RouterOS 自带的 scheduler + script 把 heartbeat/report/manage 三类信息被动上报到服务端,服务端解析后刷新拓扑节点。单个服务 jar 只有 7MB 左右,资源占用极低,1 核 2G 的机器能跑好几个 Vert.x 服务——这是它私有化基因的源头。

演进:被真实运维需求推着走

用起来之后,需求像滚雪球:

  • “客户报网卡,我怎么知道是哪个终端哪个信道的问题?” → 加了无线终端明细(RSSI/SNR/CCQ)和射频信道热力分析,按 802.11 语义建模,推荐信道可以一键下发;
  • “半夜设备掉了没人知道” → 加了阈值告警引擎:指标字典 + 每设备阈值 + firing/resolved 状态机 + 防抖 + 静默期,推企微/钉钉/飞书/邮件;
  • “配置被人偷偷改过,故障没法恢复” → 加了配置基线:抓取、快照、行级 Diff、一键回滚,外加每日自动备份(用 SQLite 的VACUUM INTO滚动备份);
  • “几十台新设备要逐台配上报,手酸” → 加了接入向导:bootstrap.rsc 三步生成一键植入,目标脚本正文的 SHA-256 写进设备侧 script 注释,周期对账发现 missing/stale 自动幂等覆写收敛——设备配置漂移会被自动纠正或暴露;
  • “值班不想装 Winbox” → 加了浏览器内嵌 SSH 终端(SSH over WebSocket,独立端口 + 专属sys:ssh权限点,凭据由服务端解密不出服务器);
  • “能不能让 AI 帮我查告警?” → 加了API Key(read/write/mcp 分级)+ MCP 服务,设备/告警/拓扑/无线终端/射频扫描/流量做成 9 个标准工具,JSON-RPC 调用,写操作强制 write 权限,全程可审计。

架构速览(给想参考的同学)
层选型备注
内核Vert.x 4.4.6(定制封装)+ RxJava2事件循环 + 服务代理,REST 由注解扫包自动注册,180+ 端点
数据vertx-jdbc-client + HikariCP + SQLiteSQL 集中在 yaml 的 sqlConfig,启动期幂等建表/加列迁移链
前端Vue 2 + Element-UI + AntV G6 + echarts40+ 路由,构建产物内嵌进 jar 的 resources/dist
安全JWT 全局鉴权 + RBAC + BCrypt + AES-256 + TrueLicense + ClassFinal设备凭据加密存储,密钥外置不入包
采集设备被动上报为主 + RouterOS API/SSH 主动补采NAT 后设备采不到,所以被动上报是主链路

几个踩过的坑,写出来省大家时间:

  1. 经 RouterOS API 下发命令必须斜杠全路径(/queue/simple/print),空格形式会被 SDK 把首段当命令路径,报 no such command;
  2. 多行脚本走传统 API 通道必须 LF 归一,带 CRLF 会把后续参数解析成新命令,静默污染脚本正文;
  3. SQLite 的 PRAGMA 只能靠 JDBC URL query 参数注入(WAL/busy_timeout),connection_init_sql 在 vertx-jdbc-client 4.4.6 会被静默忽略;
  4. 新增表必须挂到启动建表链,否则运行期才报 no such table;
  5. 设备 IO 要用独立有界线程池隔离,否则阻塞采集会挤占 worker 池把事件循环拖死。
现状与获取

目前系统版本 3.4:138 个 Java 源文件、47 张表、180+ REST 端点、40+ 前端页面,分社区/标准/专业/企业四档,社区版免费。整个技术栈没有黑盒——拓扑可导入导出 JSON,接口全部开放,想看源码聊实现的,评论区见。

#Vert.x #Java #Mikrotik #RouterOS #SQLite #开源 #后端架构 #Vue

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/7 8:24:26

UDS 在 LIN 协议上的实现(UDSonLIN)

UDS 在 LIN 协议上的实现(UDSonLIN) 核心结论 UDSonLIN 是 ISO 14229-7 定义的标准,将 UDS 诊断服务映射到 LIN 总线上,实现主节点通过 LIN 网络对从节点进行标准化诊断和固件升级。 诊断请求通过 LIN 的 ID=0x3C 帧发送,响应通过 ID=0x3D 帧返回,使用 NAD(节点地址)…

作者头像 李华
网站建设 2026/10/7 8:24:23

UDS(统一诊断服务)详解及 C++ 代码示例

UDS(统一诊断服务)详解及 C++ 代码示例 一、UDS 概述 UDS(Unified Diagnostic Services,统一诊断服务) 是 ISO 14229 标准定义的汽车诊断协议,广泛应用于 ECU(电子控制单元)的诊断、刷写、标定等场景。它运行在 CAN、CAN-FD、Ethernet 等底层传输协议之上(如 ISO 15…

作者头像 李华
网站建设 2026/10/7 8:23:22

OpenShell:基于WebSocket与xterm.js的浏览器终端实现与部署指南

做服务器运维这行,最烦的就是临时在外面,手边只有一部手机或者别人的电脑,想登自己的服务器看一眼日志、重启个服务,却发现没装SSH客户端,整个人瞬间就卡住了。OpenShell就是为解决这个场景出现的——它是一个开源的We…

作者头像 李华