golang优雅重启
go 刘宇帅 3年前 阅读量: 1528
目的
- 不关闭现在的链接
- 启用新的代码并处理新的请求
- 中间不能出现拒绝服务
流程
- 替换可执行程序
- 发送 SIGUSR2 信号
- 停止老进程继续接受新请求,并在处理完已有请求后停止
- 启动新的进程并接受新请求
实现
我根据上面要求写了一个简单的库gracefulServer,可以参考下
比如以gin为例使用该库实现优雅重启,代码如下:
package main
import (
"github.com/gin-gonic/gin"
"time"
"net/http"
"github.com/yushuailiu/gracefulServer"
)
func main() {
route := gin.Default()
route.GET("/", func(context *gin.Context) {
time.Sleep(5*time.Second)
context.String(http.StatusOK, "hello world!")
})
graceful := gracefulServer.NewGraceful()
// add hook before server reload
graceful.AddBeforeStopHook(func() {
println("before stop")
})
// add hook before server reload
graceful.AddAfterReloadHook(func() {
println("after stop")
})
// add hook before server reload
graceful.AddBeforeReloadHook(func() {
println("before reload")
})
// add hook after server reload
graceful.AddAfterReloadHook(func() {
println("after reload")
})
// set the timeout of the old server when use `kill -USR2 [pid]` reload the server。
graceful.SetTimeout(20 * time.Second)
// start the server
err := graceful.ListenAndServer(":8081", route)
if err != nil {
panic(err)
}
}