六,令牌桶限流

27 篇文章 0 订阅
9 篇文章 1 订阅

令牌桶限流

在这个图书馆项目中,我们采用令牌桶限流算法,具体原理请参看《分布式高可用-流量控制-1 流控策略》文章。

项目中应用

完整代码:

https://github.com/Justin02180218/micro-kit

在 pkg 下新建目录 ratelimits,创建 ratelimit.go 文件:

图片

 

 

在 go kit 的 endpoint 层进行限流,采用装饰器模式 

var ErrLimitExceed = errors.New(" Rate Limit Exceed ")

func NewTokenBucketLimiter(tb *ratelimit.Bucket) endpoint.Middleware {
    return func(next endpoint.Endpoint) endpoint.Endpoint {
        return func(ctx context.Context, request interface{}) (response interface{}, err error) {
            // 从令牌桶中取令牌,如果没有令牌则返回提示信息。
            if tb.TakeAvailable(1) == 0 {
                return nil, ErrLimitExceed
            }
            return next(ctx, request)
        }
    }
}

配置文件

ratelimit:
  fillInterval: 1
  capacity: 3
type RatelimitConfig struct {
    FillInterval int `json:"fillInterval" yaml:"fillInterval"`
    Capacity     int `json:"capacity" yaml:"capacity"`
}

为了测试方便,配置令牌桶的容量为3个,填充间隔为1秒。当并发请求超过3个,就会触发限流,提示错误信息。

修改 main.go

以 library-user-service 为例,其他微服务也是相同的写法

// 创建令牌桶
bucket := ratelimit.NewBucket(time.Second*time.Duration(configs.Conf.RatelimitConfig.FillInterval), int64(configs.Conf.RatelimitConfig.Capacity))
ratelimit := ratelimits.NewTokenBucketLimiter(bucket)

userEndpoints := &endpoint.UserEndpoints{
    RegisterEndpoint:          ratelimit(endpoint.MakeRegisterEndpoint(userService)),
    FindByIDEndpoint:          ratelimit(endpoint.MakeFindByIDEndpoint(userService)),
    FindByEmailEndpoint:       ratelimit(endpoint.MakeFindByEmailEndpoint(userService)),
    FindBooksByUserIDEndpoint: ratelimit(endpoint.MakeFindBooksByUserIDEndpoint(userService)),
}

测试 

图片

下一篇文章,我们给微服务加入服务注册与发现功能。

完整代码:

https://github.com/Justin02180218/micro-kit


更多【分布式专辑】【架构实战专辑】系列文章,请关注公众号

网关令牌桶限流是一种常用的流量控制机制,用于保护后端服务免受过多请求的影响。它基于令牌桶算法,通过限制请求的速率来平滑流量,确保系统的稳定性和可靠性。 在网关令牌桶限流中,令牌桶是一个固定容量的桶,其中包含一定数量的令牌。每个令牌代表一个请求的许可。当有请求到达时,网关会检查桶中是否有足够的令牌。如果有足够的令牌,则请求被允许通过,并从桶中消耗一个令牌;如果没有足够的令牌,则请求被拒绝。 令牌桶算法的特点是可以在短时间内处理突发流量,同时也可以限制平均请求速率。通过调整令牌生成速率和桶的容量,可以灵活地控制系统的吞吐量和并发度。 网关令牌桶限流的优点包括: 1. 简单有效:实现相对简单,能够有效地控制流量。 2. 平滑限流:通过令牌桶算法,可以平滑地限制请求的速率,避免突发流量对系统造成过大的压力。 3. 灵活配置:可以根据实际需求调整令牌生成速率和桶的容量,以适应不同的业务场景。 然而,网关令牌桶限流也存在一些限制和注意事项: 1. 令牌桶算法需要一定的计算资源,对于高并发场景需要进行性能测试和优化。 2. 如果请求速率超过了令牌桶的容量,会导致请求被拒绝,可能会影响用户体验。 3. 令牌桶算法只能控制请求的速率,无法对请求的处理时间进行限制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值