SpringMVC 限流的示例代码
程序员文章站
2024-02-25 15:16:57
在使用springboot做接口访问如何做接口的限流,这里我们可以使用google的guava包来实现,当然我们也可以自己实现限流,guava中的限流是久经考验的我们没必需...
在使用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); } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: SpringBoot自动配置的实现原理