流量桶限流
阿新 • • 發佈:2019-02-14
1. guava-19.0.jar jar包自己下載,csdn有
2.web.xml
配置過濾器
<filter>
<filter-name>limiterFilter</filter-name>
<filter-class>你的包名.RateLimiterFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>limiterFilter</filter-name>
<url-pattern>你需要過濾的url</url-pattern>
</filter-mapping>
3.RateLimiterFilter.java 程式碼
package 你的包名; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import com.google.common.util.concurrent.RateLimiter; public class RateLimiterFilter implements Filter { private RateLimiter limiter = null; @Override public void init(FilterConfig arg0) throws ServletException { limiter = RateLimiter.create(100); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { if(limiter.tryAcquire()) { request.setAttribute("limiter", "ok"); chain.doFilter(request, response); } } @Override public void destroy() { } }
4.action
@Controller @Scope(value = "prototype") public class TestAction extends BaseAction implements ModelDriven<T>{ public void search() throws Exception{ Map<String, Object> resMap = new HashMap<String, Object>(); if(!"ok".equals(request.getAttribute("limiter"))){ resMap.put("status","error"); resMap.put("reason","訪問人數太多,請稍後訪問"); writeJSON(resMap); return; } // 你的正常邏輯 }