Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Cara melaksanakan pengehadan semasa permintaan penghalaan dalam bahasa Go

Cara melaksanakan pengehadan semasa permintaan penghalaan dalam bahasa Go

PHPz
PHPzasal
2023-12-17 18:57:401101semak imbas

Cara melaksanakan pengehadan semasa permintaan penghalaan dalam bahasa Go

Cara melaksanakan pengehadan semasa permintaan penghalaan dalam bahasa Go

Dengan pembangunan aplikasi web dan peningkatan bilangan pengguna, bilangan permintaan ke pelayan juga akan meningkat. Untuk memastikan kestabilan dan prestasi pelayan, kami perlu mengehadkan aliran permintaan. Pengehadan semasa boleh mengawal bilangan permintaan dengan berkesan dan mengelakkan ranap pelayan atau kemerosotan prestasi. Dalam bahasa Go, anda boleh menggunakan perpustakaan gomodule untuk melaksanakan pengehadan aliran permintaan penghalaan. Berikut akan memperkenalkan cara menggunakan perpustakaan gomodule untuk melaksanakan pengehadan aliran permintaan penghalaan, dan melampirkan contoh kod yang sepadan.

  1. Memperkenalkan perpustakaan gomodule
    Pertama, kita perlu memperkenalkan perpustakaan gomodule ke dalam program Go. Perpustakaan boleh diperolehi menggunakan arahan go get, iaitu seperti berikut:

    go get -u github.com/juju/ratelimit
  2. Melaksanakan penghad kadar permintaan
    Seterusnya, kita perlu melaksanakan pengehad kadar permintaan. Penghad permintaan ialah struktur seperti pemasa yang digunakan untuk mengehadkan kekerapan permintaan. Kita boleh menggunakan pakej ratelimit dalam perpustakaan gomodule untuk melaksanakan pengehad kadar permintaan. Kod sampel adalah seperti berikut:

    package main
    
    import (
     "fmt"
     "time"
    
     "github.com/juju/ratelimit"
    )
    
    func main() {
     // 设置每秒钟可以处理的请求数
     limit := ratelimit.NewBucket(time.Second, 10)
    
     // 模拟处理请求
     for i := 0; i < 20; i++ {
         // 获取当前时间
         startTime := time.Now()
    
         // 尝试获取一个请求令牌
         limit.Wait(1)
    
         // 处理请求
         fmt.Printf("Processing request %d
    ", i)
    
         // 计算处理时间
         elapsedTime := time.Since(startTime)
         fmt.Printf("Processing time: %dms
    ", elapsedTime.Milliseconds())
     }
    }

Dalam kod sampel di atas, kami mencipta pengehad permintaan yang boleh mengendalikan 10 permintaan sesaat melalui fungsi ratelimit.NewBucket. Kemudian, kami mensimulasikan pemprosesan 20 permintaan dan melaksanakan pengehadan semasa permintaan melalui kaedah had.Tunggu(1). Sebelum setiap permintaan diproses, kami menggunakan time.Now() untuk mendapatkan masa semasa, dan kemudian mengira masa pemprosesan selepas memproses permintaan.

  1. Gunakan pengehad permintaan dalam penghalaan
    Dalam aplikasi web sebenar, kami biasanya menggunakan penghalaan untuk mengendalikan permintaan. Berikut ialah contoh kod penghalaan menggunakan pengehad permintaan:

    package main
    
    import (
     "fmt"
     "net/http"
     "time"
    
     "github.com/juju/ratelimit"
    )
    
    func rateLimitMiddleware(next http.HandlerFunc, limit *ratelimit.Bucket) http.HandlerFunc {
     return func(w http.ResponseWriter, r *http.Request) {
         startTime := time.Now()
    
         // 尝试获取一个请求令牌
         limit.Wait(1)
    
         // 计算处理时间
         elapsedTime := time.Since(startTime)
         fmt.Printf("Processing time: %dms
    ", elapsedTime.Milliseconds())
    
         // 调用下一个处理器
         next(w, r)
     }
    }
    
    func helloHandler(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintln(w, "Hello, world!")
    }
    
    func main() {
     // 创建请求限流器
     limit := ratelimit.NewBucket(time.Second, 10)
    
     // 创建路由器
     mux := http.NewServeMux()
    
     // 添加路由处理函数,并使用请求限流器中间件
     mux.HandleFunc("/", rateLimitMiddleware(helloHandler, limit))
    
     // 启动HTTP服务器
     http.ListenAndServe(":8080", mux)
    }

Dalam kod contoh di atas, kami mula-mula membuat had pengehad permintaan. Kemudian, kami mencipta mux penghala dan menambahkan penghad kadar permintaan middleware rateLimitMiddleware pada fungsi pemprosesan laluan helloHandler. Sebelum memproses setiap permintaan, perisian tengah akan menunggu token permintaan untuk melaksanakan pengehadan aliran permintaan. Akhir sekali, kami memulakan pelayan HTTP menggunakan fungsi http.ListenAndServe.

Dengan menggunakan perpustakaan gomodule, kami boleh melaksanakan pengehadan aliran permintaan penghalaan dengan mudah. Dengan cara ini, kami boleh mengawal volum permintaan pelayan dengan berkesan dan mengelakkan ranap pelayan atau kemerosotan prestasi. Pada masa yang sama, menggunakan pengehad permintaan boleh membantu kami lebih memahami beban pelayan dan mengoptimumkan prestasi sistem.

Atas ialah kandungan terperinci Cara melaksanakan pengehadan semasa permintaan penghalaan dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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