流量桶限流

来源:互联网 发布:谷歌seo教程 编辑:程序博客网 时间:2024/06/13 04:00

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;@Overridepublic void init(FilterConfig arg0) throws ServletException {limiter = RateLimiter.create(100);}@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,ServletException {if(limiter.tryAcquire()) {request.setAttribute("limiter", "ok");chain.doFilter(request, response);        }}@Overridepublic 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;}// 你的正常逻辑}