一个基于 Gin 框架的企业级 Go Web 应用模板,采用清晰的分层架构设计,内置依赖注入容器、可插拔驱动系统、版本化数据库迁移等企业级功能。
RouterContextInterface,不直接依赖 Gin| 企业微信 | |
|---|---|
![]() | ![]() |
| QQ群:1021660914 点击链接加入群聊【木雷坞开源家】 | 扫描上方二维码加入微信群 |
git clone https://cnb.cool/mliev/open/go-web
cd go-web
Fork 后执行初始化脚本,自动替换模块路径:
./init.sh
cp config.yaml.example config.yaml
vim config.yaml
go mod tidy
# 前台启动
go run main.go start
# 守护进程模式
go run main.go start -d
# 停止 / 重启 / 热重载 / 状态
go run main.go stop
go run main.go restart
go run main.go reload
go run main.go status
go-web/ ├── main.go # 程序入口,嵌入静态资源 ├── go.mod / go.sum # Go 模块定义 ├── config.yaml.example # 配置文件示例 ├── init.sh # 项目初始化脚本(替换模块路径) ├── Dockerfile # Docker 构建文件 ├── app/ # 应用层代码 │ ├── controller/ # 控制器(接受 RouterContextInterface) │ │ ├── base_response.go # 统一响应封装(Success/Error) │ │ ├── health_controller.go # 健康检查 │ │ └── index_controller.go # 首页 │ ├── service/ # 服务层(业务逻辑) │ ├── dao/ # 数据访问层 │ ├── model/ # 数据模型(GORM) │ ├── dto/ # 数据传输对象 │ │ ├── health_dto.go │ │ └── response_dto.go │ ├── constants/ # 常量与错误码 │ │ └── errors.go │ └── middleware/ # 中间件 │ └── cors_middleware.go ├── cmd/ # 命令行入口 │ ├── run.go # 启动逻辑(信号处理、热重载) │ ├── options.go # Functional Options │ └── migrate/ # 数据库迁移 CLI │ └── main.go ├── config/ # 配置管理 │ ├── app.go # AppProvider 实现(装配链 + 服务链) │ ├── config.go # 配置加载清单 │ └── autoload/ # 自动加载配置 │ ├── app.go # 应用配置 │ ├── cache.go # 缓存配置 │ ├── database.go # 数据库配置 │ ├── http.go # HTTP 配置 │ ├── middleware.go # 中间件注册 │ ├── migration.go # 迁移配置 │ ├── redis.go # Redis 配置 │ ├── router.go # 路由注册 │ └── static_fs.go # 静态文件配置 ├── migrations/ # SQL 迁移文件目录 ├── pkg/ # 框架核心 │ ├── container/ # DI 容器(懒加载单例 + 优先级覆盖) │ ├── contract/ # 服务契约(类型别名) │ ├── driver/ # 泛型驱动管理器 │ ├── helper/ # 全局访问器(GetDatabase/GetLogger/...) │ ├── interfaces/ # 核心接口(AppProvider/Assembly/Server) │ └── server/ # 各基础设施实现 │ ├── cache/ # 缓存(redis/memory/none 驱动) │ ├── config/ # 配置服务 │ ├── database/ # 数据库(mysql/postgresql/sqlite/memory 驱动) │ ├── env/ # 环境变量(Viper) │ ├── http_server/ # HTTP 服务器(Gin) │ ├── logger/ # 日志(development/production 驱动) │ ├── migration/ # 数据库迁移(Goose) │ ├── redis/ # Redis 客户端 │ └── reload/ # 热重载信号通道 ├── static/ # 静态资源(go:embed) ├── templates/ # 模板文件(go:embed) └── docs/ # 文档
| 技术 | 版本 | 用途 |
|---|---|---|
| Go | 1.25.0 | 编程语言 |
| Gin | 1.11.0 | Web 框架 |
| GORM | 1.31.1 | ORM |
| Goose | 3.27.0 | 数据库迁移 |
| Viper | 1.21.0 | 配置管理 |
| Zap | 1.27.1 | 结构化日志 |
| go-redis | 9.17.3 | Redis 客户端 |
| Cobra | 1.10.2 | CLI 框架 |
| gomander | 1.0.0 | 进程管理(start/stop/reload) |
main.go → gomander.Run() → cmd.Start(WithTemplateFs, WithWebStaticFs, WithApp) → Assembly 链: Env → Config → Logger → Database → Redis → Cache → Server 链: Migration(goose.Up) → HttpServer(Gin) → 信号监听: SIGINT/SIGTERM → 优雅关闭 | SIGHUP → 热重载
┌─────────────────────────────────┐ │ HTTP Layer (Gin) │ ├─────────────────────────────────┤ │ Controller Layer │ │ (RouterContextInterface) │ ├─────────────────────────────────┤ │ Service Layer │ │ (Business Logic) │ ├─────────────────────────────────┤ │ DAO Layer │ │ (Data Access Objects) │ ├─────────────────────────────────┤ │ Model Layer │ │ (GORM Models) │ └─────────────────────────────────┘
项目使用自定义 DI 容器(pkg/container/),支持:
Get 时创建实例inject:"" 标签按字段类型自动注入(inject:"-" 跳过)Initializable(初始化)/ Destroyable(销毁)ResetAll() 重置所有实例后重新装配// 获取服务
db := container.MustGet[*gorm.DB]()
// 或使用 helper 快捷方式
db := helper.GetDatabase()
logger := helper.GetLogger()
cache := helper.GetCache()
基于泛型 driver.Manager[T],每种基础设施支持多个驱动实现,在配置文件中通过名称切换:
| 服务 | 可用驱动 |
|---|---|
| 数据库 | mysql、postgresql、sqlite、memory |
| 日志 | development、production |
| 缓存 | redis、memory、none |
项目使用 Goose 进行版本化 SQL 迁移。
# 创建迁移文件
go run cmd/migrate/main.go create create_users_table
# 执行所有未应用的迁移
go run cmd/migrate/main.go up
# 回滚最近一次迁移
go run cmd/migrate/main.go down
# 查看迁移状态
go run cmd/migrate/main.go status
# 回滚并重新执行最近一次迁移
go run cmd/migrate/main.go redo
迁移文件格式:
-- +goose Up
CREATE TABLE users (
id BIGINT PRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULL UNIQUE,
created_at DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
);
-- +goose Down
DROP TABLE IF EXISTS users;
服务启动时会自动执行 goose.Up,应用所有未执行的迁移。详见 migrations/README.md。
# 完整健康检查(数据库 + Redis) GET /health # 简单健康检查 GET /health/simple
响应格式:
{
"code": 0,
"message": "操作成功",
"data": {
"status": "UP",
"timestamp": 1703123456,
"services": {
"database": { "status": "UP" },
"redis": { "status": "UP" }
}
}
}
所有接口使用统一响应结构:
{
"code": 0,
"message": "操作成功",
"data": {}
}
错误码定义在 app/constants/errors.go。控制器通过嵌入 BaseResponse 使用 Success() / Error() 方法。
# 数据库配置
database:
driver: "mysql" # mysql, postgresql, sqlite, memory
host: "127.0.0.1"
port: 3306
username: "root"
password: "password"
dbname: "mydb"
migration:
dir: "migrations" # SQL 迁移文件目录
# Redis 配置
redis:
host: "127.0.0.1"
port: 6379
password: ""
db: 0
# 应用配置
app:
mode: "debug" # debug, release
所有配置项均可通过环境变量覆盖,使用 _ 替代 . 作为分隔符:
export DATABASE_DRIVER=postgresql
export DATABASE_HOST=localhost
export DATABASE_PORT=5432
export DATABASE_USERNAME=myuser
export DATABASE_PASSWORD=mypass
export DATABASE_DBNAME=mydb
export DATABASE_MIGRATION_DIR=migrations
export REDIS_HOST=localhost
export REDIS_PORT=6379
# 构建镜像
docker build -t go-web-app .
# 运行容器
docker run -d -p 8080:8080 go-web-app
# 编译
go build -o bin/go-web main.go
# 前台运行
./bin/go-web start
# 守护进程运行
./bin/go-web start -d
在 config/autoload/router.go 中注册路由,在 app/controller/ 中实现控制器:
// config/autoload/router.go
router.GET("/users", controller.UserController{}.List)
router.POST("/users", controller.UserController{}.Create)
在 app/middleware/ 中实现,在 config/autoload/middleware.go 中注册:
// config/autoload/middleware.go
"http.middleware": []httpInterfaces.MiddlewareFunc{
middleware.CorsMiddleware(),
middleware.AuthMiddleware(),
},
gofmt 格式化代码RouterContextInterface,不直接使用 *gin.Contextgit checkout -b feature/AmazingFeaturegit commit -m 'Add some AmazingFeature'git push origin feature/AmazingFeature本项目基于 MIT 许可证,详情请查看 LICENSE 文件。