golang优雅重启
go 刘宇帅 7年前 阅读量: 3075
目的
- 不关闭现在的链接
 - 启用新的代码并处理新的请求
 - 中间不能出现拒绝服务
 
流程
- 替换可执行程序
 - 发送 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)
    }
}