接口安全令牌桶限流

一、什么是令牌桶?

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

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

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

三、令牌桶的优点:

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

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

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

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
    评论
Redis令牌桶限流是一种常见的限流算法,它基于令牌桶算法实现。根据引用\[1\]中的代码,可以看出Redis令牌桶限流需要一个ScheduledThread来定时放入令牌。具体实现是通过使用ScheduledThreadExecutor.scheduleAtFixedRate方法,在规定的时间间隔内放入令牌到令牌桶中。 与漏桶算法相比,令牌桶算法允许一定程度的突发情况,同时可以方便地改变速率。引用\[2\]中提到,令牌桶算法可以根据需要提高放入桶中令牌的速率,从而提高限流速度。因此,令牌桶算法是限流框架中的核心算法。 在使用Redis令牌桶限流时,可以通过调用相关方法来获取令牌。引用\[3\]中的代码示例展示了如何使用Redis令牌桶限流来限制上传操作的频率。在该示例中,通过调用redisRaterLimiter.acquireToken方法来获取令牌,如果获取到令牌则可以进行上传操作,否则会抛出限流异常。 综上所述,Redis令牌桶限流是一种基于令牌桶算法实现的限流方法,它可以通过定时放入令牌来控制请求的频率,并允许一定程度的突发情况。 #### 引用[.reference_title] - *1* *2* *3* [分布式限流实战--redis实现令牌桶限流](https://blog.csdn.net/u011296165/article/details/107761489)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值