接口安全令牌桶限流

一、什么是令牌桶?

 定义:令牌桶是一种用于限流的算法,它可以平滑地控制一个系统的请求流量,防止由于瞬时流量过大而导致系统处理能力下降或宕机的问题。 

二、令牌桶算法的实现方式:

     在每个单位时间内,系统会生成一定数量的令牌并放入令牌桶中,每当有一个请求到达时,系统会从令牌桶中取出一个令牌来进行处理;如果令牌桶已经空了,则该请求将被拒绝。通过这种方式,可以平滑地控制请求的流量,避免瞬时流量过大对系统造成影响。

三、令牌桶的优点:

     令牌桶算法的优点是可以适应突发流量的情况,并且在请求流量较少时不会浪费资源,同时还可以根据需要调整令牌生成速率和令牌桶大小等参数,以适应不同的场景。

四、令牌桶的实现方式是什么?

       //自定义一个类方便调用

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');
。。。。。。

如果您有更好的方法期待您的分享吆。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值