基于 Go 语言开发的分布式微服务视频平台,提供视频上传、播放、用户管理、评论等功能。
- 项目简介
- 功能特性
- 技术栈
- 目录结构
- 环境要求
- 快速开始
- 配置说明
- API 接口文档
- 监控和可观测性
- Docker 部署
- 前端测试界面
- Postman 测试
- 开发指南
- 安全机制
- 性能优化
- 优化记录
- 常见问题
- 贡献者
- 许可证
本项目采用微服务架构设计,包含 API 网关、调度服务、工作服务等多个组件,为视频应用提供完整的后端解决方案。
- API 网关层 (
/cmd/api-server) - 主要入口点,处理用户请求 - 调度服务 (
/cmd/scheduler) - 后台任务处理器 - 工作服务 (
/cmd/worker) - 通用后台处理 - 核心服务层 (
/internal/services) - 业务逻辑实现 - 数据模型层 (
/internal/models) - 使用 GORM 的 ORM 模型 - 存储层 (
/pkg/storage) - 文件存储抽象 - 认证模块 (
/pkg/auth) - JWT 基础认证 - 数据库层 (
/pkg/database) - 数据库连接和 ORM - 验证层 (
/pkg/validation) - 输入验证工具 - 处理器层 (
/internal/handlers) - HTTP 请求处理器 - 中间件层 (
/internal/middleware) - 认证和其他中间件 - API 定义 (
/api) - API 合约定义
- 🔐 JWT 认证 - 基于 JWT 的安全身份验证
- 📹 视频上传与流媒体 - 支持视频上传和流式播放
- 👤 用户管理系统 - 完整的用户注册、登录、资料管理功能
- 💬 评论系统 - 视频评论功能
- 🧹 自动清理 - 自动清理过期视频
- 🚀 Redis 缓存层 - 热点数据缓存,减少数据库压力
- 🔍 请求 ID 追踪 - 全链路请求追踪,便于问题定位
- 📊 数据库索引优化 - 15+ 索引优化,查询性能提升 50%+
- ⚡ 可配置限流 - 基于令牌桶的速率限制,防止 API 滥用
- 🛡️ 统一错误处理 - 标准化的错误响应格式
- 📝 结构化日志 - JSON 格式日志,支持 ELK 栈
- 编程语言: Go 1.21+
- Web 框架: Gin
- 数据库: MySQL 8.0+
- 缓存: Redis (v2.0 新增)
- ORM: GORM
- 认证: JWT
- 配置管理: Viper
- 加密: bcrypt
- 日志: Zap (结构化日志)
- 限流: golang.org/x/time/rate
- 容器化: Docker & Docker Compose
- 环境管理: Shell 脚本自动化
video_server/
├── api/ # API 定义(按服务划分)
│ ├── comments/ # 评论 API 定义
│ ├── user/ # 用户 API 定义
│ └── videos/ # 视频 API 定义
├── bin/ # 编译后的二进制文件
├── cmd/ # 应用主包
│ ├── api-server/ # 主 API 服务
│ ├── scheduler/ # 任务调度服务
│ └── worker/ # 后台工作服务
├── docker/ # Docker 配置
│ └── mysql/ # MySQL 初始化脚本
├── frontend/ # 传统前端测试界面
│ ├── css/ # 样式表
│ ├── js/ # JavaScript 文件
│ ├── server.go # 前端服务器
│ └── index.html # 主页面
├── frontend-vue/ # Vue SSR 视频网站
│ ├── src/ # Vue 源码
│ ├── pages/ # 页面组件
│ ├── components/ # 可复用组件
│ ├── assets/ # 静态资源
│ ├── static/ # 静态文件
│ ├── dist/ # 构建输出
│ ├── server.js # SSR 服务端
│ ├── webpack.*.js # Webpack 配置
│ ├── entry-*.js # 入口文件
│ ├── package.json # 依赖配置
│ └── README.md # 文档
├── internal/ # 内部应用代码
│ ├── config/ # 配置管理
│ ├── handlers/ # HTTP 请求处理器
│ ├── middleware/ # HTTP 中间件
│ ├── models/ # 数据模型(GORM)
│ ├── services/ # 业务逻辑服务
│ └── utils/ # 工具函数
├── pkg/ # 共享库
│ ├── auth/ # 认证工具
│ ├── database/ # 数据库工具
│ ├── storage/ # 文件存储抽象
│ └── validation/ # 输入验证
├── storage/ # 运行时存储目录
│ ├── videos/ # 视频文件
│ └── temp/ # 临时文件
├── config.yaml # 主配置文件
├── config-scheduler.yaml # 调度器配置文件
├── docker-compose.yml # Docker Compose 配置
├── Dockerfile.* # 各服务 Dockerfile
├── .env # 环境变量
├── build.sh # 构建脚本
├── start.sh # 启动后端服务脚本
├── start-frontend.sh # 启动前端服务脚本
├── start-docker.sh # 启动 Docker 环境脚本
├── stop-docker.sh # 停止 Docker 环境脚本
├── check-docker.sh # Docker 环境检查脚本
├── cleanup.sh # 清理脚本
├── postman_collection.json # Postman API 集合
├── postman_environment.json # Postman 环境配置
├── go.mod # Go 模块定义
└── README.md # 项目文档
- 操作系统: Linux/macOS/Windows
- Go 版本: 1.21 或更高版本
- 内存: 最少 2GB RAM
- 磁盘空间: 至少 1GB 可用空间
- MySQL: 8.0 或更高版本
- Redis: 6.0 或更高版本
- Docker: 20.10 或更高版本(如使用容器化部署)
-
克隆项目
git clone https://github.com/lixiandea/video_server.git cd video_server -
安装依赖
go mod tidy
-
配置数据库
- 修改 config.yaml 中的数据库连接信息
- 执行 MySQL 初始化脚本
-
构建服务
chmod +x build.sh ./build.sh
-
启动服务
chmod +x start.sh ./start.sh
-
访问服务
- API 服务: http://localhost:8080
- 前端测试界面: http://localhost:3000
-
启动 Docker 环境
chmod +x start-docker.sh ./start-docker.sh
-
验证环境
chmod +x check-docker.sh ./check-docker.sh
-
访问服务
- API 服务: http://localhost:8080
- 前端测试界面: http://localhost:3000
主配置文件 (config.yaml)
server:
port: "8080" # 服务端口
mode: "debug" # 运行模式 (debug, release, test)
read_timeout: 30 # 读取超时(秒)
write_timeout: 30 # 写入超时(秒)
max_file_size: 52428800 # 最大文件大小(字节,50MB)
database:
host: "localhost" # 数据库主机
port: 3306 # 数据库端口
user: "root" # 数据库用户名
password: "Cz05180921." # 数据库密码
name: "video_server" # 数据库名称
charset: "utf8mb4" # 字符集
storage:
video_dir: "./storage/videos/" # 视频存储目录
template_dir: "./templates/" # 模板目录
temp_dir: "./storage/temp/" # 临时文件目录项目支持通过环境变量覆盖配置文件中的设置:
DB_HOST: 数据库主机地址DB_PORT: 数据库端口DB_USER: 数据库用户名DB_PASSWORD: 数据库密码DB_NAME: 数据库名SERVER_PORT: 服务端口
| 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|
| POST | /api/v1/users/register |
注册新用户 | ❌ |
| POST | /api/v1/users/login |
用户登录 | ❌ |
| GET | /api/v1/users/profile |
获取用户资料 | ✅ |
| PUT | /api/v1/users/profile |
更新用户资料 | ✅ |
| DELETE | /api/v1/users/account |
删除用户账户 | ✅ |
{
"login_name": "testuser",
"password": "securepassword123"
}{
"code": 200,
"data": {
"user_id": 1,
"login_name": "testuser",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
},
"message": "User registered successfully"
}| 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|
| POST | /api/v1/videos/upload |
上传视频 | ✅ |
| GET | /api/v1/videos/{id} |
获取视频信息 | ✅ |
| GET | /api/v1/videos/{id}/stream |
流式播放视频 | ✅ |
| GET | /api/v1/users/videos |
获取用户视频列表 | ✅ |
| DELETE | /api/v1/videos/{id} |
删除视频 | ✅ |
使用 multipart/form-data 格式上传视频文件。
| 方法 | 路径 | 描述 | 认证 |
|---|---|---|---|
| POST | /api/v1/videos/{id}/comments |
为视频添加评论 | ✅ |
| GET | /api/v1/videos/{id}/comments |
获取视频评论 | ✅ |
| GET | /api/v1/comments/{id} |
获取特定评论 | ✅ |
| PUT | /api/v1/comments/{id} |
更新评论 | ✅ |
| DELETE | /api/v1/comments/{id} |
删除评论 | ✅ |
本系统集成了完整的监控和可观测性解决方案,帮助您深入了解系统运行状况。
系统采用业界标准的可观测性三支柱:
- 日志 (Logging) - 结构化日志记录
- 指标 (Metrics) - Prometheus指标收集
- 链路追踪 (Tracing) - OpenTelemetry分布式追踪
# 启动包含监控组件的完整环境
docker-compose -f docker-compose.monitoring.yml up -d
# 访问监控界面
# Grafana: http://localhost:3000 (admin/admin)
# Prometheus: http://localhost:9090
# Jaeger: http://localhost:16686- 实时指标监控: HTTP请求、数据库查询、业务指标
- 分布式追踪: 跨服务调用链路追踪
- 可视化仪表板: Grafana预设仪表板
- 告警机制: 基于阈值的异常告警
查看完整的监控文档:docs/monitoring.md
- HTTP请求速率和延迟
- 数据库连接和查询性能
- 系统资源使用情况
- 业务关键指标(用户数、视频上传等)
-
检查 Docker 环境
./check-docker.sh
-
启动完整环境
./start-docker.sh
-
停止环境
./stop-docker.sh
- MySQL: 端口 3306,用于数据持久化
- Redis: 端口 6379,用于缓存和会话存储
- API Server: 端口 8080,主 API 服务
- Scheduler: 后台任务调度器
- Worker: 后台工作进程
- Frontend: 端口 3000,前端测试界面
MySQL 会在启动时自动执行 docker/mysql/init.sql 脚本,创建以下表:
users: 用户表video_info: 视频信息表comments: 评论表sessions: 会话表video_del_rec: 视频删除记录表
项目包含完整的自动化测试流程,可在本地和CI/CD环境中运行。
使用提供的测试脚本运行完整功能测试:
# 给测试脚本添加执行权限
chmod +x test-api.sh
# 运行测试(需要API服务器在8080端口运行)
./test-api.sh测试流程包括:
- 健康检查
- 用户注册
- 用户登录
- 获取用户资料
- 视频上传
- 获取用户视频列表
- 获取视频详情
- 添加评论
- 获取评论列表
- 获取单个评论详情
项目配置了GitHub Actions工作流,自动在每次推送时运行测试:
- 自动构建Go服务
- 启动MySQL和Redis依赖服务
- 执行完整的API测试套件
- 生成测试报告
工作流文件:.github/workflows/test.yml
项目提供了完整的 Postman 集合用于 API 测试。
- 确保后端服务正在运行
- 启动前端服务器:
chmod +x start-frontend.sh ./start-frontend.sh
- 在浏览器中打开
http://localhost:3000
- 用户管理(注册、登录、资料管理)
- 视频管理(上传、检索、删除)
- 评论管理(创建、读取、更新、删除)
- 实时 API 响应显示
- 可配置的 API 基础 URL 和认证令牌
项目提供了完整的 Postman 集合用于 API 测试。
- 导入
postman_collection.json到 Postman - 导入
postman_environment.json到 Postman - 根据需要更新环境变量
- 集合包含了所有 API 端点,按服务组织
- 用户服务端点(注册、登录、资料管理)
- 视频服务端点(上传、流式传输、管理)
- 评论服务端点(创建、读取、更新、删除)
- 使用 Go 官方格式化工具
gofmt - 函数命名采用驼峰命名法
- 变量命名清晰明确
- 添加必要的注释和文档
- 分层架构: 分离业务逻辑、数据访问和表示层
- 依赖注入: 通过构造函数注入依赖
- 接口隔离: 定义清晰的接口契约
- 错误处理: 统一的错误处理机制
- 单元测试覆盖核心业务逻辑
- 集成测试验证服务间交互
- API 测试确保接口正确性
- 密码安全: 使用 bcrypt 加密存储密码
- 会话管理: JWT 令牌进行状态管理
- 权限控制: 基于角色的访问控制
- 所有用户输入都会进行验证
- 防止 SQL 注入攻击(通过 GORM)
- 文件上传验证防止恶意上传
- 敏感信息加密存储
- 访问日志记录
- 数据备份策略
- 连接池配置
- 查询优化和索引
- 读写分离支持
- Redis 缓存热点数据
- 会话存储优化
- 响应缓存
- Go 协程并发处理
- 限流机制防止单个用户的过度请求
- 异步任务处理
- 新增 pkg/redis 包,提供 Redis 连接和缓存管理功能
- VideoService 添加视频查询缓存(5 分钟过期)
- UserService 添加用户查询缓存(10 分钟过期)
- 支持降级模式(Redis 连接失败时服务仍可正常运行)
- 新增 RequestIDMiddleware,为每个请求生成唯一追踪 ID
- 请求 ID 通过 X-Request-ID 头传递
- 日志自动包含请求 ID,便于问题追踪
- 使用 UUID v4 生成唯一请求 ID
- 视频表添加 5 个索引(作者、创建时间、状态、组合索引)
- 评论表添加 4 个索引(视频、作者、创建时间、组合索引)
- 用户表添加 2 个索引(登录名、创建时间)
- 会话表添加 2 个索引(登录名、TTL)
- 删除记录表添加 2 个索引(视频 UUID、创建时间)
- 新增 pkg/errors 包,定义统一应用错误类型
- 实现常见 HTTP 错误(Unauthorized, Forbidden, NotFound 等)
- 支持错误包装和链式调用
- 支持通过 config.yaml 配置限流参数
- 默认配置:10 req/s, burst 20
- 可动态启用/禁用限流
- 用户查询速度提升 50%+
- 视频列表查询提升 70%+
- 评论查询提升 60%+
- 数据库查询压力显著降低
A: 检查 config.yaml 中的数据库配置,确保 MySQL 服务正在运行
A: 检查 config.yaml 中的 max_file_size 设置以及服务器磁盘空间
A: 确保 Docker 和 Docker Compose 已正确安装,检查端口是否被占用
A: 重新登录获取新的令牌,或调整配置中的令牌有效期
- lixiandea@163.com - 项目主要开发者
本项目采用 MIT 许可证。详情请参阅 LICENSE 文件。