基于Kamailio的VoIP管理系统方案(技术栈:MySQL + Redis + Gin + Vue.js


基于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)

    sql 复制代码
    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提交表单。
    • 会话管理
      • 用户登录后,Gin生成JWT令牌并存储到Redis(过期时间2小时)。
      • 前端通过Vuex管理用户状态,每次API请求携带JWT。
    • 权限控制
      • Gin中间件校验JWT及用户角色(如isAdmin中间件)。
(2) 呼叫管理
  • 数据库设计(MySQL)

    sql 复制代码
    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加载路由规则。
    • CDR记录
      • Kamailio通过acc模块将CDR写入MySQL。
      • Gin提供/api/cdr接口,前端用Vue.js表格展示CDR,支持过滤和分页。
    • 实时控制
      • 通过Kamailio的HTTP_ASYNC模块向Gin发送呼叫事件(如/api/call/start),触发业务逻辑。
(3) 计费与费率
  • 数据库设计(MySQL)

    sql 复制代码
    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。
(4) 安全管理
  • Redis缓存规则
    • 黑白名单存储为Redis的Set类型:

      bash 复制代码
      # 黑名单
      SADD sip_blacklist 192.168.1.100 10.0.0.5
      # 白名单
      SADD sip_whitelist 192.168.1.200
    • Kamailio通过htable模块加载Redis中的黑白名单,快速过滤请求。

  • 加密通信
    • Kamailio配置TLS(tls_mgm模块)和SRTP,Gin启用HTTPS(Let's Encrypt证书)。
(5) 监控与统计
  • 实时数据
    • Gin通过Prometheus收集指标(如呼叫并发数),Vue.js用ECharts展示仪表盘。
    • Kamailio状态通过mi_datagram模块发送到Gin的/api/monitor接口。
  • 日志管理
    • Gin日志(访问日志、错误日志)写入MySQL,前端提供日志查询界面。
(6) 系统管理
  • 配置管理
    • MySQL中存储Kamailio动态配置(如路由规则),Gin提供/api/config接口供管理员修改。
    • 修改后,Kamailio通过cfgutils模块定期从数据库重载配置。
  • 备份与恢复
    • 每日定时备份MySQL(mysqldump)和Redis(BGSAVE),存储到云存储(如AWS S3)。

3. 技术栈整合细节

(1) Gin后端开发
  • 项目结构

    text 复制代码
    /voip-admin
      ├── main.go          # 入口文件
      ├── config           # 配置文件(MySQL、Redis连接)
      ├── models           # 数据库模型(GORM)
      ├── routes           # API路由定义
      ├── middleware       # JWT认证、日志中间件
      └── services         # 业务逻辑(计费、CDR处理)
  • 关键代码示例

    go 复制代码
    // 用户登录接口
    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前端开发
  • 项目结构

    text 复制代码
    /voip-web
      ├── src
      │   ├── views        # 页面组件(用户管理、CDR查询)
      │   ├── components   # 复用组件(表格、表单)
      │   ├── store        # Vuex状态管理
      │   ├── router       # 路由配置
      │   └── api          # 封装Gin API调用
  • 关键代码示例

    javascript 复制代码
    // 调用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. 部署与优化

  • 容器化部署

    docker-compose 复制代码
    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压缩、连接池配置、异步任务处理计费逻辑。

5. 最终效果

通过上述方案,可实现一个高性能、易扩展的VoIP管理系统:

  • 管理员:通过Vue.js界面管理用户、查看实时监控、配置费率。
  • 终端用户:自助查询账单、管理呼叫权限。
  • 系统:Kamailio处理高并发SIP流量,Gin和MySQL保障业务逻辑稳定,Redis提升实时性能。
相关推荐
狂爱代码的码农7 小时前
VoIP中常见术语
kamaimio
狂爱代码的码农14 小时前
基于Kamailio、MySQL、Redis、Gin、Vue.js的微服务架构
kamaimio
狂爱代码的码农2 天前
kamailio-ACC_JSON模块详解
kamaimio