一. 限流介绍
-
为什么使用限流?根据木桶效应,限流保证下游服务可用
-
限流方式
-
网关层限流
-
nginx层限流
-
二. 谷歌guava框架的使用(网关层限流)
-
创建自定义过滤器,继承ZuulFilter
-
创建令牌桶,设置为static final(根据压测设置qps数)
-
在filterOrder中设置优先级
-
在run中,通过RATE_LIMITER.tryAcquire()以非阻塞方式获取令牌
扫描二维码关注公众号,回复: 10880777 查看本文章
整体代码示例:
@Component
public class OrderRateLimiterFilter extends ZuulFilter {
//每秒产生1000个令牌
private static final RateLimiter RATE_LIMITER = RateLimiter.create(1000);
@Override
public String filterType() {
return PRE_TYPE;
}
@Override
public int filterOrder() {
return -4;
}
@Override
public boolean shouldFilter() {
RequestContext requestContext = RequestContext.getCurrentContext();
HttpServletRequest request = requestContext.getRequest();
//只对订单接口限流
if ("/apigateway/order/api/v1/order/save".equalsIgnoreCase(request.getRequestURI())){
return true;
}
return false;
}
@Override
public Object run() throws ZuulException {
RequestContext requestContext = RequestContext.getCurrentContext();
//阻塞方式获取令牌,方法中如果添加int类型参数,就是设置阻塞时间
//if(!RATE_LIMITER.acquire()){}
//非阻塞方式获取令牌,方法中如果添加int类型参数,就是设置阻塞时间(一般限流不加zusaishijian)
if(!RATE_LIMITER.tryAcquire()){
requestContext.setSendZuulResponse(false);
requestContext.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());
}
return null;
}
}
另:网关集群搭建
-
Nginx需要通过lvs+keepalive做高可用,通过伪ip映射,实现nginx集群
-
网关集群搭建的时候,令牌数,应该为“qps数/网关节点数”