小编给大家分享一下springMVC如何实现限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!使用说明在项目中引入Guava相关包Http://mvnrepository.com/artifact/com.Google.g
小编给大家分享一下springMVC如何实现限流,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!
使用说明
在项目中引入Guava相关包
Http://mvnrepository.com/artifact/com.Google.guava/guava/21.0
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/guavacompile group: 'com.google.guava', name: 'guava', version: '21.0'
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); } public SmoothBurstyInterceptor(int tps, SmoothBurstyInterceptor.LimitType limitType) { this.limiter = RateLimiter.create(tps); this.limitType = 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
@Componentpublic 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); }}
看完了这篇文章,相信你对“SpringMVC如何实现限流”有了一定的了解,如果想了解更多相关知识,欢迎关注编程网精选频道,感谢各位的阅读!
--结束END--
本文标题: SpringMVC如何实现限流
本文链接: https://www.lsjlt.com/news/220636.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
2024-05-02
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0