golang优雅重启

go 刘宇帅 6年前 阅读量: 2487

目的

  1. 不关闭现在的链接
  2. 启用新的代码并处理新的请求
  3. 中间不能出现拒绝服务

流程

  1. 替换可执行程序
  2. 发送 SIGUSR2 信号
  3. 停止老进程继续接受新请求,并在处理完已有请求后停止
  4. 启动新的进程并接受新请求

实现

我根据上面要求写了一个简单的库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)
    }

}

提示

功能待开通!


暂无评论~