小公司小在线培训系统go如何设计实施
初期把路由拆成 3 个包:internal/handler/user.go、course.go、video.go,共用同一个 main.go 启动,后续流量上来再拆进程。后续随着课程数、并发量上涨,再按“单体多实例 → 微服务 → K8s”节奏水平扩容,技术债最小,老板也看得见里程碑。用 Go 写在线培训系统,先跑通“注册-选课-看视频-答测验-看进度”主链路,代码量 < 3k 行即可上线;- 表
下面给出一份“4 人月、可上线、可扩”的最小闭环方案,全部用 Go 技术栈,服务器 2C4G 就能跑 500 并发;后续业务量上来再按“服务 → 微服务 → K8s”路线水平扩展即可。所有代码片段均可直接复制编译,文末附上线 checklist 与常见坑。

一、业务边界(MVP)
1. 学员端:注册登录、选课、看视频(录播)、答测验、看进度
2. 管理端:上传视频(OSS)、建课程、出题、看报表
3. 不做直播、不做支付、不做权限细粒度 RBAC——用“角色”硬编码即可,先跑通主线。
---
二、总体架构(单 Repo 单体 → 可拆)
CDN
↓
API Gateway(Gin 单进程内即可)
/ | \
用户 课程 视频点
服务 服务 播服务
\ | /
PostgreSQL + Redis
- 初期把路由拆成 3 个包:internal/handler/user.go、course.go、video.go,共用同一个 main.go 启动,后续流量上来再拆进程。
- 视频文件直传阿里云 OSS(S3 协议),服务端只保存 URL 与时长,不承担流量。
- 测验题库表设计支持“随机抽 10 题”即可,暂不做复杂算分。
---
三、数据模型(最小表)
CREATE TABLE users (
id bigserial PRIMARY KEY,
mobile varchar(11) UNIQUE,
pwd_hash varchar(60) NOT NULL,
role smallint NOT NULL DEFAULT 0, -- 0学员 1管理员
created_at timestamptz DEFAULT now()
);
CREATE TABLE courses (
id bigserial PRIMARY KEY,
title varchar(128),
cover_url text,
price_cents int DEFAULT 0,
status smallint DEFAULT 1,
created_at timestamptz DEFAULT now()
);
CREATE TABLE lessons (
id bigserial PRIMARY KEY,
course_id bigint REFERENCES courses(id),
title varchar(128),
video_url text,
duration_sec int,
sort_order smallint
);
CREATE TABLE questions (
id bigserial PRIMARY KEY,
course_id bigint REFERENCES courses(id),
content text,
options jsonb,
answer smallint
);
CREATE TABLE enrollments (
user_id bigint REFERENCES users(id),
course_id bigint REFERENCES courses(id),
progress smallint DEFAULT 0, -- 百分比
PRIMARY KEY (user_id, course_id)
);
CREATE TABLE quiz_records (
id bigserial PRIMARY KEY,
user_id bigint,
course_id bigint,
score smallint,
created_at timestamptz DEFAULT now()
);
---
四、Go 工程骨架(单 Module)
tiny-lms/
├── main.go
├── go.mod
├── internal/
│ ├── handler/ // 路由业务
│ ├── model/ // 结构体 + sqlc 生成
│ ├── service/ // 领域逻辑
│ └── middleware/ // JWT、CORS、Log
├── configs/ // yaml
├── scripts/ // Dockerfile & 迁移脚本
└── uploads/ // 本地临时目录
- 依赖库
github.com/gin-gonic/gin
github.com/golang-jwt/jwt/v5
github.com/lib/pq
github.com/redis/go-redis/v9
github.com/zeromicro/go-zero(可选,内置 API 网关、限流)
---
五、关键代码片段
1. 统一响应 + 错误码
type R struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"`
}
func OK(c *gin.Context, data interface{}) {
c.JSON(http.StatusOK, R{Code: 0, Data: data})
}
func Fail(c *gin.Context, code int, msg string) {
c.JSON(http.StatusOK, R{Code: code, Msg: msg})
}
1. JWT 中间件(HS256 硬编码密钥)
func JWT() gin.HandlerFunc {
return func(c *gin.Context) {
token := c.GetHeader("Authorization")
if token == "" || !strings.HasPrefix(token, "Bearer ") {
Fail(c, 401, "缺少令牌"); c.Abort(); return
}
token = token[7:]
claims := &jwt.RegisteredClaims{}
t, err := jwt.ParseWithClaims(token, claims, func(*jwt.Token) (interface{}, error) {
return []byte("tiny-lms-2025"), nil
})
if err != nil || !t.Valid {
Fail(c, 401, "令牌无效"); c.Abort(); return
}
c.Set("userID", claims.ID)
c.Next()
}
}
1. 视频断点续播(秒级精度)
- 表加 watch_progress(user_id, lesson_id, stop_at_sec)
- 前端每 10 s 发心跳 POST /api/progress 带 {lessonID, sec}
- 后端 Upsert,取课时直接 SELECT COALESCE(stop_at_sec,0) FROM watch_progress WHERE ...
1. 随机抽题
SELECT id, content, options
FROM questions
WHERE course_id = $1
ORDER BY RANDOM()
LIMIT 10;
---
六、部署与上线 checklist
1. 数据库- 阿里云 RDS PostgreSQL 13+(开 pg_stat_statements 慢查)
- 初始脚本放 scripts/schema.sql,Flyway/golang-migrate 均可
2. 对象存储- 开通 OSS,创建只写 AK,配置跨域 CORS *(开发阶段)
3. 服务器- 1 台 2C4G 即可,Docker 镜像 30 MB,QPS 500 无压力
4. 域名 & HTTPS- 免费证书 Let’s Encrypt,用 caddy 自动续期
5. 监控- prometheus + grafana 模板 9578(Go runtime)
- 加一条 pg_exporter 看连接数、慢查
6. 备份- RDS 自带 7 天备份;OSS 开版本控制防止误删视频
---
七、扩展路线(业务量翻倍时)
阶段 1:单体多实例
- Nginx 上游 2 进程,共享会话(JWT 无状态),Postgres 只读副本挂报表。
阶段 2:业务拆分
- 用户服务 / 课程服务 / 视频服务独立 Git 仓库,走 gRPC + go-zero 内置注册中心。
阶段 3:K8s + 灰度
- 容器化后用阿里云 ACK,HPA 按 CPU 60% 扩容;视频走 CDN + M3U8 切片,支持直播回看。
---
八、常见坑
1. 前端直传 OSS 一定要 STS 临时令牌,别把 AK/SK 写进网页。
2. Gin 默认不带恢复中间件,线上务必 r.Use(gin.Recovery())。
3. 视频文件名用 UUID,防止中文空格导致签名失败。
4. PostgreSQL 连接数默认 100,Go 端 sql.SetMaxOpenConns(80) 留裕量。
5. 测验表别忘给 (user_id, course_id) 建联合索引,否则报表查询全表扫描。
---
九、总结
用 Go 写在线培训系统,先跑通“注册-选课-看视频-答测验-看进度”主链路,代码量 < 3k 行即可上线;
把视频、存储、监控全部托管给云,团队只需关注业务表设计与 API,4 周就能给第一批学员内测。
后续随着课程数、并发量上涨,再按“单体多实例 → 微服务 → K8s”节奏水平扩容,技术债最小,老板也看得见里程碑。祝上线顺利!
更多推荐


所有评论(0)