☰
Network Optimizer系列26:架构深潜——.NET 10+Blazor构建的自托管NMS模块化设计
2026/10/16 1:57:10 网站建设 项目流程

【免费下载链接】NetworkOptimizer

Self-hosted optimization, monitoring (NMS), and security audit tool for UniFi Networks. Includes Wi-Fi Optimizer for wireless health scoring and channel optimization, advanced DNS/VLAN/firewall security checks, config optimization suggestions, centralized WAN and LAN speed test server w/ L2 tracing, CM, ONT, SFP, 5G modem stats +more.​​​​​​​​​​​​​

项目地址:https://gitcode.com/gh_mirrors/ne/NetworkOptimizer
点击查看免费下载

Network Optimizer 是一款面向 UniFi 网络的自托管 NMS(网络管理系统),用 .NET 10 + Blazor 构建,提供 Wi-Fi 优化、安全审计、WAN/LAN 测速与设备健康监控等能力。这篇文章从架构视角拆解它的模块化设计:12 个功能如何被拆成职责清晰的 .NET 类库,又如何通过单向依赖和统一存储层拼装成一个可自托管、可扩展的完整系统。

为什么选择 .NET 10 + Blazor 技术栈

对于想搭一套"私有网络监控平台"的新手来说,理解一个项目的技术选型是理解架构的第一步。Network Optimizer 的完整技术栈如下:

技术组件在架构中的角色
.NET 10全部服务端与功能模块的运行框架(TargetFramework为net10.0)
Blazor ServerWeb UI 层,页面在服务端渲染,通过 SignalR 与后端实时通信
EF Core + SQLite核心持久层:配置、审计历史、测速结果等结构化数据
InfluxDB 2.x可选的时序数据库,承载 SNMP 指标、延迟探针等监控数据
iperf3 / OpenSpeedTestLAN/WAN/客户端测速引擎
Go 二进制运行在网关上的轻量组件(WAN 测速、WAN Steering、AP Agent)
Serilog统一日志

这个选型的核心思路是:单进程、少外部依赖。不装 InfluxDB 也能用(只是没有时序监控),数据库就是一个 SQLite 文件——这是"自托管"体验顺滑的关键。

模块地图:一个解决方案里的 12 个功能库

打开 NetworkOptimizer.sln,你会看到按"功能域"划分的 13 个src/项目 + 13 个对应的tests/测试项目。官方 README 中的结构总览:

src/ ├── NetworkOptimizer.Web # Blazor Web UI(组合根) ├── NetworkOptimizer.Core # 共享工具与接口 ├── NetworkOptimizer.Storage # SQLite + InfluxDB 存储层 ├── NetworkOptimizer.UniFi # UniFi Console API 客户端 ├── NetworkOptimizer.Audit # 83 项安全检查的审计引擎 ├── NetworkOptimizer.Diagnostics # 配置优化建议 ├── NetworkOptimizer.Monitoring # SNMP 轮询与时序指标 ├── NetworkOptimizer.WiFi # Wi-Fi 健康评分与信道优化 ├── NetworkOptimizer.Sqm # 自适应 SQM 拥塞管理 ├── NetworkOptimizer.Threats # 威胁情报分析 ├── NetworkOptimizer.Alerts # 告警规则与定时任务 ├── NetworkOptimizer.Reports # PDF / Markdown 报告 └── NetworkOptimizer.Agent # 远程站点轻量 Agent

各模块职责一句话说明:

  • src/NetworkOptimizer.UniFi/:与 UniFi Console 对话的唯一入口。UniFiApiClient.cs 封装了 Cookie 认证、CSRF Token、401 自动重登与 Polly 重试,其他模块从不直接碰 UniFi 的 HTTP API。
  • src/NetworkOptimizer.Audit/:纯规则引擎。防火墙影子规则、VLAN 隔离、DNS 泄漏等 83 项检查全部是无状态的 C# 规则类,输入配置快照,输出 0–100 分——这也是它测试覆盖最厚的模块之一。
  • src/NetworkOptimizer.Monitoring/:SNMP 轮询器、探针、各厂商(Cable Modem / ONT / 5G 调制解调器)的指标解析器都在这里,指标经过MetricsAggregator归一化后写入 InfluxDB。
  • src/NetworkOptimizer.Web/Services/:整个 Web 项目里最大的目录(500+ 个服务类),负责把上面的功能库编排成面向用户的业务流程,如测速调度、Agent 隧道代理、告警联动。

💡 架构要点:每个功能都是独立类库,可以单独编译、单独测试、单独演进。想只读审计引擎的代码,只需打开一个项目即可,不用在 Web 层几千个文件里大海捞针。

依赖分层:Web 是"组合根",功能库只认接口

在 NetworkOptimizer.Web.csproj 中可以看到清晰的单向依赖:Web项目引用全部 12 个功能库,而功能库之间互不引用,只依赖Core(共享模型与接口)。依赖方向严格是Web → 功能库 → Core/Storage,不存在反向或循环依赖。

真正的"组装"发生在组合根 Program.cs:

builder.Services.AddDbContext<NetworkOptimizerDbContext>((sp, options) => ...); builder.Services.AddScoped<IAuditRepository, AuditRepository>(); builder.Services.AddScoped<IMonitoringInterfaceRepository, MonitoringInterfaceRepository>(); // ... 十余个仓储与服务的注册

所有数据访问都通过 src/NetworkOptimizer.Storage/ 中"接口 + 仓储"的成对文件完成(Interfaces/IxxxRepository.cs+Repositories/XxxRepository.cs),功能模块拿到的是抽象而非具体实现。这就是典型的依赖注入分层:

  1. 表现层:Blazor 组件(src/NetworkOptimizer.Web/Components/)
  2. 应用服务层:Web/Services下的业务流程编排
  3. 领域功能层:12 个功能类库
  4. 基础设施层:Storage(SQLite/InfluxDB)、UniFi API 客户端、Agent 隧道协议

双数据库设计:SQLite 存"事实",InfluxDB 存"时序"

Storage 模块 是理解这套 NMS 数据流的钥匙:

  • SQLite(EF Core):承载一切"持久事实"——设置、审计历史、测速结果、SQM 基线、Agent 配置。Migrations/ 目录下已有 300 个迁移文件,启动时自动Migrate(),用户无需手工执行数据库升级。
  • InfluxDB(可选):MonitoringInfluxClient是全项目唯一触碰 InfluxDB 客户端的地方。SNMP 指标写入走缓冲 + 定时批量刷盘,避免高频打爆数据库;连接 Token 经ICredentialProtectionService加密存储,页面向导自动完成 bucket 与 token 的开通。

这套"结构化数据 + 时序数据分离"的设计,让监控历史(如 ISP Health 评分)既保留完整时间轴,又不污染主库:

远程站点接入:On-Site Agent 的隧道协议设计

自托管 NMS 的一个经典难题是:多站点如何安全接入而不开放入站端口?Network Optimizer 的答案是 NetworkOptimizer.Agent——一个可以直接跑在客户网关上(实测占用约 50 MB)的轻量 .NET 程序:

  • 只出不进:Agent 主动拨号,单条出站 HTTPS/gRPC 隧道连回中心服务器,站点侧零入站暴露,CGNAT 后也能工作。
  • 协议独立建模:隧道契约定义在 agent_tunnel.proto,协议逻辑单独抽成 AgentProtocol 项目,服务端与 Agent 共享同一份 proto,永不失配。
  • 能力复用:站点内的 UniFi Console、SNMP、设备 SSH 都通过隧道 TCP 代理进来,因此安全审计、Wi-Fi 优化、LAN 测速(OpenSpeedTest 页面 + iperf3)在远程站点上功能不打折:

质量保障:每个功能库都有独立测试项目

模块化的收益在测试目录直接兑现:tests/下 13 个 xunit 测试项目与src/一一对应。由于审计、Wi-Fi、SQM 等模块是无外部依赖的纯逻辑库,测试无需 Mock 整个网络——例如 tests/NetworkOptimizer.Audit.Tests/ 覆盖分析器、规则、DNS 检测器等全部子系统。日常跑测试可用仓库脚本:

  • 测试入口:scripts/test.sh
  • 覆盖率:scripts/coverage.sh + scripts/coverage.runsettings
  • 编码与 AI 协作规范:CODING_STANDARDS.md

新手读源码的推荐路线

结合上面的分层,建议按这条路径入门,从"数据 → 规则 → 界面"逐步深入:

  1. src/NetworkOptimizer.Storage/README.md —— 5 分钟理解数据存哪里
  2. src/NetworkOptimizer.UniFi/UniFiApiClient.cs —— 看它如何与 UniFi Console 通信
  3. src/NetworkOptimizer.Audit/ —— 挑一条安全规则(如IotVlanRule.cs)看纯 C# 检查逻辑
  4. src/NetworkOptimizer.Web/Program.cs —— 回到组合根,看服务如何被注册
  5. 需要部署时参考 docker/DEPLOYMENT.md,或按 docs/MACOS-INSTALLATION.md 做原生安装

总结

Network Optimizer 的架构可以浓缩成三句话:

  • 功能即类库:审计、Wi-Fi、监控、SQM、告警各自独立,单向依赖,可单独测试与演进
  • 存储双轨制:SQLite 管事实、InfluxDB 管时序,且后者可选,降低自托管门槛
  • Agent 打通多站点:一条出站 gRPC 隧道让远程站点获得完整功能,入站端口为零

如果你正在规划自己的 .NET 自托管 NMS 或想学习 Blazor 大型应用的组织方式,这套"组合根 + 领域功能库 + 接口仓储"的模板非常值得对照着仓库源码逐层阅读。

【免费下载链接】NetworkOptimizer

Self-hosted optimization, monitoring (NMS), and security audit tool for UniFi Networks. Includes Wi-Fi Optimizer for wireless health scoring and channel optimization, advanced DNS/VLAN/firewall security checks, config optimization suggestions, centralized WAN and LAN speed test server w/ L2 tracing, CM, ONT, SFP, 5G modem stats +more.​​​​​​​​​​​​​

项目地址:https://gitcode.com/gh_mirrors/ne/NetworkOptimizer
点击查看免费下载

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询