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


1. 为什么选择Gin框架?

  • 技术优势:高性能路由(基于httprouter)、轻量级设计、中间件生态丰富
  • 适用场景:API服务、微服务、高并发Web应用开发

2. 环境准备:从零搭建Go开发环境

  • Go语言安装
    • 官网下载与版本选择建议(1.20+版本兼容性最佳)
    • 环境变量配置(GOPATHGOROOTGOBIN详解)
  • 代理配置技巧
    • 解决国内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实战】获取相关代码

相关文章推荐:

如有疑问关注公众号给我留言
wx

关注公众号

©2017-2023 鲁ICP备17023316号-1 Powered by Hugo