>  기사  >  백엔드 개발  >  Golang에서 HTTP 서버를 정상적으로 종료하는 방법

Golang에서 HTTP 서버를 정상적으로 종료하는 방법

PHPz
PHPz원래의
2023-03-22 14:23:502198검색

Golang(Go라고도 함)은 백엔드 서비스 및 API 개발에 널리 사용되는 비교적 젊은 프로그래밍 언어입니다. HTTP는 일반적으로 사용되는 프로토콜이며 많은 Golang 개발자는 Golang과 함께 제공되는 HTTP 패키지를 사용하여 HTTP 서버를 개발할 것입니다. 그러나 HTTP 서버를 종료해야 할 때 몇 가지 문제가 발생합니다. 이 글에서는 Golang에서 HTTP 서버를 정상적으로 종료하는 방법을 설명하겠습니다.

  1. HTTP 서버를 종료하는 방법

Golang에서는 일반적으로 HTTP 서버를 시작하기 위해 http.ListenAndServe() 함수를 사용합니다. 이 함수는 프로그램이 종료되거나 서버가 종료될 때까지 실행됩니다. 단순히 프로그램을 닫으면 HTTP 서버는 즉시 실행을 중지합니다. 그러나 이 방법은 처리 중인 클라이언트의 연결을 강제로 끊어 데이터 손실이나 예외가 발생할 수 있으므로 정상적인 종료가 아닙니다.

닫는 또 다른 방법은 서버 컨텍스트의 Done() 메서드를 사용하는 것입니다. Done() 메서드를 호출하면 HTTP 서버는 적절하게 종료되고 새 클라이언트 연결 수락을 중지하지만 이미 수락된 일부 연결은 계속 처리합니다. 이로 인해 처리 중인 클라이언트 연결이 강제로 실행되지는 않지만 여전히 일부 요청이 응답하지 않을 수 있습니다.

마지막으로 http.Server 구조에서 Shutdown() 메서드를 사용하여 종료하는 우아한 방법이 있습니다. 이 방법은 서버를 종료하기 전에 처리 중인 요청이 완료될 때까지 기다려 HTTP 서버를 정상적으로 종료합니다.

  1. HTTP 서버의 정상적인 종료 구현

HTTP 서버를 시작하기 위해 다음 코드를 작성했다고 가정합니다.

package main

import (
    "log"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello World!"))
    })

    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

이제 프로그램이 종료될 때 HTTP 서버를 올바르게 종료해야 합니다. 다음 단계를 수행할 수 있습니다.

1) http.Server 인스턴스를 생성하고 인스턴스의 Handler 속성을 기존 Handler 함수로 설정합니다.

server := http.Server{
    Addr:    ":8080",
    Handler: http.DefaultServeMux,
}

2) 고루틴을 사용하여 http.Server의 ListenAndServe() 메서드를 시작하여 클라이언트 연결 요청을 처리합니다.

go func() {
    if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        log.Fatal(err)
    }
}()

3) 프로그램 종료 시 서버를 안전하게 종료하려면 http.Server의 Shutdown() 메서드를 사용하세요.

// 用于停止 HTTP 服务器的通道
stopChan := make(chan os.Signal)

// 监听 Interrupt 和 Terminate 信号
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM)

// 等待接收到信号,执行 Shutdown()
<-stopChan
log.Println("Shutting down server...")

// 等待处理完成的请求处理完成
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()

if err := server.Shutdown(ctx); err != nil {
    log.Fatal(err)
}

log.Println("Server gracefully stopped.")

이 코드에서는 먼저 운영 체제에서 보낸 인터럽트 또는 종료 신호(예: Ctrl + C)를 수신하는 채널을 만듭니다. 그런 다음 신호가 수신될 때까지 기다리고 Shutdown() 메서드를 실행합니다. Shutdown() 메서드를 호출하기 전에 context.WithTimeout()을 사용하여 지정된 제한 시간 내에 처리 중인 요청이 완료될 때까지 기다리는 컨텍스트(Context)를 생성합니다. Shutdown() 메서드는 모든 요청이 처리된 후 HTTP 서버를 안전하게 종료합니다.

  1. Summary

이 글에서는 Golang에서 HTTP 서버를 정상적으로 종료하는 방법을 소개합니다. http.Server의 Shutdown() 메서드를 사용하면 HTTP 서버를 정상적으로 종료하고 강제 연결 해제로 인한 데이터 손실이나 예외를 방지할 수 있습니다.

클라이언트와 서버에서 이미 처리 중인 연결이 있는 경우 서버를 종료하려면 해당 연결이 처리될 때까지 기다려야 서버가 정상적으로 닫힐 수 있습니다. 따라서 완전한 종료를 보다 확실히 하기 위해 context.WithTimeout()을 사용하여 Shutdown() 메서드를 호출하기 전에 처리 중인 요청이 완료될 때까지 기다리는 시간 제한을 설정할 수 있습니다.

이 글이 Golang 개발자들이 HTTP 서버를 개발하는데 도움이 되기를 바랍니다.

위 내용은 Golang에서 HTTP 서버를 정상적으로 종료하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.