首頁  >  文章  >  後端開發  >  如何動態變更 Golang HTTP 伺服器中的 Mux 處理程序?

如何動態變更 Golang HTTP 伺服器中的 Mux 處理程序?

Patricia Arquette
Patricia Arquette原創
2024-10-31 15:21:02210瀏覽

How Can I Dynamically Change Mux Handlers in Golang HTTP Servers?

如何動態更改Golang HTTP 伺服器中的Mux 處理程序

在Go 中,http.ServeMux 和Gorilla 的mux.Router多功能的處理工具HTTP 路由。但是,沒有內建機制可以在不重新啟動應用程式的情況下修改與現有路由關聯的處理函數。

可能的解決方案:

選項1 :具有啟用/停用標誌的自訂處理程序包裝器

此方法涉及建立嵌入實際處理程序函數並包含啟用標誌的自訂處理程序類型。然後可以將自訂處理程序新增至 mux,如果該標誌設為 true,它將為該處理程序提供服務。

<code class="go">type Handler struct {
    http.HandlerFunc
    Enabled bool
}

type Handlers map[string]*Handler

// Implementation of ServeHTTP that checks if the handler is enabled
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>

然後,您可以將此自訂處理程序類型與 http.ServeMux 或 gorilla/mux 一起使用動態啟用或停用路由。

http.ServeMux 例:

<code class="go">mux := http.NewServeMux()
handlers := Handlers{}

handlers.HandleFunc(mux, "/", func(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("this will show once"))
    handlers["/"].Enabled = false
})

http.Handle("/", mux)</code>

選項2:帶有URL 黑名單的中間件

,您可以實作中間件,根據停用路由清單檢查請求的URL。如果 URL 與停用的路由匹配,中間件可以阻止處理程序執行並傳回自訂回應。

例如:

<code class="go">func DisableRouteMiddleware(disabledRoutes []string) func(http.Handler) http.Handler {
    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            for _, route := range disabledRoutes {
                if r.URL.Path == route {
                    http.Error(w, "Disabled", http.StatusNotFound)
                    return
                }
            }
            next.ServeHTTP(w, r)
        })
    }
}</code>

然後您可以使用此中間件在將所有處理程序添加到 mux 之前對其進行包裝。

這兩種方法都允許您在應用程式中動態停用或啟用路由,而無需重新啟動。選擇使用哪個選項取決於您的特定要求以及所需的靈活性等級。

以上是如何動態變更 Golang HTTP 伺服器中的 Mux 處理程序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn