1.服务网关可以做限流保护 防止网络攻击。
比如控制发短信的速率:
时机:请求被转发之前做限流
优先级:最靠前
2.方案 令牌桶 (谷歌的)
package com.zhu.apigateway.filter;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.exception.ZuulException;
import com.zhu.apigateway.exception.XianLiuException;
import org.springframework.cloud.netflix.zuul.filters.support.FilterConstants;
import org.springframework.stereotype.Component;
/**
* 限流过滤器
* 前置过滤器
*/
@Component
public class XianLiuFilter extends ZuulFilter {
//谷歌开源组件 实现令牌桶 参数是每秒放多少令牌
//会以一定的速率往令牌桶里添加令牌 如果放满则丢掉 外部请求过来要获取令牌才能往下走 没获取到 则拒绝
private static final RateLimiter RATE_LIMITER =RateLimiter.create(100);
@Override
public String filterType() {
//标识为前置
return FilterConstants.PRE_TYPE;
}
@Override
public int filterOrder() {
//优先级是所有过滤器最高的
return FilterConstants.SERVLET_DETECTION_FILTER_ORDER -1;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() throws ZuulException {
//如果没有拿到令牌 就抛异常
if (!RATE_LIMITER.tryAcquire())
{
throw new XianLiuException();
}
return null;
}
}