限流算法之令牌桶

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。

 

package main

import (
    "fmt"
    "github.com/juju/ratelimit"
    "time"
)

var bucketMap map[int64]*ratelimit.Bucket

func newBucket() *ratelimit.Bucket{
    //rate表示每秒放多少个令牌
    //capacity表示桶的最大容量
    bucket := ratelimit.NewBucketWithRateAndClock(2, 5, nil)
    return bucket
}

func main(){

    b := newBucket()
    for i := 0; i<1000; i++{
        before := b.Available()
        if b.TakeAvailable(1) != 0{    //取到了令牌
            fmt.Println("获取到令牌index ", i+1, "前后数量-->前:", before, "后:", b.Available())
        }else{
            fmt.Println("未取到令牌,拒绝 ", i+1)
        }
        time.Sleep(1*time.Second/10)
    }

}

 

posted @ 2021-09-17 10:36  独揽风月  阅读(150)  评论(0编辑  收藏  举报