当前位置:   article > 正文

六,令牌桶限流_令牌桶限流 limit

令牌桶限流 limit

令牌桶限流

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

项目中应用

完整代码:

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

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

图片

 

 

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

  1. var ErrLimitExceed = errors.New(" Rate Limit Exceed ")
  2. func NewTokenBucketLimiter(tb *ratelimit.Bucket) endpoint.Middleware {
  3. return func(next endpoint.Endpoint) endpoint.Endpoint {
  4. return func(ctx context.Context, request interface{}) (response interface{}, err error) {
  5. // 从令牌桶中取令牌,如果没有令牌则返回提示信息。
  6. if tb.TakeAvailable(1) == 0 {
  7. return nil, ErrLimitExceed
  8. }
  9. return next(ctx, request)
  10. }
  11. }
  12. }

配置文件

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

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

修改 main.go

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

  1. // 创建令牌桶
  2. bucket := ratelimit.NewBucket(time.Second*time.Duration(configs.Conf.RatelimitConfig.FillInterval), int64(configs.Conf.RatelimitConfig.Capacity))
  3. ratelimit := ratelimits.NewTokenBucketLimiter(bucket)
  4. userEndpoints := &endpoint.UserEndpoints{
  5. RegisterEndpoint: ratelimit(endpoint.MakeRegisterEndpoint(userService)),
  6. FindByIDEndpoint: ratelimit(endpoint.MakeFindByIDEndpoint(userService)),
  7. FindByEmailEndpoint: ratelimit(endpoint.MakeFindByEmailEndpoint(userService)),
  8. FindBooksByUserIDEndpoint: ratelimit(endpoint.MakeFindBooksByUserIDEndpoint(userService)),
  9. }

测试 

图片

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

完整代码:

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


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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/724385
推荐阅读
相关标签
  

闽ICP备14008679号