e-mall:基于 Gin + GORM 的 Go 电商后端示例项目
作者:码农先森 | 项目:https://github.com/YasinDoyle/e-mall
想系统学习 Go 后端分层、事务、缓存、消息队列和秒杀链路,但苦于找不到一个"麻雀虽小五脏俱全"的示例?e-mall 就是这样一个基于 Gin + GORM 的电商后端示例项目,把主流中间件几乎串了一遍。
当前已实现:用户、商品、购物车、订单支付、秒杀、ES 搜索、Redis 缓存、RabbitMQ 事件、Kafka 异步下单,以及基础链路追踪能力。
已经实现的重点能力
用户侧
- 注册、登录、资料更新、关注、头像上传、邮箱验证
商品侧
- 商品、分类、轮播图、购物车、收藏夹、收货地址等常规电商模块
订单与支付
- 订单创建、列表、详情、删除、发货、收货
- 支付幂等、库存并发控制
- 支付成功 RabbitMQ 事件发布
秒杀
- 缓存预热、Redis Lua 预减库存、防重复秒杀
- Kafka 异步建单
搜索与可观测
- Elasticsearch 商品搜索
- Jaeger tracing 基础接入,HTTP → DB/Redis/MQ 链路可继续向下传递
项目结构
cmd/ 程序入口
api/v1/ Handler 层
service/ 业务层
repository/db/dao/ 数据访问层
repository/cache/ Redis
repository/es/ Elasticsearch
repository/rabbitmq/ RabbitMQ 发布
repository/kafka/ Kafka 生产和消费
middleware/ JWT、CORS、Tracing
config/ 配置和 SQL 初始化脚本
doc/ 学习指南、验证说明
scripts/ 烟测和压测脚本
典型的四层架构:Handler → Service → Repository(db/cache/es/mq),清晰且不拖泥带水,很适合作为学习范本。
本地启动
1. 启动依赖
docker-compose up -d mysql redis rabbitmq kafka jaeger elasticsearch kibana
如果暂时只验证订单支付和秒杀链路,最小依赖可以先起:
docker-compose up -d mysql redis rabbitmq kafka
2. 启动服务
cd cmd
go run .\main.go
默认 HTTP 端口来自 config/locales/config.yaml,当前是 :5001。
3. 初始化顺序
服务启动时会依次执行:
InitConfig -> InitMysql -> InitCache -> InitRabbitMQ -> InitES -> InitKafka -> InitTrack -> Router
入口代码在 cmd/main.go。
关键依赖
| 组件 | 用途 | 默认端口 |
|---|---|---|
| MySQL | 主业务数据存储 | 3307 |
| Redis | 缓存、订单超时记录、秒杀库存和用户防重标记 | — |
| RabbitMQ | 支付成功事件发布 | — |
| Kafka | 秒杀异步建单 | — |
| Elasticsearch | 商品搜索 | — |
| Jaeger | 链路追踪 | — |
主要默认配置见 config/locales/config.yaml。
验证与压测
仓库里已经补了最基础的验证脚本:
doc/验证与压测.mdscripts/smoke-verify.ps1—— 支付幂等与库存烟测scripts/flash-sale-load.ps1—— 秒杀接口并发请求验证
学习入口
如果你是拿这个项目练后端分层、事务、缓存、消息队列和秒杀链路,建议直接看:
doc/学习指南.mdroutes/router.goservice/payment.goservice/flash_sale.gorepository/kafka/common.gorepository/rabbitmq/common.go
已知限制
- RabbitMQ 目前只补了生产端,没有对应业务消费端
- 秒杀下单是异步流程,当前还没有单独的结果查询接口
- 验证脚本更偏手工验证,不是完整 CI 自动化测试
go run .\main.go之前需要先把依赖起起来,否则会因为下游服务不可用而启动失败
适合用来学习什么
这个项目更适合用来学习和演示:
- Gin 分层接口设计
- GORM 事务和条件更新
- Redis 缓存和 Lua 原子脚本
- RabbitMQ / Kafka 的最小接入方式
- tracing 上下文传播
如果你要继续完善,比较自然的下一步是:
- 补秒杀异步结果查询接口
- 给支付和秒杀链路补更细的 service span
- 增加更标准的压测脚本,例如 k6
总结
e-mall 不是生产级电商系统,而是一个教学向的全栈示例:用一个电商场景,把 Go 后端最常被问到的能力(分层、事务、缓存、MQ、秒杀、链路追踪)串成一条可跑、可压、可追的完整链路。对新手建立全局观、对面试准备都很有帮助。
GitHub:https://github.com/YasinDoyle/e-mall