Gin实战1:环境搭建与项目初始化

1. 为什么选择Gin框架?
- 技术优势:高性能路由(基于httprouter)、轻量级设计、中间件生态丰富
- 适用场景:API服务、微服务、高并发Web应用开发
2. 环境准备:从零搭建Go开发环境
- Go语言安装
- 官网下载与版本选择建议(1.20+版本兼容性最佳)
- 环境变量配置(
GOPATH
、GOROOT
、GOBIN
详解)
- 代理配置技巧
- 解决国内
go get
下载慢问题(推荐Go Module镜像源)
- 解决国内
- Gin框架安装验证
go get github.com/gin-gonic/gin
3. 项目初始化:构建标准化工程结构
- 模块化设计 该项目结构的设计思路学习了go-Kratos 框架的工程化实践思路
- 目录结构:
/study_gin ├── Makefile ├── README.md ├── cmd │ ├── main.go │ ├── wire.go │ └── wire_gen.go ├── configs ├── go.mod ├── go.sum ├── internal │ ├── biz # 业务逻辑层 │ ├── conf # 配置文件 │ ├── data # 数据层 │ ├── middleware # 中间件 │ ├── routers # 路由 │ └── service # 业务逻辑 负责api到biz之间到转发 └── pkg
- 目录结构:
- 目录结构说明
cmd
:项目入口文件pkg
:公共包internal
:业务代码configs
:配置文件
4. wine 依赖注入
项目使用wine 依赖注入工具自动生成wire_gen.go文件,main.go 中调用wireApp函数. 关于wine的使用,请参考 wine文档 和 公众号文章 部分主要代码如下: cmd/main.go
config := loadConfig(flagconf)
fileLogger := logger.WithPrefix(logger.NewFileLogger(logger.Info),
"service.id", Id,
"service.name", Name,
"service.version", Version,
)
s, err := wireApp(config.Server, fileLogger)
cmd/wire.go
func wireApp(server *conf.Server, logger logger.Logger) (*http.Server, error) {
panic(wire.Build(
service.ProviderSet,
routers.InitRouters,
newHttpServer))
}
wineApp函数中,通过wire.Build构建依赖注入的App对象,并返回。
service.ProviderSet 提供api接口所需的依赖注入对象,routers.InitRouters 提供路由初始化对象,newHttpServer 提供http服务对象。配置完成后 通过 wine 命令或者 Makefile中定义好的命令 make generate
生成wire_gen.go文件
构建后生成的代码:
// Injectors from wire.go:
func wireApp(server *conf.Server, logger2 logger.Logger) (*http.Server, error) {
accountServer := service.NewAccountServer(logger2)
engine := routers.InitRouters(accountServer)
httpServer := newHttpServer(server, engine)
return httpServer, nil
}
5. 优雅的停止
使用 http.Server 内置的 Shutdown() 方法优雅地关机.
go func() {
log.Println("Listen server...", config.Server.Addr)
err := s.ListenAndServe()
if err != nil && !errors.Is(err, http.ErrServerClosed) {
log.Fatalf("s.ListenAndServe err :%v", err)
}
}()
quit := make(chan os.Signal)
signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
<-quit
log.Println("Shutdown server...")
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
if err := s.Shutdown(ctx); err != nil {
log.Fatalf("Server forced to shoutdown:%v", err)
}
log.Println("Server exiting")
6. 开发调试与生产优化
- Makefile 工具集成; make 命令能够很方便的执行预定义指令,开发中非常方便,Makefile 文件中定义了常见的编译、运行、生成等指令,方便后续维护。
.PHONY: init
# init env
init:
go mod tidy
generate:
go mod tidy
go get github.com/google/wire/cmd/wire@latest
go generate ./cmd/...
.PHONY: build
# build
build:
go build -o ./bin/main ./cmd/
.PHONY: run
# run
run:
go run ./cmd/...
6. 总结与预告
重点回顾:环境搭建→项目初始化→分层架构设计→基础功能集成;回复 【Gin实战】获取相关代码
相关文章推荐:
