限流器

限流器中间件,用于服务端流量控制,默认使用bbr limiter算法。

配置

WithLimiter

替换默认的限流算法

  1. // WithLimiter set Limiter implementation,
  2. // default is bbr limiter
  3. func WithLimiter(limiter ratelimit.Limiter) Option {
  4. return func(o *options) {
  5. o.limiter = limiter
  6. }
  7. }

所提供的限流器需要实现 aegisLimiter 接口,更多信息可以参考aegis/ratelimit

  1. // Limiter is a rate limiter.
  2. type Limiter interface {
  3. Allow() (DoneFunc, error)
  4. }

使用方法

在 Server 中配置使用限流器

  1. var opts = []http.ServerOption{
  2. http.Middleware(
  3. // 默认 bbr limiter
  4. ratelimit.Server(),
  5. // 自定义 limiter
  6. //ratelimit.Server(ratelimit.WithLimiter(limiter)),
  7. ),
  8. }
  9. srv := http.NewServer(opts...)

触发限流

当触发限流器时,会直接拒绝当前请求,并返回错误ErrLimitExceed,定义如下:

  1. // ErrLimitExceed is service unavailable due to rate limit exceeded.
  2. var ErrLimitExceed = errors.New(429, "RATELIMIT", "service unavailable due to rate limit exceeded")