laravel中间件throttle
频率限制的应用还会回传三个响应头:
X-RateLimit-Limit告诉我们在指定时间内允许的最大请求次数,
X-RateLimit-Remaining指的是在指定时间段内剩下的请求次数,
Retry-After指的是距离下次重试请求需要等待的时间(s)
// 默认1分钟60次
Route::group(['prefix'=>'api','middleware'=>'throttle'], function(){
Route::get('users', function(){
return \App\User::all();
});
});
访问路由/api/users时你会看见响应头里有如下的信息:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
如果请求超频,响应头里会返回Retry-After:
Retry-After: 58
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 0
上面的信息表示58秒后页面或者API的访问才能恢复正常。
定义频率和重试等待时间
频率默认是60次可以通过throttle中间件的第一个参数来指定你想要的频率,重试等待时间默认是一分钟可以通过throttle中间件的第二个参数来指定你想要的分钟数。
Route::group(['prefix'=>'api','middleware'=>'throttle:5'],function(){
Route::get('users',function(){
return \App\User::all();
});
});//频次上限5
Route::group(['prefix'=>'api','middleware'=>'throttle:5,10'],function(){
Route::get('users',function(){
return \App\User::all();
});
});//频次上限5,重试等待时间10分钟
参考:https://juejin.im/post/5b29ccb5e51d4558a846bd93
用redis实现API访问频率的限制
#coding:utf-8
#!/usr/bin/env python
import redis,sys
def api_count_check(IP):
key=IP+':api_name:api_count'
pool = redis.ConnectionPool(host='192.168.64.18', port=6379,db=0,password=123)
r = redis.Redis(connection_pool=pool)
limit=100
expired_time=60
check=r.exists(key)
isExcced=0
if check==True:
r.incr(key)
count = int(r.get(key))
if count > limit:
isExcced=1
sys.exit(0)
else:
r.set(key,1)
r.expire(key,expired_time)
return isExcced
if __name__ == '__main__':
for i in range(1,101):
api_count_check('user1')
# API function
print 'this is the API function!'