编程 e-mall:基于 Gin + GORM 的 Go 电商后端示例项目,秒杀/ES/链路追踪全栈

2026-07-12 08:42:31 +0800 CST views 9

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/验证与压测.md
  • scripts/smoke-verify.ps1 —— 支付幂等与库存烟测
  • scripts/flash-sale-load.ps1 —— 秒杀接口并发请求验证

学习入口

如果你是拿这个项目练后端分层、事务、缓存、消息队列和秒杀链路,建议直接看:

  • doc/学习指南.md
  • routes/router.go
  • service/payment.go
  • service/flash_sale.go
  • repository/kafka/common.go
  • repository/rabbitmq/common.go

已知限制

  • RabbitMQ 目前只补了生产端,没有对应业务消费端
  • 秒杀下单是异步流程,当前还没有单独的结果查询接口
  • 验证脚本更偏手工验证,不是完整 CI 自动化测试
  • go run .\main.go 之前需要先把依赖起起来,否则会因为下游服务不可用而启动失败

适合用来学习什么

这个项目更适合用来学习和演示:

  • Gin 分层接口设计
  • GORM 事务和条件更新
  • Redis 缓存和 Lua 原子脚本
  • RabbitMQ / Kafka 的最小接入方式
  • tracing 上下文传播

如果你要继续完善,比较自然的下一步是:

  1. 补秒杀异步结果查询接口
  2. 给支付和秒杀链路补更细的 service span
  3. 增加更标准的压测脚本,例如 k6

总结

e-mall 不是生产级电商系统,而是一个教学向的全栈示例:用一个电商场景,把 Go 后端最常被问到的能力(分层、事务、缓存、MQ、秒杀、链路追踪)串成一条可跑、可压、可追的完整链路。对新手建立全局观、对面试准备都很有帮助。

GitHub:https://github.com/YasinDoyle/e-mall

推荐文章

PHP 如何输出带微秒的时间
2024-11-18 01:58:41 +0800 CST
Boost.Asio: 一个美轮美奂的C++库
2024-11-18 23:09:42 +0800 CST
前端开发中常用的设计模式
2024-11-19 07:38:07 +0800 CST
【SQL注入】关于GORM的SQL注入问题
2024-11-19 06:54:57 +0800 CST
程序员茄子在线接单