印度包网
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

51 lines
829 B

1 year ago
package middleware
import (
"server/common"
"server/db"
"server/modules/web/app"
"time"
"github.com/gin-gonic/gin"
"github.com/liangdas/mqant/log"
"golang.org/x/time/rate"
)
const (
UserLimitPerSec = 10
)
func RateLimitMiddleware() gin.HandlerFunc {
l := rate.NewLimiter(5000, 20000)
return func(c *gin.Context) {
if !l.Allow() {
c.Abort()
return
}
c.Next()
}
}
func UserLimitMiddleware() gin.HandlerFunc {
return func(c *gin.Context) {
a := app.NewApp(c)
ip := a.GetRemoteIP()
key := common.GetRedisLockKeyIP(ip)
if db.Redis().Exist(key) {
res, err := db.Redis().Incr(key, 1)
if err != nil {
log.Error("err:%v", err)
c.Abort()
return
}
if res > UserLimitPerSec {
c.Abort()
return
}
} else {
db.Redis().SetData(key, 0, time.Second)
}
c.Next()
}
}