如何实现springboot+aop+Lua分布式限流-创新互联

小编这次要给大家分享的是如何实现springboot+aop+Lua分布式限流,文章内容丰富,感兴趣的小伙伴可以来了解一下,希望大家阅读完这篇文章之后能够有所收获。

让客户满意是我们工作的目标,不断超越客户的期望值来自于我们对这个行业的热爱。我们立志把好的技术通过有效、简单的方式提供给客户,将通过不懈努力成为客户在信息化领域值得信任、有价值的长期合作伙伴,公司提供的服务项目有:域名申请雅安服务器托管、营销软件、网站建设、景宁畲族自治网站维护、网站推广。

一、什么是限流?为什么要限流?

不知道大家有没有做过帝都的地铁,就是进地铁站都要排队的那种,为什么要这样摆长龙转圈圈?答案就是为了限流!因为一趟地铁的运力是有限的,一下挤进去太多人会造成站台的拥挤、列车的超载,存在一定的安全隐患。同理,我们的程序也是一样,它处理请求的能力也是有限的,一旦请求多到超出它的处理极限就会崩溃。为了不出现最坏的崩溃情况,只能耽误一下大家进站的时间。

限流是保证系统高可用的重要手段!!!

由于互联网公司的流量巨大,系统上线会做一个流量峰值的评估,尤其是像各种秒杀促销活动,为了保证系统不被巨大的流量压垮,会在系统流量到达一定阈值时,拒绝掉一部分流量。

限流会导致用户在短时间内(这个时间段是毫秒级的)系统不可用,一般我们衡量系统处理能力的指标是每秒的QPS或者TPS,假设系统每秒的流量阈值是1000,理论上一秒内有第1001个请求进来时,那么这个请求就会被限流。

二、限流方案

1、计数器

Java内部也可以通过原子类计数器AtomicIntegerSemaphore信号量来做简单的限流。

// 限流的个数
  private int maxCount = 10;
  // 指定的时间内
  private long interval = 60;
  // 原子类计数器
  private AtomicInteger atomicInteger = new AtomicInteger(0);
  // 起始时间
  private long startTime = System.currentTimeMillis();

  public boolean limit(int maxCount, int interval) {
    atomicInteger.addAndGet(1);
    if (atomicInteger.get() == 1) {
      startTime = System.currentTimeMillis();
      atomicInteger.addAndGet(1);
      return true;
    }
    // 超过了间隔时间,直接重新开始计数
    if (System.currentTimeMillis() - startTime > interval * 1000) {
      startTime = System.currentTimeMillis();
      atomicInteger.set(1);
      return true;
    }
    // 还在间隔时间内,check有没有超过限流的个数
    if (atomicInteger.get() > maxCount) {
      return false;
    }
    return true;
  }

另外有需要云服务器可以了解下创新互联建站www.cdcxhl.com,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


新闻名称:如何实现springboot+aop+Lua分布式限流-创新互联
文章位置:http://hbruida.cn/article/csidph.html