Administrator
Administrator
发布于 2025-07-25 / 20 阅读
0
0

访问限制器/限流器

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-flexible
const { 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: '请求太快'})
    }

    // ..正常响应内容
})


评论