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...
浙公网安备 33010602011771号