Rumah > pembangunan bahagian belakang > Golang > Apakah itu Penghad Kadar dan Mengapa Menggunakannya?

Apakah itu Penghad Kadar dan Mengapa Menggunakannya?

Mary-Kate Olsen
Lepaskan: 2025-01-08 06:36:40
asal
877 orang telah melayarinya

Sistem web sering menghadapi cabaran banyak permintaan pelanggan dalam jangka masa yang singkat. Ini boleh mengatasi pelayan, yang membawa kepada kelembapan atau kegagalan. penghad kadar menyelesaikan masalah ini secara elegan dengan mengawal kekerapan permintaan daripada setiap pelanggan. Ia bertindak sebagai penjaga pintu, menyekat API atau panggilan perkhidmatan dalam tetingkap masa tertentu.

Mengapa Melaksanakan Pengehadan Kadar?

Penghadan kadar menawarkan beberapa faedah penting:

  1. Pencegahan Penyalahgunaan: Mengurangkan permintaan yang berlebihan atau berniat jahat, seperti serangan denial-of-service (DoS), menghalang beban sistem.

  2. Pengurusan Sumber: Memastikan peruntukan sumber yang cekap, menghalang satu pelanggan daripada memonopoli sumber pelayan dan memberi kesan kepada orang lain.

  3. Peningkatan Prestasi: Mengekalkan responsif aplikasi walaupun di bawah beban trafik yang tinggi dengan menghalang permintaan banjir.

  4. Pengalaman Pengguna yang Dipertingkat: Menghalang penguncian pengguna atau penurunan prestasi akibat permintaan yang berlebihan.

  5. Pengukuhan Keselamatan: Membantu menghalang serangan kekerasan atau percubaan eksploitasi dengan mengehadkan kadar permintaan.

Pelaksanaan Praktikal Go dengan Chi

Mari kita periksa pelaksanaan Go menggunakan pakej penghalaan Chi yang popular dan pakej golang.org/x/time/rate (yang menggunakan algoritma Token Bucket). Contoh ini menggunakan http.Handler untuk mengawal kadar permintaan pelanggan.

<code class="language-go">package main

import (
    "encoding/json"
    "net/http"
    "strings"
    "time"

    "github.com/go-chi/chi"
    "golang.org/x/time/rate"
)

func main() {
    r := chi.NewRouter()

    // Globally limits to 5 requests per second with a burst of 10
    r.Use(RateLimiter(rate.Limit(5), 10, 1*time.Second))

    // Test route
    r.Get("/", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Request successful"))
    })

    http.ListenAndServe(":3000", r)
}

// RateLimiter middleware
func RateLimiter(limit rate.Limit, burst int, waitTime time.Duration) func(next http.Handler) http.Handler {
    limiterMap := make(map[string]*rate.Limiter)
    lastRequestMap := make(map[string]time.Time)

    return func(next http.Handler) http.Handler {
        return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
            ip := strings.Split(r.RemoteAddr, ":")[0]

            limiter, exists := limiterMap[ip]
            if !exists {
                limiter = rate.NewLimiter(limit, burst)
                limiterMap[ip] = limiter
            }

            lastRequestTime, lastRequestExists := lastRequestMap[ip]
            if lastRequestExists && time.Since(lastRequestTime) < waitTime {
                //Handle exceeding rate limit
                http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
                return
            }

            if !limiter.Allow() {
                http.Error(w, http.StatusText(http.StatusTooManyRequests), http.StatusTooManyRequests)
                return
            }

            lastRequestMap[ip] = time.Now()
            next.ServeHTTP(w, r)
        })
    }
}</code>
Salin selepas log masuk
  • Letusan: Membenarkan letusan singkat permintaan yang melebihi kadar purata.

Melebihi had kadar mengakibatkan ralat 429 (Too Many Requests).

What is Rate Limiter and Why Use It?

Strategi Mengehadkan Kadar

Beberapa kaedah wujud untuk mengenal pasti dan mengehadkan penggunaan pelanggan:

  1. Berasaskan IP: Hadkan permintaan daripada alamat IP tertentu. Mudah tetapi tidak berkesan pada rangkaian kongsi (NAT).

  2. Berasaskan Token Pengesahan: Menjejaki permintaan berdasarkan token pengesahan (JWT, OAuth). Lebih berbutir tetapi memerlukan pengesahan.

  3. Berasaskan ID Pelanggan: Menggunakan ID pelanggan unik (kunci API). Berkesan untuk penyepaduan perkhidmatan tetapi terdedah jika kunci terjejas.

  4. Sesi Setiap Pengguna: Hadkan permintaan berdasarkan pengecam sesi unik. Memfokuskan pada pengalaman pengguna individu.

  5. Berasaskan Laluan/Titik Akhir: Mengehadkan permintaan kepada titik akhir trafik tinggi tertentu. Bergabung dengan baik dengan kaedah lain.

Contohnya menggunakan alamat IP untuk kesederhanaan, sesuai untuk API awam atau aplikasi tanpa pengesahan berasaskan token.

Kesimpulan

Penghadan kadar adalah penting untuk keselamatan aplikasi, kestabilan dan pengalaman pengguna. Contoh ini menunjukkan pelaksanaan yang praktikal dan cekap menggunakan Go dan Chi. Ia merupakan teknik kritikal untuk melindungi daripada penyalahgunaan dan memastikan pengagihan sumber yang adil.

Pautan

Catatan Blog

Repositori Contoh

Atas ialah kandungan terperinci Apakah itu Penghad Kadar dan Mengapa Menggunakannya?. 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