golang 优雅关闭服务

作者: adm 分类: go 发布时间: 2023-10-16

一、什么是优雅关闭服务
先把在执行的任务执行完成,再关闭服务,防止中断服务造成程序错误,数据异常等影响。

二、使用函数
语法:


func (srv *Server) Shutdown(ctx context.Context) error

作用: Shutdown优雅地关闭服务器,而不会中断任何活动连接。

工作原理: 首先关闭所有打开的侦听器,然后关闭所有空闲连接,然后无限期地等待连接恢复空闲状态,然后关闭。 如果提供的上下文在关闭完成之前过期,shutdown将返回上下文的错误,否则将返回关闭服务器底层侦听器返回的任何错误。

三、使用案例
例:

package main

import (
	"context"
	"log"
	"net/http"
	"os"
	"os/signal"
	"time"
	"syscall"

	"github.com/gin-gonic/gin"
)

func main() {
	router := gin.Default()
	router.GET("/", func(c *gin.Context) {
		time.Sleep(5 * time.Second)
		c.String(http.StatusOK, "Welcome Gin Server")
	})

	srv := &http.Server{
		Addr:    ":8080",
		Handler: router,
	}

	go func() {
		// 服务连接
		if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
			log.Fatalf("listen: %s\n", err)
		}
	}()

	// 创建一个无缓冲通道
	quit := make(chan os.Signal)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGHUP, syscall.SIGTERM)
	
	// 在未接受到信号时,通道发生阻塞。
	<-quit
	
	log.Println("Shutdown Server ...")

	// 等待中断信号以优雅地关闭服务器(设置 5 秒的超时时间)
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()
	
	// 执行关闭服务操作
	if err := srv.Shutdown(ctx); err != nil {
		log.Fatal("Server Shutdown:", err)
	}
	
	log.Println("Server exiting")
}

如果觉得我的文章对您有用,请随意赞赏。您的支持将鼓励我继续创作!