サーバーを再起動せずに、Go の HTTP マルチプレクサのハンドラーを動的に更新するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-01 05:24:02
オリジナル
985 人が閲覧しました

How can I dynamically update handlers in Go's HTTP mux without restarting the server?

Go の HTTP Mux でのハンドラーの動的更新

Web アプリケーションでは、サーバーを再起動せずにルートを変更または置換することが望ましいことがよくあります。 Go の http.NewServeMux や Gorilla の mux.Router にはこれに対する組み込みサポートはありませんが、カスタム構造を使用してこれを実装することは可能です。

カスタム ハンドラー構造

解決策には、ハンドラー関数と Enabled フラグの両方をカプセル化するカスタム ハンドラー構造を作成することが含まれます。

<code class="go">type Handler struct {
    http.HandlerFunc
    Enabled bool
}</code>
ログイン後にコピー

ハンドラー マップ

ハンドラーのマップは、ハンドラーのマップを保存するために使用されます。さまざまなルート パターンに関連付けられたカスタム ハンドラー:

<code class="go">type Handlers map[string]*Handler</code>
ログイン後にコピー

HTTP ハンドラー

カスタム HTTP ハンドラーは、指定された URL パスに対してハンドラーが有効かどうかを確認するために実装されています。 :

<code class="go">func (h Handlers) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    path := r.URL.Path
    if handler, ok := h[path]; ok &amp;&amp; handler.Enabled {
        handler.ServeHTTP(w, r)
    } else {
        http.Error(w, "Not Found", http.StatusNotFound)
    }
}</code>
ログイン後にコピー

Mux との統合

カスタム ハンドラーは、HandleFunc メソッドを実装することで http.NewServeMux または mux.Router と統合できます:

<code class="go">func (h Handlers) HandleFunc(mux HasHandleFunc, pattern string, handler http.HandlerFunc) {
    h[pattern] = &amp;Handler{handler, true}
    mux.HandleFunc(pattern, h.ServeHTTP)
}</code>
ログイン後にコピー

最初のリクエストの後にハンドラーを動的に無効にする例を次に示します:

<code class="go">package main

import (
    "fmt"
    "net/http"
)

func main() {
    mux := http.NewServeMux()
    handlers := Handlers{}
    handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) {
        fmt.Fprint(w, "Welcome!")
        handlers["/"].Enabled = false
    })
    http.Handle("/", mux)
    http.ListenAndServe(":9020", nil)
}</code>
ログイン後にコピー

結論

カスタム ハンドラーを使用すると、サーバーを再起動せずに、Go の HTTP マルチプレクサ内のルートを動的に有効または無効にすることができます。これにより、アプリケーションの動作に対する柔軟性と制御が向上し、開発とメンテナンスのタスクを合理化できます。

以上がサーバーを再起動せずに、Go の HTTP マルチプレクサのハンドラーを動的に更新するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!