1 回答
TA贡献1789条经验 获得超8个赞
下面是一些简单的限制控制代码,将其用作具有所述服务的唯一标识符(在本例中为 IP)和要等待的时间的 IF 调用。正如您通过代码所看到的,您可以将秒更改为分钟或毫秒。你最好使用像cloudflare这样的服务,但作为最后一个选项,把它放在你的API中,并在处理程序代码周围放置一个IF语句,你可以限制对连接的控制。这是为了保持简单,我相信还有其他优雅的解决方案出来,我的愚蠢尝试可能会被嘲笑,但我相信有人会从中吸取教训,如果它们有意义,改进建议也会包括在内。
/******************************************************************************
* _ _ _ _ _ _ _
* | | | | | | | | | | /\ | | |
* | |_| |__ _ __ ___ | |_| |_| | ___ / \ | | | _____ __
* | __| '_ \| '__/ _ \| __| __| |/ _ \ / /\ \ | | |/ _ \ \ /\ / /
* | |_| | | | | | (_) | |_| |_| | __// ____ \| | | (_) \ V V /
* \__|_| |_|_| \___/ \__|\__|_|\___/_/ \_\_|_|\___/ \_/\_/
* ----------------------------------------------------------------------------
* This function will temp store the value in a map and then remove it, it will
* return true or false if the item is in the map, Now sets delay on second response
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
var throttle = make(map[string]bool)
func throttleAllow(ip string, timeout int) (retVal bool) {
if throttle[ip] == true {
fmt.Println("WARM","-=Throttle=-To frequent calls from:",ip)
time.Sleep(time.Duration(timeout)*time.Second) //Random next cycle.
retVal = true // false will result is receiging to frequent message
} else {
throttle[ip] = true
go func(){
time.Sleep(time.Duration(timeout)*time.Second) //Random next cycle.
delete(throttle, ip)
}()
retVal = true
}
return
}
- 1 回答
- 0 关注
- 75 浏览
添加回答
举报