zdpgo_gin_limit
为zdpgo_gin打造的接口限流框架,当API接口需要限制访问频率的时候可以使用此框架
安装
bash
go get github.com/zhangdapeng520/zdpgo_gin_limit
使用教程
基于内存的限流
go
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")
}
基于Redis的限流
go
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")
}
版本
v0.1.0
- 基础代码