golang で http サービスを正常にシャットダウンする方法を分析する

PHPz
リリース: 2023-04-11 10:59:13
オリジナル
1318 人が閲覧しました

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 メソッドを通じて 2 つのシグナル、つまり Ctrl C と kill を登録しました。その後、main関数の無限ループでシグナルの到着を待ちます。シグナルが到着すると、まずシグナルを正常に受信したことを示すログの行を出力し、次に http.Server の Shutdown() メソッドを呼び出して http サービスを通常どおりシャットダウンします。コンテキスト。

context.Context オブジェクトを http.Server の Shutdown() メソッドに渡すと、http サービスは正常なシャットダウンのプロセスに入ります。Shutdown() メソッドの具体的なプロセスは次のとおりです。

    ##すべてのアクティブな接続に対して直ちに ErrServerClosed を返します。
  1. すべてのアクティブな接続に対して Shutdown を呼び出します。
  2. サーバーのリスナーに対して Shutdown を呼び出します。
  3. 待機します。サーバーに関連付けられているすべてのゴルーチンを完了します。
つまり、Shutdown() メソッドが呼び出された後、すべてのアクティブな接続が直ちに閉じられ、新しい接続リクエストも禁止されます。次に、Shutdown() メソッドは、すべてのアクティブな接続の Shutdown() メソッドを呼び出して接続を閉じます。これにより、すべての接続が正常に閉じられるようになります。最後に、Shutdown() メソッドによって http サーバーが閉じられ、シャットダウンが完了するとプログラムが終了します。

この正常なシャットダウン メソッドにより、シャットダウン時に http サービスが処理中のリクエストに影響を与えないようにできます。HTTP リクエストの完了時に Ctrl C を呼び出しても、パフォーマンスには影響しません。 HTTP 接続の。そうすることで、プログラムの堅牢性と信頼性が向上し、実稼働環境での使用に最適になります。

もちろん、これは golang が http サービスを正常に終了する例にすぎません。実際の環境に応じて変更できます。この記事があなたのお役に立てば幸いです。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート