golang
限制API或功能的访问频率,username也不一定是用户名,可以是IP或其它标识
package main
import (
"golang.org/x/time/rate"
"time"
)
var limiter = make(map[string]*rate.Limiter)
func getLimiter(username string) *rate.Limiter {
l, exist := limiter[username]
if exist {
return l
} else {
limiter[username] = rate.NewLimiter(rate.Every(time.Minute/2), 2) //一分钟访问二次
return limiter[username]
}
} if getLimiter("zhangsan").Allow() == false {
c.JSON(200, gin.H{"success": false, "msg": "查询频率过太快,休息一下吧"})
return
}node.js
npm i rate-limiter-flexibleconst { RateLimiterMemory } = require('rate-limiter-flexible');
const rateLimiter = new RateLimiterMemory({
points: 2, // 允许2次请求
duration: 10, // 每10秒内
});
router.get('/test', async function(req, res){
try {
await rateLimiter.consume(req.ip); //可以传ip,也可以传其它标识,如用户ID、用户名等
}catch(e){
return res.send({success: false, msg: '请求太快'})
}
// ..正常响应内容
})