[재인쇄] Gin 프레임워크가 정상적으로 종료됨

재인쇄: https://juejin.cn/post/7212786062224146487

Gin은 유지 관리가 쉬운 고성능 웹 애플리케이션을 구축하는 데 자주 사용되는 매우 인기 있는 웹 프레임워크입니다. 또한 DDD(Domain-Driven Design) 및 마이크로서비스에서도 널리 사용됩니다. 그러나 다른 응용 프로그램과 마찬가지로 Gin
웹 서비스를 중지해야 하는 경우 비정상적이거나 불규칙한 서비스 종료를 방지하기 위해 연결 종료 및 메모리 해제와 같은 문제를 처리해야 합니다. 이 기사에서는 Gin 프레임워크를 사용하여 정상적으로 종료하는 방법을 소개합니다.

우아한 퇴장의 원칙

Golang 웹 서비스를 중지하는 전통적인 방법은 TCP 연결을 닫는 API를 호출하는 것입니다. 문제는 현재 요청이 HTTP 요청을 처리하는 경우 go 코루틴이 종료되지 않았기 때문에 종료되어 일부 리소스 누수 및 기타 문제가 발생한다는 것입니다.
정상적으로 중지하는 방법은 시스템 신호(예: ctrl+c)를 수신한 후 지정된 HTTP 서버를 닫고 활성 연결(권고 TCP 닫기)이 요청된 모든 데이터 교환을 완료하고 연결을 끊을 때까지 기다리는 것입니다. 이렇게 하면 각 클라이언트를 제대로 종료할 수 있습니다.

Gin 프레임워크가 정상적으로 종료됩니다.

Gin 프레임워크는 서버 인터페이스를 제공하므로 Gin 애플리케이션에서 우아한 종료를 보다 쉽게 ​​구현할 수 있습니다. 이 애플리케이션에서는 중지 신호를 수신할 때 Shutdown(duration) 메서드를 사용하여 HTTP 서버를 안전하게 중지할 수 있습니다.
다음은 정상적으로 종료하는 방법을 보여주는 간단한 Gin 애플리케이션입니다.

package main

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

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

func main() {
    
    
	r := gin.Default()

	r.GET("/", func(c *gin.Context) {
    
    
		time.Sleep(time.Second * 5)
		c.JSON(http.StatusOK, gin.H{
    
    "message": "Hello, World!"})
	})

	//创建HTTP服务器
	server := &http.Server{
    
    
		Addr:    ":8080",
		Handler: r,
	}

	//启动HTTP服务器
	go func() {
    
    
		if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
    
    
			log.Fatalf("listen: %s\n", err)
		}
	}()

	//等待一个INT或TERM信号
	quit := make(chan os.Signal)
	signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
	<-quit
	log.Println("Shutdown Server ...")

	//创建超时上下文,Shutdown可以让未处理的连接在这个时间内关闭
	ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
	defer cancel()

	//停止HTTP服务器
	if err := server.Shutdown(ctx); err != nil {
    
    
		log.Fatal("Server Shutdown:", err)
	}

	log.Println("Server exiting")
}

위의 예에서 우리는 Gin 애플리케이션을 생성하고 HTTP 서버를 시작하여 클라이언트의 HTTP 요청을 처리하는 기본 기능을 정의했습니다.
여기서 가장 중요한 것은 컨텍스트 컨텍스트를 사용하고 HTTP 서버를 정상적으로 종료하기 위해 5초 동안 대기하는 Shutdown()입니다. Shutdown 메서드는 HTTP 서버를 안전하게 종료하려고 시도하고 시간 초과 동안 연결을 재배치하기 위한 HTTP 요청을 기다립니다.
보시다시피 콜백 함수는 대기 신호에 걸려 있습니다. 이후 SIGTERM 또는 SIGINT 신호를 참조하여 종료가 발생합니다. 이로 인해 프로그램은 서버 종료에 대한 정보를 출력하고 Shutdown을 호출하여 정상적인 종료를 위해 서버를 안전하게 종료합니다.

결론적으로

이 기사에서 우리는 Gin 프레임워크가 어떻게 우아한 종료를 달성하는지 살펴보았습니다. 서비스를 중지할 때 클라이언트 협상과의 적절한 상호 작용을 보장하면서 리소스 누수를 방지하기 위해 모든 연결을 닫고 닫을 때 정리해야 합니다. 이 전체 코드에서는 SIGTERM 및 SIGINT 신호를 사용하여 운영 체제의 편리한 catcher 콜백에서 웹 서버를 중지하고 시간 제한 컨텍스트를 사용하여 지정된 시간 후에 정상적으로 종료합니다.
참고: 실제 애플리케이션에서는 시간 제한 컨텍스트와 같은 더 엄격한 컨텍스트를 사용하여 서버를 종료하기 전에 모든 요청이 처리되도록 해야 합니다.

Guess you like

Origin blog.csdn.net/xjmtxwd24/article/details/132006115