速率中介軟體為 Iris Web 框架提供速率限制功能。它允許開發人員控制對其應用程式的請求速率,確保公平使用並防止濫用。中間件基於令牌桶演算法,這是一種流行的限速方法。
要使用費率中間件,您需要將其匯入到您的 Iris 應用程式中:
import "github.com/kataras/iris/v12/middleware/rate"
要使用速率限制器,您需要建立 Iris 應用程式並註冊中間件。以下是如何設定速率限制器的範例:
package main import ( "time" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/middleware/rate" ) func main() { app := iris.New() app.Logger().SetLevel("debug") limit := rate.Limit(1, 5, rate.PurgeEvery(time.Minute, 5*time.Minute)) app.Use(limit) app.Get("/", index) app.Get("/other", other) app.Listen(":8080") } func index(ctx iris.Context) { ctx.HTML("<h1>Index Page</h1>") } func other(ctx iris.Context) { ctx.HTML("<h1>Other Page</h1>") }
此範例允許每秒 1 個請求,最大突發大小為 5。如果舊條目 5 分鐘內沒有出現,它還會每分鐘清除一次。
這個範例示範如何使用速率。每個助手設定速率限制器:
package main import ( "time" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/middleware/rate" ) func main() { app := iris.New() app.Logger().SetLevel("debug") // Use rate.Every helper to set up the rate limiter. limit := rate.Limit(rate.Every(time.Minute), 5) app.Use(limit) app.Get("/", index) app.Get("/other", other) app.Listen(":8080") } func index(ctx iris.Context) { ctx.HTML("<h1>Index Page</h1>") } func other(ctx iris.Context) { ctx.HTML("<h1>Other Page</h1>") }
此範例示範如何設定使用 API 金鑰而不是客戶端遠端 IP 位址的速率限制器:
package main import ( "time" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/middleware/rate" ) func main() { app := iris.New() app.Logger().SetLevel("debug") // Use API key for rate limiting. app.Use(useAPIKey) limit := rate.Limit(rate.Every(time.Minute), 300, rate.PurgeEvery(5*time.Minute, 15*time.Minute)) app.Use(limit) app.Get("/list", list) app.Listen(":8080") } func useAPIKey(ctx iris.Context) { apiKey := ctx.Header("X-API-Key") if apiKey == "" { ctx.StopWithStatus(iris.StatusForbidden) return } rate.SetIdentifier(ctx, apiKey) ctx.Next() } func list(ctx iris.Context) { ctx.JSON(iris.Map{"key": "value"}) }
此範例示範如何設定超出速率限制時執行的自訂處理程序:
package main import ( "time" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/middleware/rate" ) func main() { app := iris.New() app.Logger().SetLevel("debug") // Set a custom exceed handler. limit := rate.Limit(1, 5, rate.ExceedHandler(func(ctx iris.Context) { ctx.StopWithStatus(429) })) app.Use(limit) app.Get("/", index) app.Get("/other", other) app.Listen(":8080") } func index(ctx iris.Context) { ctx.HTML("<h1>Index Page</h1>") } func other(ctx iris.Context) { ctx.HTML("<h1>Other Page</h1>") }
此範例示範如何為每個客戶端儲存自訂資料:
package main import ( "time" "github.com/kataras/iris/v12" "github.com/kataras/iris/v12/middleware/rate" ) func main() { app := iris.New() app.Logger().SetLevel("debug") // Store custom data for each client. limit := rate.Limit(1, 5, rate.ClientData(func(ctx iris.Context) any { return ctx.RemoteAddr() })) app.Use(limit) app.Get("/", index) app.Get("/other", other) app.Listen(":8080") } func index(ctx iris.Context) { ctx.HTML("<h1>Index Page</h1>") } func other(ctx iris.Context) { ctx.HTML("<h1>Other Page</h1>") }
速率限制:rate.Limit 函數用於建立新的速率限制器。它需要三個參數:
令牌桶演算法:此演算法透過維護令牌桶來控制請求速率。每個請求都會消耗一個令牌,並且令牌會以固定的速率添加到桶中。如果儲存桶為空,則請求被拒絕。
令牌桶演算法是一種簡單有效的控制請求速率的方法。其工作原理如下:
更多詳細信息,請參閱維基百科關於令牌桶的文章。
此中間件提供了一種強大且靈活的方法來在 Iris 應用程式中實現速率限制。透過使用令牌桶演算法,確保公平使用並防止濫用,使您的應用程式更加可靠和安全。
更多範例和詳細使用方法,請參考Iris官方文件。
以上是Iris 請求速率限制中介軟體的詳細內容。更多資訊請關注PHP中文網其他相關文章!