ホームページ  >  記事  >  バックエンド開発  >  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.ListenAndServe() 関数を使用して HTTP サーバーを起動します。この関数は、プログラムが強制終了されるか、サーバーがシャットダウンされるまで実行されます。プログラムを閉じるだけでは、HTTP サーバーはすぐに実行を停止します。ただし、この方法は正常なシャットダウンではありません。処理中のクライアントが強制的に切断され、データの損失や例外が発生する可能性があります。

閉じる別の方法は、サーバー コンテキスト (context) の 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) goroutine を使用して 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. 概要

この記事では、Golang で HTTP サーバーを正常にシャットダウンする方法を紹介します。 http.Server の Shutdown() メソッドを使用して、HTTP サーバーを正常にシャットダウンし、強制切断によるデータ損失や例外を回避します。

クライアントとサーバーによって処理中の接続がすでにある場合、サーバーのシャットダウンは、正常に閉じる前にこれらの接続が処理されるまで待つ必要があることに注意してください。したがって、完全なシャットダウンをより確実にするために、 context.WithTimeout() を使用して、Shutdown() メソッドを呼び出す前に、処理中のリクエストが完了するまで待機するタイムアウトを設定できます。

この記事が、Golang 開発者が HTTP サーバーを開発する際に役立つことを願っています。

以上がGolang で HTTP サーバーを正常にシャットダウンする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。