基于Gin框架的Go Web服务器脚手架,具有完整的分层设计和丰富的功能。
- 使用 Gin 框架构建高性能Web服务
- 支持国际化 (i18n),使用 go-i18n
- 集成 GORM 进行数据库操作,支持MySQL、PostgreSQL和SQLite
- 支持 Redis 缓存
- 使用 Zap 进行高性能日志记录
- 使用 YAML 进行配置管理
- 集成 Swagger 自动生成API文档
- 支持作为Windows服务运行
- 支持Docker容器化部署
- 使用 Asynq 处理异步任务,支持独立 worker 进程
- 符合SOLID设计原则的清晰分层架构
.
├── api # API层,处理HTTP请求
│ └── v1 # API版本1
├── config # 配置文件和配置管理
├── docs # Swagger文档
├── i18n # 国际化资源
│ └── locales # 语言文件
├── internal # 内部包
│ ├── middleware # HTTP中间件
│ ├── model # 数据模型
│ ├── repository # 数据访问层
│ └── service # 业务逻辑层
├── pkg # 通用包
│ ├── db # 数据库连接管理
│ ├── logger # 日志管理
│ ├── redis # Redis连接管理
│ ├── asynq # 异步任务处理
│ └── utils # 工具函数
└── scripts # 脚本文件
项目采用清晰的分层设计,遵循SOLID原则:
- 交互层 (API): 处理HTTP请求和响应,参数验证,路由管理
- 业务逻辑层 (Service): 实现业务逻辑,协调各种资源
- 数据访问层 (Repository): 处理数据存储和检索,封装数据库操作
- 模型层 (Model): 定义数据结构和业务实体
- 通用机制层 (pkg): 提供通用功能,如日志、数据库连接、工具函数等
本项目采用主干开发模式(Trunk-based Development),详细的分支管理和提交规范请参阅分支管理规范。
- Go 1.24 或更高版本
- MySQL/PostgreSQL/SQLite (根据配置选择)
- Redis (可选)
- 克隆仓库
git clone https://github.com/yourusername/mock-kbcenter.git
cd mock-kbcenter- 安装依赖
go mod download- 修改配置文件
cp config/config.yaml config/config.local.yaml
# 编辑 config/config.local.yaml 设置你的配置- 运行服务器
go run main.go --config ./config/config.local.yaml项目使用 Asynq 处理异步任务,如邮件发送、图片处理等。worker 进程可以独立运行。
# 构建 worker
make build-worker
# 运行 worker
make run-worker# 构建 worker Docker 镜像
make docker-build-worker
# 运行 worker 容器
docker run -d --name mock-kbcenter-worker mock-kbcenter-worker- 构建Docker镜像
docker build -t mock-kbcenter .- 运行容器
docker run -p 8080:8080 mock-kbcenter- 安装服务
go run scripts/windows_service.go -service=install- 启动服务
go run scripts/windows_service.go -service=start- 停止服务
go run scripts/windows_service.go -service=stop- 卸载服务
go run scripts/windows_service.go -service=uninstall启动服务后,访问 http://localhost:8080/swagger/index.html 查看API文档。
生成Swagger文档:
# 安装swag
go install github.com/swaggo/swag/cmd/swag@latest
# 生成文档
swag init -g main.go -o docs项目支持多语言,语言文件位于 i18n/locales 目录。
添加新语言:
- 创建新的语言文件,如
i18n/locales/fr.yaml - 在代码中使用翻译函数:
// 在中间件中设置语言
c.Set("locale", "fr")
// 在处理器中使用翻译
translate := c.MustGet("translate").(func(string, map[string]interface{}) string)
message := translate("welcome.message", nil)