SpringCloud Zuul 限流
限流主要是为了防止恶意请求,功能实现放在前置过滤器(Pre)请求被转发之前调用,限流应放在所有的过滤器最前面。
今天介绍的限流方式是令牌桶限流。代码如下
package com.lfv.product.filter;
import org.springframework.stereotype.Component;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
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 lf
*
*/
@Component
public class RateLimterFilter extends ZuulFilter{
//谷歌令牌桶的实现 100/s 令牌
private static final RateLimiter RATE_LIMITER = RateLimiter.create(100);
@Override
public boolean shouldFilter() {
return true;
}
//没有拿到令牌抛出异常
@Override
public Object run() throws ZuulException {
if(!RATE_LIMITER.tryAcquire()) {
new RuntimeException();
}
return null;
}
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return SERVLET_DETECTION_FILTER_ORDER - 1;
}
}
还没有评论,来说两句吧...