赞
踩
为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
go get github.com/zhangdapeng520/zdpgo_gin_limit
package main import ( gin "github.com/zhangdapeng520/zdpgo_gin" limit "github.com/zhangdapeng520/zdpgo_gin_limit" "time" ) func keyFunc(c *gin.Context) string { return c.ClientIP() } func errorHandler(c *gin.Context, info limit.Info) { c.String(429, "Too many requests. Try again in "+time.Until(info.ResetTime).String()) } func main() { server := gin.Default() // This makes it so each ip can only make 5 requests per second store := limit.InMemoryStore(&limit.InMemoryOptions{ Rate: time.Second, Limit: 5, }) mw := limit.RateLimiter(store, &limit.Options{ ErrorHandler: errorHandler, KeyFunc: keyFunc, }) server.GET("/", mw, func(c *gin.Context) { c.String(200, "Hello World") }) server.Run(":8080") }
package main import ( gin "github.com/zhangdapeng520/zdpgo_gin" limit "github.com/zhangdapeng520/zdpgo_gin_limit" redis "github.com/zhangdapeng520/zdpgo_redis_v2" "time" ) // 基于什么限流? // 此函数返回用于限流的key func keyFunc(c *gin.Context) string { return c.ClientIP() } // 错误处理 // 当被限流的时候返回此内容 func errorHandler(c *gin.Context, info limit.Info) { c.String(429, "Too many requests. Try again in "+time.Until(info.ResetTime).String()) } func main() { server := gin.Default() // 这使得每个ip每秒只能发出5个请求 store := limit.RedisStore(&limit.RedisOptions{ RedisClient: redis.NewClient(&redis.Options{ Addr: "localhost:6379", }), Rate: time.Second, // 按秒限流 Limit: 5, // 每秒可以请求5次 }) mw := limit.RateLimiter(store, &limit.Options{ ErrorHandler: errorHandler, KeyFunc: keyFunc, }) server.GET("/", mw, func(c *gin.Context) { c.String(200, "Hello World") }) server.Run(":8080") }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。