Project: HTTP Middleware Rate Limiter
Loyiha: HTTP middleware rate limiter
Endi barcha qismlar tayyor: har-klient token savatlari (Per-Key Rate Limiting), concurrent xavfsizlik (Concurrent-Safe Rate Limiter). Yakuniy qadam — buni haqiqiy backendlarda ishlatiladigan naqshga, middlewarega o'rash: so'rovni haqiqiy handler'ga yetkazishdan oldin uni tekshiradigan "o'rovchi" funksiya.
type Handler func(clientID string) string
func RateLimitMiddleware(limiter *Limiter, next Handler) Handler {
return func(clientID string) string {
if !limiter.Allow(clientID) {
return "429 Too Many Requests"
}
return next(clientID)
}
}Bu — Pointers & Memory kursidagi funksiyani qiymat sifatida uzatish g'oyasining eng yuqori darajadagi qo'llanilishi: RateLimitMiddleware bir Handlerni oladi va yangi Handler qaytaradi — asl handler o'zi rate limiting haqida bilishi shart emas. Bu naqsh ("funksiya oladi, funksiya qaytaradi") haqiqiy Go veb-freymvorklarida (masalan, net/http middleware'lari) aynan shu tarzda ishlaydi, faqat Handler turi odatda http.Handler bo'ladi.
>_ Exercise
Berilgan Limiter (Per-Key Rate Limiting darsidagidek) yordamida Handler funksiya turini (func(clientID string) string) aniqlang. RateLimitMiddleware(limiter *Limiter, next Handler) Handler funksiyasini yozing — u yangi Handler qaytaradi: agar limiter.Allow(clientID) false bo'lsa, "429 Too Many Requests" qaytaradi; aks holda next(clientID)ni chaqirib, uning natijasini qaytaradi.
Stuck? Reveal a hint to help you.
Key Takeaway
Key Takeaway:
Middleware naqshi — funksiyani qabul qilib, uni o'rab turgan yangi funksiyani qaytarish — Go backend dasturlashning eng keng tarqalgan naqshlaridan biri. Rate limiter shu tufayli har qanday handler atrofiga, uning ichki mantig'ini o'zgartirmasdan qo'shilishi mumkin bo'lgan mustaqil, qayta ishlatiladigan qatlamga aylandi.
$ go run main.go
Kodingizni ishga tushiring