Bagaimanakah saya boleh mengemas kini pengendali secara dinamik dalam HTTP mux Go tanpa memulakan semula pelayan?

Susan Sarandon
Lepaskan: 2024-11-01 05:24:02
asal
985 orang telah melayarinya

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

Pengendali Mengemas Kini Secara Dinamik dalam HTTP Mux Go

Dalam aplikasi web, selalunya wajar untuk mengubah suai atau menggantikan laluan tanpa perlu memulakan semula pelayan. Walaupun tiada sokongan terbina dalam untuk ini dalam http.NewServeMux Go atau Gorilla's mux.Router, adalah mungkin untuk melaksanakannya menggunakan struktur tersuai.

Struktur Pengendali Tersuai

Penyelesaiannya melibatkan mencipta struktur Pengendali tersuai yang merangkumi kedua-dua fungsi pengendali dan bendera Didayakan:

<code class="go">type Handler struct {
    http.HandlerFunc
    Enabled bool
}</code>
Salin selepas log masuk

Peta Pengendali

Peta pengendali digunakan untuk menyimpan pengendali tersuai yang dikaitkan dengan corak laluan yang berbeza:

<code class="go">type Handlers map[string]*Handler</code>
Salin selepas log masuk

Pengendali HTTP

Pengendali HTTP tersuai dilaksanakan untuk menyemak sama ada pengendali didayakan untuk laluan URL yang diberikan :

<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>
Salin selepas log masuk

Menyepadukan dengan Mux

Pengendali tersuai boleh disepadukan dengan http.NewServeMux atau mux.Router dengan melaksanakan kaedah HandleFunc:

<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>
Salin selepas log masuk

Contoh

Berikut ialah contoh yang melumpuhkan pengendali secara dinamik selepas permintaan pertama:

<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>
Salin selepas log masuk

Kesimpulan

Menggunakan pengendali tersuai, anda boleh mendayakan dan melumpuhkan laluan secara dinamik dalam HTTP mux Go tanpa memulakan semula pelayan. Ini memberikan lebih fleksibiliti dan kawalan ke atas gelagat aplikasi serta boleh menyelaraskan tugas pembangunan dan penyelenggaraan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh mengemas kini pengendali secara dinamik dalam HTTP mux Go tanpa memulakan semula pelayan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!