IT技术家园 - 95计费
type: channel
link: https://www.itbunan.xyz/tag/95%E8%AE%A1%E8%B4%B9/
items: 95计费系统开发过程总结

95计费系统开发过程总结
type: item
date: 2026-03-29T11:48:00+00:00
description: 一、项目背景IDC带宽计费普遍采用95百分位计费法。原理很简单：一个月内每5分钟采集一次带宽数据，按值从大到小排序，去掉最高的5%，剩余数据中的最大值即为计费带宽。这种计费方式对客户有利——偶尔的流量突发不会被计入费用。但对运维来说，每月手动统计、制表、发邮件是重复劳动，以前每月我都需要拿出1天时间，来导出zabbix的监控数据，并计算95值，然后做报表，发邮件。开发这个系统的目的就是把这些事情自动化，提高效率节省时间。二、系统介绍首页首页展示系统概况，包括项目数量、报告统计、快捷入口等。项目管理项目是系统的核心概念，每个项目对应一个计费主体（比如一个客户或一条专线）。项目下挂载多个端口，端口信息从Zabbix同步过来。新建项目时配置基本信息：趋势方向（UP/DOWN，决定取流入还是流出）、数据源、Grafana Dashboard等。数据同步流量数据存储在Zabbix的MySQL数据库中。系统定时从Zabbix同步数据到本地表，避免直接查询生产库造成压力。95计费结果选择时间范围后，系统自动计算各项目的95值。支持一键复制为Markdown表格，方便粘贴到汇报文档。报告管理报告是月度统计的产出物，包含95值、峰值、Grafana截图、CSV数据文件。报告支持批量创建、状态管理、一键发送邮件。数据管理支持项目配置的导入导出、流量数据的导出，便于备份和迁移。系统设置配置通过环境变量管理，包括数据库连接、Grafana地址、SMTP信息等。邮件通知报告发送后，收件人会收到包含统计结果、图表附件的邮件。三、架构设计整体架构┌─────────────────────────────────────────────────────────────┐ │ 前端 (Vue 3) │ │ Element Plus + Vue Router + Axios │ └─────────────────────────────────────────────────────────────┘ │ ▼ ┌─────────────────────────────────────────────────────────────┐ │ 后端 (Go + Gin) │ │ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ │ │ Handler │──│ Service │──│Repository│──│ Model │ │ │ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │ └─────────────────────────────────────────────────────────────┘ │ ┌───────────────┼───────────────┐ ▼ ▼ ▼ ┌──────────┐ ┌──────────┐ ┌──────────┐ │ MySQL │ │ Zabbix │ │ Grafana │ │ (zreport)│ │ (只读) │ │ (截图) │ └──────────┘ └──────────┘ └──────────┘目录结构aireport/ ├── cmd/server/main.go # 入口 ├── internal/ │ ├── config/ # 配置加载 │ ├── models/ # 数据模型 │ ├── repository/ # 数据访问层 │ ├── services/ # 业务逻辑层 │ ├── handlers/ # HTTP处理器 │ └── router/ # 路由配置 ├── pkg/ │ ├── utils/ # 工具函数（95计算） │ └── response/ # 统一响应格式 ├── web/ # 前端项目 │ └── src/ │ ├── api/ # 接口封装 │ ├── views/ # 页面组件 │ └── router/ # 前端路由 └── exports/ # 导出文件存储技术选型层面技术选择理由后端框架Gin轻量、性能好、社区活跃ORMGORM功能完善、开发效率高前端框架Vue 3组合式API、响应式设计方便UI组件库Element Plus组件丰富、文档完善数据库MySQL业务数据量小、关系型足够四、核心代码95计费算法95计费的核心是排序取百分位，实现并不复杂：// Calculate95thPercentile 计算95计费 // 排序后取第5%位置的值 func Calculate95thPercentile(data []DataPoint, unitBase int) BillingResult { if len(data) …