基于Kamailio的VoIP管理系统方案(技术栈:MySQL + Redis + Gin + Vue.js)
1. 系统架构
- 核心组件:
- Kamailio:处理SIP信令、路由、负载均衡、安全过滤。
- MySQL:存储用户数据、CDR(呼叫记录)、费率规则、系统配置。
- Redis:缓存用户会话、黑白名单、实时计费锁、高频操作临时数据。
- Gin(Go语言后端):提供RESTful API,处理业务逻辑和数据库交互。
- Vue.js(前端):实现管理界面和用户自助服务。
- 交互流程:
- SIP客户端 ↔ Kamailio(SIP信令) ↔ Gin API(业务逻辑) ↔ MySQL/Redis。
- 前端(Vue.js)通过HTTP调用Gin API,实时展示数据。
2. 详细功能模块与实现
(1) 用户管理
- 数据库设计(MySQL):
CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, username VARCHAR(64) UNIQUE, -- SIP用户名(如1001) password VARCHAR(128), -- 加密后的密码(SHA-256) role ENUM('user', 'admin') DEFAULT 'user', balance DECIMAL(10,2) DEFAULT 0.00, status ENUM('active', 'disabled') DEFAULT 'active' );
- 功能实现:
- 注册/认证:
- Kamailio通过
auth_db
模块对接MySQL验证用户凭证。 - Gin提供
/api/register
和/api/login
接口,前端通过Vue.js提交表单。
- Kamailio通过
- 会话管理:
- 用户登录后,Gin生成JWT令牌并存储到Redis(过期时间2小时)。
- 前端通过Vuex管理用户状态,每次API请求携带JWT。
- 权限控制:
- Gin中间件校验JWT及用户角色(如
isAdmin
中间件)。
- Gin中间件校验JWT及用户角色(如
- 注册/认证:
(2) 呼叫管理
- 数据库设计(MySQL):
CREATE TABLE cdr ( id INT PRIMARY KEY AUTO_INCREMENT, caller VARCHAR(64), -- 主叫号码 callee VARCHAR(64), -- 被叫号码 start_time DATETIME, -- 呼叫开始时间 end_time DATETIME, -- 呼叫结束时间 duration INT, -- 通话时长(秒) cost DECIMAL(10,2) -- 通话费用 );
- 功能实现:
- 呼叫路由:
- Kamailio配置Lua脚本或
dialplan
模块,根据被叫号码从MySQL加载路由规则。
- Kamailio配置Lua脚本或
- CDR记录:
- Kamailio通过
acc
模块将CDR写入MySQL。 - Gin提供
/api/cdr
接口,前端用Vue.js表格展示CDR,支持过滤和分页。
- Kamailio通过
- 实时控制:
- 通过Kamailio的
HTTP_ASYNC
模块向Gin发送呼叫事件(如/api/call/start
),触发业务逻辑。
- 通过Kamailio的
- 呼叫路由:
(3) 计费与费率
- 数据库设计(MySQL):
CREATE TABLE rate ( id INT PRIMARY KEY AUTO_INCREMENT, destination VARCHAR(64), -- 目的地(如国家代码) peak_rate DECIMAL(10,2), -- 高峰时段费率(元/分钟) off_peak_rate DECIMAL(10,2) -- 非高峰费率 );
- 功能实现:
- 实时计费:
- 通话开始时,Gin从MySQL加载费率,计算预估费用并检查用户余额。
- 使用Redis原子操作(
DECRBY
)扣减余额,避免并发冲突。
- 账单生成:
- Gin定时任务每日生成账单,存储到MySQL,并提供
/api/bills
接口供前端下载PDF。
- Gin定时任务每日生成账单,存储到MySQL,并提供
- 实时计费:
(4) 安全管理
- Redis缓存规则:
- 黑白名单存储为Redis的
Set
类型:# 黑名单 SADD sip_blacklist 192.168.1.100 10.0.0.5 # 白名单 SADD sip_whitelist 192.168.1.200
- Kamailio通过
htable
模块加载Redis中的黑白名单,快速过滤请求。
- 黑白名单存储为Redis的
- 加密通信:
- Kamailio配置TLS(
tls_mgm
模块)和SRTP,Gin启用HTTPS(Let’s Encrypt证书)。
- Kamailio配置TLS(
(5) 监控与统计
- 实时数据:
- Gin通过Prometheus收集指标(如呼叫并发数),Vue.js用ECharts展示仪表盘。
- Kamailio状态通过
mi_datagram
模块发送到Gin的/api/monitor
接口。
- 日志管理:
- Gin日志(访问日志、错误日志)写入MySQL,前端提供日志查询界面。
(6) 系统管理
- 配置管理:
- MySQL中存储Kamailio动态配置(如路由规则),Gin提供
/api/config
接口供管理员修改。 - 修改后,Kamailio通过
cfgutils
模块定期从数据库重载配置。
- MySQL中存储Kamailio动态配置(如路由规则),Gin提供
- 备份与恢复:
- 每日定时备份MySQL(
mysqldump
)和Redis(BGSAVE
),存储到云存储(如AWS S3)。
- 每日定时备份MySQL(
3. 技术栈整合细节
(1) Gin后端开发
- 项目结构:
/voip-admin ├── main.go # 入口文件 ├── config # 配置文件(MySQL、Redis连接) ├── models # 数据库模型(GORM) ├── routes # API路由定义 ├── middleware # JWT认证、日志中间件 └── services # 业务逻辑(计费、CDR处理)
- 关键代码示例:
// 用户登录接口 func Login(c *gin.Context) { var user models.User if err := c.ShouldBindJSON(&user); err != nil { c.JSON(400, gin.H{"error": "Invalid request"}) return } // 查询MySQL验证用户 result := db.Where("username = ?", user.Username).First(&user) if result.Error != nil { c.JSON(401, gin.H{"error": "User not found"}) return } // 生成JWT令牌 token := generateJWT(user) // 存储到Redis(过期时间2小时) redisClient.Set(ctx, "session:"+token, user.ID, 2*time.Hour) c.JSON(200, gin.H{"token": token}) }
(2) Vue.js前端开发
- 项目结构:
/voip-web ├── src │ ├── views # 页面组件(用户管理、CDR查询) │ ├── components # 复用组件(表格、表单) │ ├── store # Vuex状态管理 │ ├── router # 路由配置 │ └── api # 封装Gin API调用
- 关键代码示例:
// 调用CDR查询接口 export function getCDR(params) { return axios.get('/api/cdr', { params }) .then(response => response.data) .catch(error => console.error("CDR查询失败:", error)); } // Vuex管理用户状态 const store = new Vuex.Store({ state: { user: null, token: localStorage.getItem('token') || '' }, mutations: { setUser(state, user) { state.user = user; }, setToken(state, token) { state.token = token; localStorage.setItem('token', token); } } });
4. 部署与优化
- 容器化部署:
version: '3' services: kamailio: image: kamailio/kamailio ports: ["5060:5060/udp", "5061:5061/tcp"] volumes: ["./kamailio.cfg:/etc/kamailio/kamailio.cfg"] mysql: image: mysql:8.0 environment: [MYSQL_ROOT_PASSWORD=secret] redis: image: redis:alpine backend: build: ./voip-admin ports: ["8080:8080"] frontend: build: ./voip-web ports: ["80:80"]
- 性能优化:
- MySQL:索引优化(如CDR的
start_time
字段)、读写分离。 - Redis:持久化策略(AOF + RDB)、集群模式。
- Gin:启用GZIP压缩、连接池配置、异步任务处理计费逻辑。
- MySQL:索引优化(如CDR的
5. 最终效果
通过上述方案,可实现一个高性能、易扩展的VoIP管理系统:
- 管理员:通过Vue.js界面管理用户、查看实时监控、配置费率。
- 终端用户:自助查询账单、管理呼叫权限。
- 系统:Kamailio处理高并发SIP流量,Gin和MySQL保障业务逻辑稳定,Redis提升实时性能。