# go_web_app **Repository Path**: yohobo/go_web_app ## Basic Information - **Project Name**: go_web_app - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-01-05 - **Last Updated**: 2026-01-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # web_app 🔧 **轻量级 Go + Gin Web 框架示例** ## 概述 ✅ 这个仓库是一个用于构建 Go Web 服务的轻量脚手架,包含: - Gin 作为 HTTP 框架 - zap + lumberjack 作为日志(JSON 格式,文件轮转) - Viper 管理配置和热加载 - MySQL(通过 sqlx + go-sql-driver/mysql) - 可选的 Redis 支持(go-redis) ## 目录结构 🔍 - `main.go` - 程序入口,包含服务启动与优雅关停 - `conf/config.yaml` - 配置样例(可复制到项目根并命名为 `config.yaml`,程序通过 `viper` 读取) - `routes/` - 路由注册 - `logger/` - 日志封装(zap + lumberjack) - `dao/mysql/` - MySQL 初始化与关闭 - `dao/redis/` - Redis 初始化与关闭(默认未启用) - `settings/` - Viper 配置初始化及热加载 - `logs/` - 默认日志输出目录 ## 各目录说明 📂 - `controllers/` - HTTP 请求处理层(handlers),负责:解析参数、参数校验、调用 `logic` 层执行业务并返回响应。保持轻量,避免写复杂业务逻辑。 - `dao/` - 数据访问层(Data Access Object),封装对 MySQL / Redis 的连接与底层查询、事务处理。DAO 仅负责持久化相关操作并返回模型或错误。 - `logic/` - 业务逻辑层(service),负责协调 `dao`、校验、复杂业务流程和事务,供 `controllers` 调用,便于单元测试。 - `models/` - 领域模型与 DTO 定义(structs),包括数据库模型、请求/响应结构体等。 - `pkg/` - 可复用工具包 / 公共库,放置与业务无关且可复用的代码(例如 helpers、clients)。 - `routes/` - 路由与中间件注册(`Setup`),将路由配置集中管理。 - `settings/` - 配置初始化及热加载(基于 `viper`)。 - `logger/` - 日志初始化及 Gin 中间件(zap + lumberjack)。 - `logs/` - 日志文件目录(不要将日志提交到版本库)。 - `tests/` - (可选)放置集成测试或端到端测试。 > 设计建议:保持职责分离(Controller -> Logic -> DAO),Controller 只处理请求/响应,Logic 处理业务流程,DAO 负责持久化操作。这样项目更易维护与测试。 ## 依赖 & 要求 🧩 - Go >= 1.25.5(见 `go.mod`) - 需要运行的外部服务:MySQL(必需),Redis(可选) 主要依赖: - `github.com/gin-gonic/gin` - `go.uber.org/zap` - `github.com/spf13/viper` - `github.com/jmoiron/sqlx` - `github.com/go-sql-driver/mysql` - `github.com/go-redis/redis/v8`(可选) ## 配置 🔧 配置文件:样例位于 `conf/config.yaml`(项目内)。 注意:程序默认会读取项目根目录下名为 `config.yaml` 的文件(`settings.Init()` 使用 `viper.AddConfigPath(".")`)。如果你保留样例在 `conf/`,请将其复制到项目根: ```bash # macOS / Linux cp conf/config.yaml ./config.yaml # Windows (PowerShell) Copy-Item conf\config.yaml -Destination .\config.yaml ``` 或者在代码中将 `settings.Init()` 修改为包含 `conf` 路径: ```go viper.AddConfigPath(".") viper.AddConfigPath("conf") ``` 示例主要字段: ```yaml app: port: 8080 log: level: "debug" filename: "logs/web_app.log" max_size: 200 max_age: 30 max_backups: 7 mysql: host: "127.0.0.1" port: 3306 user: "root" password: "root" db: "golang_web_app" max_idle_conns: 200 max_open_conns: 50 redis: host: "127.0.0.1" port: 6379 password: "" db: 0 pool_size: 100 ``` > 💡 `viper` 已启用配置文件变更监听(热加载):`settings.Init()` 自动调用 `viper.WatchConfig()`。 ### 故障排查 🔍 - 如果运行 `go run main.go` 时看到 `viper.ReadInConfig() failed`: - 确认 `config.yaml` 已存在于项目根,或者将 `conf/config.yaml` 复制到项目根(见上文复制命令)。 - 确认你的**当前工作目录**是项目根(通常是包含 `go.mod` 的目录)。 - 如果日志未写入 `logs/`:确保 `logs/` 目录存在且应用有写权限。 ## 构建与运行 ▶️ 在开发机器上: 1. 下载依赖 ```bash go mod download ``` 2. 直接运行 ```bash go run main.go ``` 或构建二进制并运行: ```bash go build -o web_app . ./web_app ``` 程序会监听 `config.yaml` 中的 `app.port`(默认 `8080`)。 ## 测试接口示例 ✅ 启动后访问: ```bash curl http://localhost:8080/ # 返回: Hello World! ``` ## 日志 📁 - 默认写入 `logs/web_app.log`(JSON 格式) - 使用 `lumberjack` 做文件轮转,相关参数请在 `config.yaml` 中调整 ## 启用 Redis(可选) `main.go` 中有关 Redis 的初始化已注释。若要启用: 1. 在 `main.go` 中恢复 Redis 初始化/关闭的注释 2. 确保 `config.yaml` 中 `redis` 节配置正确并且 Redis 服务可用 ## 优雅关闭 ✅ 程序支持优雅停机,接收 `SIGINT`/`SIGTERM`,并在 5 秒超时时间内完成未处理的请求。 ## 贡献 & 许可证 🧾 - 当前仓库未包含 LICENSE 文件,请根据需要添加(MIT / Apache2 等) - 欢迎提交问题与 PR