算法:令牌桶
Guava已经实现了这个算法:RateLimiter
放上代码:
package van.gateway.filter;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import org.springframework.stereotype.Component;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.SERVLET_DETECTION_FILTER_ORDER;
/**
* @author Van
* @date 2020/4/18 - 10:29
*/
@Component
public class RateLimitFilter extends ZuulFilter {
private static final RateLimiter RATE_LIMITER=RateLimiter.create(100);//每秒放100个令牌
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return SERVLET_DETECTION_FILTER_ORDER-1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
//如果没有取到令牌
if (!RATE_LIMITER.tryAcquire()){
//可以抛错误,或者其他什么的。
}
return null;
}
}