EchoChat:Go语言音视频会议直播系统,控制面与媒体面分离架构设计
标签: 音视频 / 开源项目 / Go / mediasoup / SFU / 直播
原文: 微信公众号「码农先森」https://mp.weixin.qq.com/s/_aMiVNKiCEaOUYVOJ1OxTg
核心亮点
EchoChat 是一套跨端可用、可扩展、可演进的实时音视频会议直播系统,支持即时聊天、多人音视频会议、互动直播。采用控制面与媒体面彻底分离的架构:Go 处理业务逻辑和信令,mediasoup C++ SFU 专注音视频转发,媒体流直连 SFU Worker 不经过 Go 服务。前台 uniapp 多端适配(H5/App/小程序),后台 Vue3 + Element Plus 管理端。
技术栈
| 层级 | 技术 | 说明 |
|---|---|---|
| 前台前端 | uniapp (Vue 3) + mediasoup-client | 多端适配(H5/App/小程序) |
| 后台管理端 | Vue 3 + Vite + Element Plus | PC Web 管理后台 |
| 后端服务 | Go (Gin + GORM + Wire + zap) | 业务逻辑、信令控制 |
| 媒体服务 | Node.js + mediasoup | SFU 媒体控制与转发 |
| 数据库 | PostgreSQL 17 | 持久化数据存储 |
| 缓存 | Redis 7 | 实时状态、会话缓存 |
| 部署 | Docker Compose / Nginx | 容器化部署,预留 K8s |
系统架构
客户端 (uniapp / Vue3 管理端)
│
│ WebSocket + HTTP
│
Go 单体服务 (模块化)
│ ├── auth 用户认证鉴权
│ ├── im 即时通讯
│ ├── contact 联系人管理
│ ├── meeting 会议控制/信令
│ ├── notify 消息通知
│ └── admin 后台管理
│
├── PostgreSQL (持久化数据)
├── Redis (实时状态)
│
│ HTTP
│
mediasoup Node 服务
│ IPC
mediasoup Worker (C++ SFU)
核心设计思想:控制面与媒体面分离
- Go 服务:处理所有业务逻辑和信令控制(用户认证、会议管理、IM、通知)
- mediasoup:专注音视频媒体转发(C++ SFU Worker)
- 媒体流直连 SFU Worker:音视频数据不经过 Go 服务,降低延迟和 Go 服务负载
这种分离架构意味着:
- Go 服务不会成为音视频的性能瓶颈
- SFU 可以独立水平扩展
- 业务逻辑和媒体处理可以独立迭代部署
项目结构
EchoChat/
├── frontend/ # 前台用户端 (uni-app + Vue 3.4)
├── admin/ # 后台管理端 (Vue 3.5 + Element Plus)
├── backend/
│ └── go-service/ # Go 后端服务 (Gin + GORM + Wire)
│ ├── app/ # 业务模块 (auth / admin)
│ ├── cmd/server/ # 服务入口
│ ├── config/ # 配置文件
│ ├── pkg/ # 公共包 (db / logs / middleware / utils)
│ └── router/ # 路由聚合
├── media-server/ # mediasoup Node 媒体服务 (Phase 3)
├── deploy/ # 部署配置 (Docker Compose)
├── design-system/ # UI 设计系统 (ui-ux-pro-max 生成)
├── docs/ # 项目文档
│ ├── progress/ # 开发进度
│ ├── plans/ # 实施计划
│ ├── api/ # API 接口文档
│ └── architecture/ # 架构设计文档
└── README.md
快速开始
环境要求
- Go 1.23+
- Node.js 18+
- Docker & Docker Compose
- PostgreSQL 17(通过 Docker 自动启动)
- Redis 7(通过 Docker 自动启动)
方式一:一键脚本(推荐)
项目采用「首次初始化 / 日常启停」职责分离模式:
| 脚本 | 用途 | 频率 |
|---|---|---|
scripts/dev-setup.sh | 首次环境初始化:检查 Docker、拉起中间件、健康检查 | 仅首次 |
scripts/start.sh | 日常启动:秒级拉起全部服务 | 每天多次 |
scripts/stop.sh | 日常停止:优雅终止应用层,默认保留容器 | 每天多次 |
scripts/status.sh | 状态查看:端口/PID/容器一览 | 排障随时 |
# 首次 clone 后执行一次
./scripts/dev-setup.sh
# 日常启停
./scripts/start.sh # 启动全部
./scripts/stop.sh # 停止应用层(保留中间件)
./scripts/stop.sh --all # 停止全部(含中间件)
# 单项启停
./scripts/start.sh backend
./scripts/stop.sh frontend
后台进程的 PID 与日志默认写入 .run/(已加入 gitignore),排障时查看 .run/logs/*.log。
方式二:Docker Compose 全量启动
cd deploy
docker compose -f docker-compose.dev.yml up -d
方式三:分步手动启动
# 1. 基础设施
cd deploy && docker compose -f docker-compose.dev.yml up -d postgres redis
# 2. Go 后端
cd backend/go-service && go mod tidy && go run cmd/server/main.go
# 3. 前台用户端
cd frontend && npm install --legacy-peer-deps && npm run dev:h5
# 4. 后台管理端
cd admin && npm install && npm run dev
服务端口
| 服务 | 端口 | 说明 |
|---|---|---|
| 前台用户端 (H5) | 5173 | http://localhost:5173 |
| 后台管理端 | 3100 | http://localhost:3100 |
| Go 后端 API | 8085 | http://localhost:8085(/health 健康检查) |
| PostgreSQL | 5432 | Docker 容器 echochat-postgres |
| Redis | 6379 | Docker 容器 echochat-redis |
| MinIO API | 9000 | 对象存储,S3 兼容 |
| MinIO Console | 9001 | http://localhost:9001 |
适用场景
- 企业内部音视频会议系统
- 在线教育互动直播
- 远程协作与即时通讯
- 社交平台音视频聊天
- 需要私有化部署的政企场景
项目信息
| 属性 | 详情 |
|---|---|
| 项目名 | EchoChat |
| GitHub | https://github.com/bojinyuan00/EchoChat |
| 后端 | Go (Gin + GORM + Wire + zap) |
| 前端 | uniapp (Vue 3) + mediasoup-client |
| 管理端 | Vue 3 + Vite + Element Plus |
| 媒体 | Node.js + mediasoup (C++ SFU) |
| 数据库 | PostgreSQL 17 / Redis 7 |
| 部署 | Docker Compose / Nginx,预留 K8s |
| 架构特点 | 控制面与媒体面分离 |
本文整理自微信公众号「码农先森」,原文链接:https://mp.weixin.qq.com/s/_aMiVNKiCEaOUYVOJ1OxTg