logo
0
0
WeChat Login
Forkfrommliev/open/go-web, behindmaster64 commits

Go Web 框架

Go Version Gin Framework GORM

一个基于 Gin 框架的企业级 Go Web 应用模板,采用清晰的分层架构设计,内置依赖注入、健康检查、配置管理等企业级功能。

✨ 特性

  • 🏗️ 清晰的分层架构:Controller → Service → DAO → Model
  • 🔧 依赖注入:基于 Assembly 模式的依赖管理
  • 🌐 多数据库支持:MySQL、PostgreSQL
  • 📦 Redis 缓存:内置 Redis 支持
  • 📊 健康检查:完整的健康检查机制
  • 🔧 配置管理:基于 Viper 的配置管理
  • 📝 结构化日志:基于 Zap 的高性能日志
  • 🚀 优雅启停:支持优雅关闭
  • 🔄 自动迁移:数据库表结构自动迁移

📞 加群获取帮助

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

🚀 快速开始

1. 克隆项目

git clone https://cnb.cool/mliev/examples/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

# 或使用 Makefile
make run

📁 项目结构

go-web/
├── main.go                    # 程序入口
├── go.mod                     # Go模块定义
├── go.sum                     # 依赖版本锁定
├── README.md                  # 项目说明文档
├── config.yaml.example        # 配置文件示例
├── config.yaml                # 配置文件
├── init.sh                    # 项目初始化脚本
├── Dockerfile                 # Docker构建文件
├── docker-compose.yml         # Docker编排文件
├── Makefile                   # 构建脚本
├── LICENSE                    # 许可证文件
├── app/                       # 应用核心代码
│   ├── controller/           # 控制器层
│   │   ├── base_response.go  # 统一响应封装
│   │   ├── health_controller.go # 健康检查
│   │   └── index_controller.go  # 首页控制器
│   ├── service/              # 服务层(业务逻辑)
│   ├── dao/                  # 数据访问层
│   │   └── test_demo_dao.go
│   ├── model/                # 数据模型
│   │   └── test_demo.go
│   ├── dto/                  # 数据传输对象
│   │   ├── health_dto.go
│   │   └── response_dto.go
│   └── middleware/           # 中间件
│       └── cors_middleware.go
├── cmd/                       # 命令行入口
│   └── run.go                # 启动逻辑
├── config/                   # 配置管理
│   ├── assembly.go           # 依赖注入配置
│   ├── config.go             # 基础配置
│   ├── migration.go          # 迁移配置
│   ├── server.go             # 服务器配置
│   └── autoload/             # 自动加载配置
│       ├── base.go
│       ├── database.go
│       ├── middleware.go
│       ├── redis.go
│       └── router.go
├── constants/                # 常量定义
│   └── errors.go            # 错误码定义
├── docs/                     # 文档
│   ├── PROJECT_SPECIFICATION.md
│   └── TEMPLATE_INIT.md
├── internal/                 # 内部包
│   ├── helper/               # 内部助手
│   │   └── helper.go
│   ├── interfaces/           # 接口定义
│   │   ├── assembly.go
│   │   ├── config.go
│   │   ├── database.go
│   │   ├── env.go
│   │   ├── helper.go
│   │   ├── logger.go
│   │   ├── redis.go
│   │   └── server.go
│   ├── pkg/                  # 内部包实现
│   │   ├── config/           # 配置包
│   │   ├── database/         # 数据库包
│   │   ├── demo/             # 示例包
│   │   ├── env/              # 环境变量包
│   │   ├── http_server/      # HTTP服务器包
│   │   ├── logger/           # 日志包
│   │   └── redis/            # Redis包
│   └── service/              # 内部服务
│       └── migration/        # 迁移服务
│           └── migration.go
└── util/                     # 工具函数
    ├── base_62.go
    └── generate_utils.go

🛠️ 技术栈

技术版本描述
Go1.23.2编程语言
Gin1.10.1Web框架
GORM1.25.12ORM框架
MySQL/PostgreSQL-关系型数据库
Redis-缓存数据库
Viper1.19.0配置管理
Zap1.27.0结构化日志

🏗️ 架构设计

分层架构

┌─────────────────────────────────┐
│          HTTP Layer             │
│     (Gin Router & Middleware)   │
├─────────────────────────────────┤
│        Controller Layer         │
│    (Request/Response Handling)  │
├─────────────────────────────────┤
│         Service Layer           │
│      (Business Logic)           │
├─────────────────────────────────┤
│          DAO Layer              │
│     (Data Access Objects)       │
├─────────────────────────────────┤
│         Model Layer             │
│    (Database Models)            │
└─────────────────────────────────┘

依赖注入

