gin: 优雅退出(退出前结束要执行的工作)

一,需求说明:

我们的go程序的访问日志用了zap的BufferedWriteSyncer,
默认一分钟后写入到磁盘,如果这时候go应用发生意外退出,
则日志可能不能落盘,
所以gin退出前,要把未执行的工作先结束才行

二,代码例子:

package main

import "C"
import (
    "fmt"
    "imagebank/global"
    "imagebank/routes"
    "os"
    "os/signal"
    "syscall"

    "time"
)


// 入口函数
func main() {

    //记录启动时间
    global.AppStartTime = time.Now()
    //日志初始化
    global.SetupAccessLogger()
    //数据库连接初始化
    global.SetupDBLink()

    defer global.LoggerAccess.Sync()
    defer global.LogFileAccess.Close()

    //引入路由
    r := routes.Routes()

    // r.Run(":8080")


    // 异步
    go func() {
        //run
        r.Run(":8080")
    }()

    // 如果想要接收到信号
    quit := make(chan os.Signal)
    // sigint 是有 CTRL+C 触发,进程可以捕获信号,并进行处理,
    // SIGTERM是有 kill 命令触发,进程可以捕获信号,并进行处理,
    // SIGKILL是有 kill -9 命令触发,进程无法捕获。
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
    fmt.Println("开始关闭gin server...")
    // 处理后续逻辑
    global.LoggerAccess.Sync()
    global.LogFileAccess.Close()
   

}

三,测试效果:

kill进程id

[GIN] 2025/02/20 - 11:36:42 | 200 |     357.652µs |   192.168.219.1 | GET      "/image/list?a=1&bc=2&c=aaa"
开始关闭gin server...

用CTRL+C中断

[GIN] 2025/02/20 - 11:31:10 | 200 |     285.987µs |   192.168.219.1 | GET      "/image/list?a=1&bc=2&c=aaa"
^C开始关闭gin server...

 

posted @ 2025-02-23 17:37  刘宏缔的架构森林  阅读(134)  评论(0)    收藏  举报