在zuul中使用谷歌的组件实现水桶法限流
首先,肯定是在前置(Pre)过滤器中进行拦截处理
/**
* 限流
* 是放在前置过滤器(Pre)里面
* @author xwq
* @create 2020-04-23 16:06
**/
public class RateLimiterFilter extends ZuulFilter {
private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return SERVLET_DETECTION_FILTER_ORDER -1 ;
}
@Override
public boolean shouldFilter() {
return true;
}
/**
* 具体实现
* @return
*/
@Override
public Object run() {
if(!RATE_LIMITER.tryAcquire()){
throw new RateLimitException();
}
return null;
}
}
/**
* 限流异常
* @author xwq
* @create 2020-04-23 16:13
**/
public class RateLimitException extends RuntimeException {
}