项目采用 Assembly 模式实现依赖注入:

// Assembly 接口
type AssemblyInterface interface {
    Assembly()
}

// 配置装配顺序
func (receiver AssemblyConfig) Get() []interfaces.AssemblyInterface {
    return []interfaces.AssemblyInterface{
        assembly.Env{},      // 环境配置
        assembly.Logger{},   // 日志系统
        assembly.Database{}, // 数据库连接
        assembly.Redis{},    // Redis连接
    }
}

📋 API接口

健康检查

# 完整健康检查
GET /health

# 简单健康检查  
GET /health/simple

响应示例:

{
  "code": 0,
  "message": "操作成功",
  "data": {
    "status": "UP",
    "timestamp": 1703123456,
    "services": {
      "database": {
        "status": "UP"
      },
      "redis": {
        "status": "UP"
      }
    }
  }
}

首页

GET /

⚙️ 配置说明

配置文件示例 (config.yaml)

# 服务配置
addr: ":8080"
mode: "debug"  # debug, release

# 数据库配置
db:
  driver: "postgresql"    # postgresql, mysql
  host: "127.0.0.1"
  port: 5432
  username: "test"
  password: "123456"
  dbname: "test"

# Redis配置
redis:
  host: "127.0.0.1"
  port: 6379
  password: ""
  db: 0

# 数据库迁移配置
database:
  halt_on_migration_failure: true

🔧 开发指南

编码规范

  • 使用 gofmt 格式化代码
  • 遵循 Go 官方命名规范
  • 导出函数和类型必须添加注释
  • 优先使用小接口,遵循单一职责原则

错误处理

项目使用统一的错误码和响应格式:

// 错误码定义
const (
    ErrCodeSuccess      = 0   // 成功
    ErrCodeBadRequest   = 400 // 请求参数错误  
    ErrCodeUnauthorized = 401 // 未授权
    ErrCodeNotFound     = 404 // 资源不存在
    ErrCodeInternal     = 500 // 内部服务器错误
)

// 统一响应格式
type Response struct {
    Code    int         `json:"code"`
    Message string      `json:"message"`
    Data    interface{} `json:"data,omitempty"`
}

数据库操作

使用 DAO 层封装数据库操作:

// app/dao/user_dao.go
func GetUserByUsername(username string) (*model.User, error) {
    var user model.User
    if err := helper.Database().Where("username = ?", username).First(&user); err != nil {
        return nil, err
    }
    return &user, nil
}

🚀 部署

Docker 部署

# 构建镜像
docker build -t go-web-app .

# 运行容器
docker run -d -p 8080:8080 go-web-app

Docker Compose

# 启动服务(包含数据库和Redis)
docker-compose up -d

# 查看日志
docker-compose logs -f

# 停止服务
docker-compose down

手动部署

# 编译
go build -o bin/go-web main.go

# 运行
./bin/go-web

🔨 开发命令

项目支持 Makefile 快速操作:

# 启动开发服务器
make run

# 构建项目
make build

# 运行测试
make test

# 格式化代码
make fmt

# 静态检查
make vet

# 清理构建文件
make clean

📊 监控和日志

健康检查端点

  • 完整检查GET /health - 检查数据库、Redis等所有依赖服务
  • 简单检查GET /health/simple - 仅检查服务是否启动

日志配置

项目使用 Zap 进行结构化日志记录:

// 记录结构化日志
helper.Logger().Info("用户创建成功", 
    zap.String("username", username),
    zap.Int("userID", userID),
)

🌍 环境变量

支持通过环境变量覆盖配置文件:

export DB_HOST=localhost
export DB_PORT=5432
export DB_USERNAME=myuser
export DB_PASSWORD=mypass
export DB_DBNAME=mydb
export REDIS_HOST=localhost
export REDIS_PORT=6379

❓ 常见问题

Q: 如何添加新的API路由?

A: 在 config/autoload/router.go 中添加路由配置,在 app/controller/ 中实现控制器。

Q: 如何添加新的中间件?

A: 在 app/middleware/ 中实现中间件,然后在 config/autoload/middleware.go 中注册。

Q: 数据库迁移如何工作?

A: 项目启动时会自动执行 AutoMigrate(),根据 Model 定义创建或更新表结构。

Q: 如何更换数据库驱动?

A: 修改 config.yaml 中的 db.driver 配置,支持 postgresqlmysql

📝 开发规范

详细的开发规范请参考:

🤝 贡献指南

  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客户端)。项目遵循清晰的命名规范、代码组织规范及错误处理机制,确保代码结构简洁、可维护性强。

Language
Go60.5%
Markdown29%
Makefile4%
Shell3.3%
Others3.2%