适用于初学Gin的web脚手架

GIN_WEB脚手架

​ 笔者刚刚完成了七米老师的Gin框架学习并受益良多。为了帮助和我一样的Go语言小白,我将学习到的基于CLD层次的Gin脚手架分享给大家,帮助大家学习使用


开源地址

GIN_WEB脚手架

项目亮点

  1. CLD目录架构
  2. Air热更新 教程链接: > github.com/cosmtrek/ai...
  3. Viper动态读取配置
  4. 优雅关机

项目结构

txt 复制代码
├── LICENSE
├── README.md
├── conf                           // 配置信息
├── controller                     // controller层,用来储存路由对应的处理函数
├── dao														 // dao层,包含数据库驱动和对数据库的crud操作
├── go.mod												 
├── go.sum
├── logger												 // zap日志库集合,用来代替Gin原始日志库
├── logic                          // logic层,包含对controller层中对应函数的业务实现
├── logs													 // 记录日志
├── main.go                        // 主函数
├── middlewares                    // 中间件
├── models                         // 模型层
├── pkg                            // 一些处理包,诸如jwt和雪花算法
├── routes                         // 路由
├── settings                       // 设置,用来读取配置

功能介绍

config.yaml

配置信息,开发人员可以在里面配置开发信息。例如项目运行端口、mysql配置和日志保存配置

yaml 复制代码
name: "Gin_app"
mode: "dev"
port: 8082
start_time: "2021-01-01"
machine_id: 1

log:
  level: "debug"
  filename: "./logs/gin_app.log"
  maxsize: 200
  maxbackups: 10
  maxage: 30

mysql:
  host: "127.0.0.1"
  port: "13306"
  user: "root"
  password: "123456"
  dbname: "Gin_app"
redis:
  host: "127.0.0.1"
  port: 6379
  db: 0
  password: ""
  poolsize: 100

main.go

主函数

  1. 加载配置
  2. 初始化日志
  3. 初始化数据库链接
  4. 初始化雪花算法
  5. 初始化Gin框架内置的校验器翻译器
  6. 优雅关机
go 复制代码
package main

import (
	"Gin_Web_demo/controller"
	"Gin_Web_demo/dao/mysql"
	"Gin_Web_demo/dao/redis"
	"Gin_Web_demo/logger"
	"Gin_Web_demo/pkg/snowflake"
	"Gin_Web_demo/routes"
	"Gin_Web_demo/settings"
	"context"
	"fmt"
	"go.uber.org/zap"
	"log"
	"net/http"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	// 1. 加载配置
	if err := settings.Init(); err != nil {
		fmt.Printf("init settings failed, err:%v\n", err)
		return
	}
	fmt.Println(settings.Conf)
	// 2. 初始化日志
	if err := logger.Init(settings.Conf.LogConfig, settings.Conf.Mode); err != nil {
		fmt.Printf("init logger failed, err:%v\n", err)
		return
	}
	defer zap.L().Sync()
	zap.L().Debug("logger init success...")
	// 3. 初始化MySQL连接
	if err := mysql.Init(settings.Conf.MySQLConfig); err != nil {
		fmt.Printf("init mysql failed, err:%v\n", err)
		return
	}
	defer mysql.Close()
	// 4. 初始化Redis连接
	if err := redis.Init(settings.Conf.RedisConfig); err != nil {
		fmt.Printf("init redis failed, err:%v\n", err)
		return
	}
	defer redis.Close()
	// 5. 初始化雪花算法
	if err := snowflake.Init(settings.Conf.StartTime, settings.Conf.MachineID); err != nil {
		fmt.Printf("init snowflake failed, err:%v\n", err)
		return
	}
	// 6. 初始化Gin框架内置的校验器翻译器
	if err := controller.InitTrans("zh"); err != nil {
		fmt.Printf("init validator trans err:%v\n", err)
		return
	}
	// 7. 注册路由
	r := routes.Setup(settings.Conf.Mode)
	// 8. 启动服务(优雅关机)
	srv := &http.Server{
		Addr:    fmt.Sprintf(":%d", settings.Conf.Port),
		Handler: r,
	}
	// 打印启动端口
	fmt.Printf("启动端口: %d\n", settings.Conf.Port)
	go func() {
		// 开启一个goroutine启动服务
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	// 等待中断信号来优雅地关闭服务器,为关闭服务器操作设置一个5秒的超时
	quit := make(chan os.Signal, 1) // 创建一个接收信号的通道
	// kill 默认会发送 syscall.SIGTERM 信号
	// kill -2 发送 syscall.SIGINT 信号,我们常用的Ctrl+C就是触发系统SIGINT信号
	// kill -9 发送 syscall.SIGKILL 信号,但是不能被捕获,所以不需要添加它
	// signal.Notify把收到的 syscall.SIGINT或syscall.SIGTERM 信号转发给quit
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) // 此处不会阻塞
	<-quit                                               // 阻塞在此,当接收到上述两种信号时才会往下执行
	zap.L().Info("Shutdown Server ...")
	// 创建一个5秒超时的context
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	// 5秒内优雅关闭服务(将未处理完的请求处理完再关闭服务),超过5秒就超时退出
	if err := srv.Shutdown(ctx); err != nil {
		zap.L().Fatal("Server Shutdown", zap.Error(err))
	}

	zap.L().Info("Server exiting")
}
相关推荐
2401_8955213411 分钟前
SpringBoot Maven快速上手
spring boot·后端·maven
disgare26 分钟前
关于 spring 工程中添加 traceID 实践
java·后端·spring
ictI CABL32 分钟前
Spring Boot与MyBatis
spring boot·后端·mybatis
小江的记录本2 小时前
【Linux】《Linux常用命令汇总表》
linux·运维·服务器·前端·windows·后端·macos
yhole5 小时前
springboot三层架构详细讲解
spring boot·后端·架构
香香甜甜的辣椒炒肉5 小时前
Spring(1)基本概念+开发的基本步骤
java·后端·spring
白毛大侠6 小时前
Go Goroutine 与用户态是进程级
开发语言·后端·golang
ForteScarlet6 小时前
从 Kotlin 编译器 API 的变化开始: 2.3.20
android·开发语言·后端·ios·开源·kotlin
大阿明7 小时前
SpringBoot - Cookie & Session 用户登录及登录状态保持功能实现
java·spring boot·后端
Binary-Jeff7 小时前
Spring 创建 Bean 的关键流程
java·开发语言·前端·spring boot·后端·spring·学习方法