限流的不完全总结

限流可以在网关这一层做,比如Nginx、Openresty、kong、zuul、Spring Cloud Gateway等;也可以在应用层通过Aop这种方式去做限流。

一些限流组件,包括Redisson的令牌桶限流,Guava的RateLimiter。Hystrix是客户端限流(参考彗安金科Java面试(部分) 或直接参考熔断器HystrixJavaGuide—Java面试指北—高性能:负载均衡的常见算法有哪些?)。

网关层限流

在这里插入图片描述1

网关层限流:gateway的限流基于Redis+Lua脚本1 2 :

Redisson分布式限流器RRateLimiter原理解析

单机限流:可Hystrix用线程池或Semaphore限流:

例1:深入 Hystrix 线程池隔离与接口限流

实例2:
RedisHystrixCommand.java :

public class RedisHystrixCommand<T> extends HystrixCommand<T> {

  private static final Logger logger = new Logger("Hystrix");

  private Callable<T> callable;
  private T defaultResult;
  private String opName;

  /**
   * constructor.
   */
  public RedisHystrixCommand(String keyName, Callable<T> callable, T defaultResult,
      String opName) {
    // default timeout=1s, fallback when 50% or 20 requests in 10 seconds fail
    super(Setter
        .withGroupKey(HystrixCommandGroupKey.Factory.asKey(keyName))
        .andCommandKey(HystrixCommandKey.Factory.asKey(keyName))
        .andCommandPropertiesDefaults(HystrixCommandProperties.Setter()
            .withExecutionIsolationStrategy(ExecutionIsolationStrategy.SEMAPHORE)
            .withCircuitBreakerEnabled(true)));
    this.callable = callable;
    this.defaultResult = defaultResult;
    this.opName = opName;
  }

  @Override
  protected T run() throws Exception {
    return callable.call();
  }

  @Override
  protected T getFallback() {
    logger.error("RedisCache {} fallback since executionTimeout, return {}",
        opName, defaultResult);
    return defaultResult;
  }
}

RedisHelper.java:

public Long sadd(String key, String member) {
  return new RedisHystrixCommand<>(getCommandKey(), () ->
      getRedisClient().handle(redis -> redis.sadd(key, member))
          .orElse(0L), 0L, "sadd").execute();
}

  1. 我司用了 6 年的 Redis 分布式限流器,可以说是非常厉害了!
    5 种限流算法,7 种限流方式,挡住突发流量
    其中后文靠后的部分提到了用Redis+lua脚本来实现两种限流算法:一是用INCR 和 EXPIRE 命令来实现固定窗口限流,二是用ZSET(score为当前时间)实现滑动窗口限流。 ↩︎ ↩︎

  2. Spring Cloud Gateway 之限流篇 ↩︎

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_23204557

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值