赞
踩
一、什么是令牌桶?
定义:令牌桶是一种用于限流的算法,它可以平滑地控制一个系统的请求流量,防止由于瞬时流量过大而导致系统处理能力下降或宕机的问题。
二、令牌桶算法的实现方式:
在每个单位时间内,系统会生成一定数量的令牌并放入令牌桶中,每当有一个请求到达时,系统会从令牌桶中取出一个令牌来进行处理;如果令牌桶已经空了,则该请求将被拒绝。通过这种方式,可以平滑地控制请求的流量,避免瞬时流量过大对系统造成影响。
三、令牌桶的优点:
令牌桶算法的优点是可以适应突发流量的情况,并且在请求流量较少时不会浪费资源,同时还可以根据需要调整令牌生成速率和令牌桶大小等参数,以适应不同的场景。
四、令牌桶的实现方式是什么?
//自定义一个类方便调用
private $capacity; // 桶的容量 private $rate; // 令牌放入速率,单位:令牌/秒 private $tokens; // 当前桶内的令牌数量 private $lastRefillTime; // 上次更新令牌数的时间 public function __construct($capacity, $rate) { $this->capacity = $capacity; $this->rate = $rate; $this->tokens = $capacity; $this->lastRefillTime = time(); } // 获取指定数量的令牌 public function getTokens($tokens) { $this->refill(); // 先更新桶中的令牌数量 if ($tokens <= $this->tokens) { $this->tokens -= $tokens; return true; } else { return false; } } // 更新桶中的令牌数量 private function refill() { $now = time(); $delta = ($now - $this->lastRefillTime) * $this->rate; $this->tokens = min($this->capacity, $this->tokens + $delta); $this->lastRefillTime = $now; } //中间件的使用
public function handle(Request $request, Closure $next) { $capacity = 10; // 桶的容量 $rate = 5; // 令牌放入速率 $td=new TokenBucket($capacity,$rate); if ($td->getTokens(2)){ // 可以访问资源 }else{ echo "限流了,无法访问"; } return $next($request); }
//在kerner内绑定一下
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, // 绑定一下 'bucket'=>bucket::class ];
//剩下的绑定在路由上即可....
例子:
Route::group(['namespace'=>'Admin\Fang','middleware'=>'bucket'],function (){ // 房源列表 Route::get('fangList',[\App\Http\Controllers\Admin\Fang\FangController::class,'fangList'])->name('fangList'); 。。。。。。
如果您有更好的方法期待您的分享吆。。。。。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。