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