logo
15
16
WeChat Login

Go Web 框架

Go Version Gin Framework GORM

一个基于 Gin 框架的企业级 Go Web 应用模板,采用清晰的分层架构设计,内置依赖注入容器、可插拔驱动系统、版本化数据库迁移等企业级功能。

特性

  • 清晰的分层架构:Controller → Service → DAO → Model
  • 依赖注入容器:懒加载单例、优先级覆盖、反射注入
  • 可插拔驱动系统:数据库、日志、缓存、Redis 均支持运行时切换驱动
  • 多数据库支持:MySQL、PostgreSQL、SQLite、Memory
  • 版本化数据库迁移:基于 Goose 的 SQL 迁移,支持 up/down/status/create
  • Redis 与缓存:内置 Redis 支持,缓存驱动可选 redis/memory/none
  • 健康检查:完整的健康检查机制
  • 配置管理:基于 Viper 的配置管理,支持环境变量覆盖
  • 结构化日志:基于 Zap 的高性能日志(development/production 驱动)
  • 优雅启停:SIGINT/SIGTERM 优雅关闭,SIGHUP 热重载
  • 框架无关控制器:控制器接受 RouterContextInterface,不直接依赖 Gin
  • 正则路由:支持正则表达式路由与命名捕获组

加群获取帮助

QQ企业微信
wechat_qr_code.pngwechat_qr_code.png
QQ群:1021660914
点击链接加入群聊【木雷坞开源家】
扫描上方二维码加入微信群

快速开始

1. 克隆项目

git clone https://cnb.cool/mliev/open/go-web
cd go-web

2. 初始化项目

Fork 后执行初始化脚本,自动替换模块路径:

./init.sh

3. 配置环境

cp config.yaml.example config.yaml
vim config.yaml

4. 安装依赖

go mod tidy

5. 启动项目

# 前台启动
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/                            # 文档

技术栈

技术版本用途
Go1.25.0编程语言
Gin1.11.0Web 框架
GORM1.31.1ORM
Goose3.27.0数据库迁移
Viper1.21.0配置管理
Zap1.27.1结构化日志
go-redis9.17.3Redis 客户端
Cobra1.10.2CLI 框架
gomander1.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 容器

项目使用自定义 DI 容器(pkg/container/),支持:

  • 懒加载单例:首次 Get 时创建实例
  • 优先级覆盖:同名 Provider 高优先级覆盖低优先级
  • 反射注入:通过 inject:"" 标签按字段类型自动注入(inject:"-" 跳过)
  • 生命周期钩子Initializable(初始化)/ Destroyable(销毁)
  • 热重载支持ResetAll() 重置所有实例后重新装配
// 获取服务
db := container.MustGet[*gorm.DB]()

// 或使用 helper 快捷方式
db := helper.GetDatabase()
logger := helper.GetLogger()
cache := helper.GetCache()

可插拔驱动

基于泛型 driver.Manager[T],每种基础设施支持多个驱动实现,在配置文件中通过名称切换:

服务可用驱动
数据库mysqlpostgresqlsqlitememory
日志developmentproduction
缓存redismemorynone

数据库迁移

项目使用 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

API 接口

健康检查

# 完整健康检查(数据库 + 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() 方法。

配置说明

配置文件 (config.yaml)

# 数据库配置
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

# 构建镜像
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 格式化代码
  • 导入顺序:标准库、第三方库、项目包(空行分隔)
  • 文件名使用 snake_case
  • 控制器方法接受 RouterContextInterface,不直接使用 *gin.Context

贡献指南

  1. Fork 项目
  2. 创建功能分支:git checkout -b feature/AmazingFeature
  3. 提交更改:git commit -m 'Add some AmazingFeature'
  4. 推送到分支:git push origin feature/AmazingFeature
  5. 开启 Pull Request

许可证

本项目基于 MIT 许可证,详情请查看 LICENSE 文件。

About

一个基于 Gin 框架的 Go Web 应用,采用分层架构设计,适合快速开发和扩展。技术栈包括 Go 1.23.2、Gin(Web框架)、GORM(ORM工具)、MySQL/PostgreSQL(数据库)、Redis(缓存)、Viper(配置管理)、Zap(日志记录)以及 go-resty(HTTP客户端)。项目遵循清晰的命名规范、代码组织规范及错误处理机制,确保代码结构简洁、可维护性强。

3.53 MiB
15 forks16 stars6 branches12 TagREADMEMIT license
go-webrepo-named
Language
Go95.3%
Shell3.5%
Dockerfile1.2%