Golang arrête le service en douceur

1. Qu'est-ce que l'arrêt progressif du service ?

Terminez d'abord les tâches en cours d'exécution, puis fermez le service pour éviter que l'interruption des services ne provoque des erreurs de programme, des anomalies de données et d'autres effets.

Insérer la description de l'image ici

2. Utiliser les fonctions

grammaire:


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

Fonction : L'arrêt arrête le serveur en douceur sans interrompre les connexions actives.

Comment ça marche : ferme d'abord tous les écouteurs ouverts, puis ferme toutes les connexions inactives, puis attend indéfiniment que les connexions reviennent à l'état inactif, puis se ferme. Si le contexte fourni expire avant la fin de l'arrêt, l'arrêt renverra l'erreur du contexte, sinon toute erreur renvoyée par l'écouteur sous-jacent du serveur d'arrêt sera renvoyée.

3. Cas d'utilisation

exemple:


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")
}

Guess you like

Origin blog.csdn.net/change_any_time/article/details/128978231