适用于初学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")
}
相关推荐
ღ᭄ꦿ࿐Never say never꧂5 分钟前
微服务架构中的负载均衡与服务注册中心(Nacos)
java·spring boot·后端·spring cloud·微服务·架构·负载均衡
.生产的驴14 分钟前
SpringBoot 消息队列RabbitMQ 消息确认机制确保消息发送成功和失败 生产者确认
java·javascript·spring boot·后端·rabbitmq·负载均衡·java-rabbitmq
海里真的有鱼22 分钟前
Spring Boot 中整合 Kafka
后端
布瑞泽的童话28 分钟前
无需切换平台?TuneFree如何搜罗所有你爱的音乐
前端·vue.js·后端·开源
写bug写bug38 分钟前
6 种服务限流的实现方式
java·后端·微服务
离开地球表面_991 小时前
索引失效?查询结果不正确?原来都是隐式转换惹的祸
数据库·后端·mysql
Victor3561 小时前
Oracle(138)如何监控数据库性能?
后端
不修×蝙蝠2 小时前
eclipse使用 笔记02
前端·笔记·后端·eclipse
吃面不喝汤664 小时前
Flask + Swagger 完整指南:从安装到配置和注释
后端·python·flask
讓丄帝愛伱5 小时前
spring boot启动报错:so that it conforms to the canonical names requirements
java·spring boot·后端