当前位置: 移动技术网 > IT编程>开发语言>Java > SpringMVC 限流的示例代码

SpringMVC 限流的示例代码

2019年07月19日  | 移动技术网IT编程  | 我要评论

在使用springboot做接口访问如何做接口的限流,这里我们可以使用google的guava包来实现,当然我们也可以自己实现限流,guava中的限流是久经考验的我们没必需重新再去写一个,如果想了解限流原理的同学可以自己查阅一下相关的资料,本文不作过来说明噢。

使用说明

在项目中引入guava相关包

maven项目

<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->
<dependency>
  <groupid>com.google.guava</groupid>
  <artifactid>guava</artifactid>
  <version>21.0</version>
</dependency>

gradle项目

// https://mvnrepository.com/artifact/com.google.guava/guava
compile group: 'com.google.guava', name: 'guava', version: '21.0'

写一个springmvc的拦截器

smoothburstyinterceptor.java

import com.google.common.util.concurrent.ratelimiter;
import org.springframework.web.servlet.modelandview;
import org.springframework.web.servlet.handler.handlerinterceptoradapter;

import javax.servlet.http.httpservletrequest;
import javax.servlet.http.httpservletresponse;
import java.util.concurrent.timeunit;

public class smoothburstyinterceptor extends handlerinterceptoradapter {

  public enum limittype {
    drop,//丢弃
    wait //等待
  }

  /**
   * 限流器
   */
  private ratelimiter limiter;
  /**
   * 限流方式
   */
  private limittype limittype = limittype.drop;

  public smoothburstyinterceptor() {
    this.limiter = ratelimiter.create(10);
  }

  /**
   * @param tps    限流量 (每秒处理量)
   * @param limittype 限流类型:等待/丢弃(达到限流量)
   */
  public smoothburstyinterceptor(int tps, smoothburstyinterceptor.limittype limittype) {
    this.limiter = ratelimiter.create(tps);
    this.limittype = limittype;
  }
  /**
   * @param permitspersecond 每秒新增的令牌数
   * @param limittype 限流类型:等待/丢弃(达到限流量)
   */
  public smoothburstyinterceptor(double permitspersecond, smoothburstyinterceptor.limittype limittype) {
    this.limiter = ratelimiter.create(permitspersecond, 1000, timeunit.milliseconds);
    this.limittype = limittype;
  }


  @override
  public boolean prehandle(httpservletrequest request, httpservletresponse response, object handler) throws exception {
    if (limittype.equals(limittype.drop)) {
      if (limiter.tryacquire()) {
        return super.prehandle(request, response, handler);
      }
    } else {
      limiter.acquire();
      return super.prehandle(request, response, handler);
    }
    throw new exception("网络异常!");//达到限流后,往页面提示的错误信息。
  }

  @override
  public void posthandle(httpservletrequest request, httpservletresponse response, object handler, modelandview modelandview) throws exception {
    super.posthandle(request, response, handler, modelandview);
  }

  @override
  public void aftercompletion(httpservletrequest request, httpservletresponse response, object handler, exception ex) throws exception {
    super.aftercompletion(request, response, handler, ex);
  }

  public ratelimiter getlimiter() {
    return limiter;
  }

  public void setlimiter(ratelimiter limiter) {
    this.limiter = limiter;
  }
}

springmvc拦截配置

webconfig.java

@component
public class webconfig extends webmvcconfigureradapter {

  @override
  public void addinterceptors(interceptorregistry registry) {
    // 多个拦截器组成一个拦截器链
    registry.addinterceptor(new smoothburstyinterceptor(100, smoothburstyinterceptor.limittype.drop)).addpathpatterns("/**");
    //限流可配置为smoothburstyinterceptor.limittype.drop丢弃请求或者smoothburstyinterceptor.limittype.wait等待,100为每秒的速率
    super.addinterceptors(registry);
  }

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网