Guava RateLimiterのWebアプリケーションでの使用

4269 ワード

GoogleのGuavaはJDKが補充した神器で、よく勉強する価値があります.一般的なWebシステムのアクセス制限は、tomcatがconnector上でconnection数の制限、servlet thread制限を構成するなど、コンテナ自体で実現できます.システムが複雑になると、異なるサービスに対して異なるRateLimiterを提供したい場合があります.例えば、データベースの操作に対する要求が比較的大きいレートは小さく、メモリで処理できるレートは大文字で、クラスタにrate limiterサービスを提供する可能性があります.どのように速度を制限するかは共通の話題であり、関連するアルゴリズムと実現はたくさんあり、Calvinのspringside 4 wikiのこの章の説明を見ることができて、とても素晴らしいです.ここでは、RateLimiterを使用して、すべてのspringアクセスのアクセス速度を制限する方法、単純版、ratelimiterの注入に必要な入力パラメータを記録します.
1.Filterの定義
public class RateLimiterFilter implements Filter {

    private static Logger logger = Logger.getLogger(RateLimiterFilter.class);

    private RateLimiter limiter = null;

    public void init(FilterConfig config) throws ServletException {
        limiter = RateLimiter.create(100); //100 request per second
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;

        if(limiter.tryAcquire()) {
             if(logger.isTraceEnabled()){
                 logger.trace("get access: ");
             }
             chain.doFilter(request, response)
        } else {
             logger.info("system limitation reached!");
             req.getRequestDispatcher("/WEB-INF/jsp/error/429.jsp").forward(req,res);
        }
    }
}

2.Web.xmlの変更
<filter> 
    <filter-name>ratelimiterfilter-name>
    <filter-class>RateLimiterFilterfilter-class> 
  filter> 
  <filter-mapping> 
    <filter-name>ratelimiterfilter-name>
    <servlet-name>springmvcservlet-name> 
  filter-mapping> 

3.MavenにRateLimiterパッケージを導入
<dependency>
    <groupId>com.google.guavagroupId>
    <artifactId>guavaartifactId>
    <version>18.0version>
dependency>

大成功!