>백엔드 개발 >Golang >golang에서 http 서비스를 정상적으로 종료하는 방법 분석

golang에서 http 서비스를 정상적으로 종료하는 방법 분석

PHPz
PHPz원래의
2023-04-11 10:43:281342검색

Golang은 효율적인 동시 처리 기능과 뛰어난 성능을 갖춘 매우 인기 있는 프로그래밍 언어입니다. 나는 많은 golang 개발자들이 golang에서 http 서비스를 정상적으로 종료하는 방법과 같은 문제에 직면할 것이라고 믿습니다.

우선, http 서비스를 만드는 데 몇 줄의 코드만 있으면 비교적 쉽다는 점을 알아야 합니다. 예를 들어 간단한 예는 다음과 같습니다.

package main

import (
    "fmt"
    "net/http"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello")
    })
    http.ListenAndServe(":8080", nil)
}

여기서 새로운 http 서비스를 만들고 로컬 포트 ​​8080을 수신하며 액세스할 때마다 "Hello"를 반환합니다. 하지만 이 서비스를 정상적으로 종료하는 방법은 무엇입니까?

일반적인 방법은 os.Signal을 사용하여 서비스의 수명주기를 관리하는 것입니다. os.Signal은 프로그램 실행을 종료하도록 요구하기 위해 운영 체제에서 Ctrl+C 등과 같은 프로세스로 보내는 인터럽트 신호입니다. golang에서는 이러한 신호를 수신한 다음 신호를 수신한 후 일부 후크 기능을 실행하여 http 서비스를 정상적으로 종료할 수 있습니다.

구체적인 구현은 다음과 같습니다.

package main

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "os/signal"
    "syscall"
    "time"
)

func main() {
    http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprintln(w, "Hello")
    })
    srv := &http.Server{Addr: ":8080"}

    signalChan := make(chan os.Signal, 1)
    signal.Notify(signalChan, syscall.SIGINT, syscall.SIGTERM)

    go func() {
        sig := <-signalChan
        fmt.Printf("Signal Received: %s,  Gracefully shutting down...\n", sig)
        ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
        defer cancel()
        srv.Shutdown(ctx)
    }()

    fmt.Println("Server starting...")
    if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
        fmt.Printf("server start failed, err: %v\n", err)
        return
    }

    fmt.Println("Server closed.")
}

signal.Notify 메소드를 통해 두 개의 신호, 즉 Ctrl+C와 kill을 등록했습니다. 그런 다음 주 함수의 무한 루프를 통해 신호가 도착할 때까지 기다립니다. 신호가 도착하면 먼저 신호를 성공적으로 수신했음을 나타내는 로그 줄을 인쇄한 다음 http.Server의 Shutdown() 메서드를 호출하여 http 서비스를 정상적으로 종료합니다. 문맥.

http.Server의 Shutdown() 메소드에 context.Context 객체를 전달하면 http 서비스는 단계적 종료 프로세스에 들어갑니다. Shutdown() 메소드의 구체적인 프로세스는 다음과 같습니다.

  1. 즉시 반환됩니다. 모든 활성 연결에 대해 ErrServerClosed.
  2. 모든 활성 연결에 대해 Shutdown을 호출합니다.
  3. 서버 리스너에서 Shutdown을 호출합니다.
  4. 서버와 관련된 모든 고루틴이 완료될 때까지 기다립니다.

즉, Shutdown() 메서드가 실행된 후 호출되면 모든 활성 연결이 즉시 닫히고 새 연결 요청도 금지됩니다. 그런 다음 Shutdown() 메서드는 모든 활성 연결의 Shutdown() 메서드를 호출하여 연결을 닫으므로 모든 연결이 정상적으로 닫혔는지 확인할 수 있습니다. 마지막으로 Shutdown() 메서드는 http 서버를 닫습니다. 종료가 완료된 후 프로그램이 종료됩니다.

이 우아한 종료 방법을 통해 HTTP 서비스가 종료될 때 처리 중인 요청에 영향을 미치지 않도록 할 수 있습니다. HTTP 요청을 완료할 때 Ctrl+C를 호출하더라도 HTTP 성능에 영향을 주지 않습니다. 연결. 그렇게 하면 우리 프로그램이 더욱 강력하고 안정적이게 되어 프로덕션 환경에서 사용하기에 이상적이게 됩니다.

물론, 이는 golang이 http 서비스를 정상적으로 종료하는 예일 뿐입니다. 실제 환경에 따라 수정하시면 됩니다.

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

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