RateLimitService redisRateLimitImpl;
@Override
public String filterType()
{
return “pre”; //路由之前
}
/**
*过滤的顺序
*/
@Override
public int filterOrder()
{
return 0;
}
/**
*这里可以编写逻辑判断是否要过滤,true为永远过滤
*/
@Override public boolean shouldFilter()
{
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
/**
*如果请求已经被其他的过滤器终止,本过滤器就不做处理
**/
if (!ctx.sendZuulResponse())
{
return false;
}
/**
*对秒杀令牌进行限流
*/
if (request.getRequestURI().startsWith
(“/seckill-provider/api/seckill/redis/token/v1”))
{
return true;
}
return false;
}
/**
*过滤器的具体逻辑
*/
@Override
public Object run()
{
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
String goodId = request.getParameter(“goodId”);
if (goodId != null)
{
String cacheKey = “seckill:” + goodId;
Boolean limited = redisRateLimitImpl.tryAcquire(cacheKey);
if (limited)
{
/**
*被限流后的降级
*/
String msg = “参与抢购的人太多,请稍后再试一试”;
fallback(ctx, msg);
return null;
}
return null;
} else
{
/**
*参数输入错误时的降级处理
*/
String msg = “必须输入抢购的商品”;
fallback(ctx, msg);
return null;
}
}
/**
*被限流后的降级处理
*@param ctx
*@param msg
*/
private void fallback(RequestContext ctx, String msg)
{
ctx.setSendZuulResponse(false);
try
{
ctx.getResponse().setContentType(“text/html;charset=utf-8”);
ctx.getResponse().getWriter().write(msg);
} catch (Exception e)
{ e.printStackTrace();
}
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
转存中…(img-GxVEHry1-1710926243736)]
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
[外链图片转存中…(img-zQA0vy49-1710926243737)]