限流方式可以很多。
- 服务器限流,可以通过云服务器安全控制
- 通过nginx控制,如ip控制,频率控制等。
- 风控系统等。
- redis结合lua脚本控制。
通过用户角色,可以限流到各色各样的用户的,每个路由的请求次数/秒。
public function actionControl()
{
$lua = '
local i = redis.call("INCR", KEYS[1])
if i > 10 then
return "每分钟最多请求10次"
else
if i == 1
then
redis.call("expire", KEYS[1], KEYS[2])
end
return redis.call("get", KEYS[3])
end
';
return new ApiResponse(0,\Yii::$app->redis->eval($lua, 3 , \Yii::$app->request->userIP, 60 , \Yii::$app->request->userIP));
}
在代码里面可以很灵活的通过多个维度去限流,请求次数、限流模块(上面是限制ip的,但是可以更多的组合根据你的需求)、秒数。