SpringCloud Zuul过滤器和谷歌Gauva实现限流
作者:玉天恒 发布时间:2022-08-31 11:59:21
标签:Gauva,Spring,Cloud,Zuul,限流
前提:
已经配置Zuul网关
参考:
https://www.jb51.net/article/182894.htm
限流方式:
1)nginx层限流
2)网关层限流
1.添加限流过滤器
import com.alibaba.fastjson.JSON;
import com.google.common.util.concurrent.RateLimiter;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import com.netflix.zuul.exception.ZuulException;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static org.springframework.cloud.netflix.zuul.filters.support.FilterConstants.PRE_TYPE;
/**
* 订单限流接口
*/
@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 context = RequestContext.getCurrentContext();
HttpServletRequest request = context.getRequest();
///apigateway/order/api/v1/order/test
System.out.println(request.getRequestURI());
//http://127.0.0.1:9000/apigateway/order/api/v1/order/test
System.out.println(request.getRequestURL());
//限流的接口
List<String> noFIlter = new ArrayList<>();
noFIlter.add("/apigateway/order/**");
AntPathMatcher matcher = new AntPathMatcher();
for (String pattern : noFIlter) {//pattern--/user/**
if (StringUtils.isNotEmpty(pattern)
&& matcher.match(pattern, request.getRequestURI())) {
return true;
}
}
return false;
}
@Override
public Object run() throws ZuulException {
//可以用JMeter来进行测试
RequestContext context = RequestContext.getCurrentContext();
//tryAcquire达到最大流量时,立刻限流,也可以配置参数
if (!RATE_LIMITER.tryAcquire()) {
Map<String, Object> result = new HashMap<>();
result.put("code", 429);
result.put("msg", "目前访问量过大,限流了...");
context.setSendZuulResponse(false);
context.setResponseStatusCode(HttpStatus.TOO_MANY_REQUESTS.value());
context.setResponseBody(JSON.toJSONString(result));
//解决中文乱码
context.getResponse().setCharacterEncoding("UTF-8");
context.getResponse().setContentType("text/html;charset=UTF-8");
}
return null;
}
}
令牌桶限流图解
来源:https://www.cnblogs.com/tianhengblogs/p/12501235.html


猜你喜欢
- Java生态圈中有很多处理JSON和XML格式化的类库,Jackson是其中比较著名的一个。虽然JDK自带了XML处理类库,但是相对来说比较
- 前言通过前面这篇文章Android串口通讯SerialPort的使用详情已经基本掌握了串口的使用,那么不经想问自己,到底什么才是串口通讯呢?
- 定时任务技术趋势简介:定时任务是每个业务常见的需求,比如每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报
- 第1部分 HashSet介绍HashSet 简介HashSet 是一个没有重复元素的集合。它是由HashMap实现的,不保证元素的顺序,而且
- Android Support Annotations &
- 简介本文用示例介绍SpringBoot如何解决雪花算法主键ID传到前端后精度丢失问题。问题描述Java后端Long类型的范围-2^63~2^
- 本文实例为大家分享了Android简单自定义音乐波动特效图的具体代码,供大家参考,具体内容如下最终效果:思路:就是绘制一个不断变化高度的矩形
- 1、数组理论基础数组是存放在连续内存空间上的相同类型数据的集合,可以通过下标索引的方式获取到下标下对应的数据。举个栗子(字符数组)~可以看到
- 1.向上转型 向下转型2.强制类型转换的应用应用多态性时由于引用为父类类型,导致编译时只能调用父类中声明的属性和方法。子类特有的属性和方法不
- 本文实例讲述了Android开发中使用外部应用获取SD卡状态的方法。分享给大家供大家参考,具体如下:先来看看常规获取SD卡状态的方法if (
- 本文实例为大家分享了Unity实现新手引导镂空效果的具体代码,供大家参考,具体内容如下一、实现思路创建有8个顶点的Mesh,内外边界都是四边
- Java 内存划分: 在Java内存分配中,java将内存分为:方法区,堆,虚拟机栈,本地方法栈,程序计
- 本文实例讲述了C#使用Dispose模式实现手动对资源的释放。分享给大家供大家参考。具体实现方法如下://单一类的实现class MyCla
- 定义桥梁模式是对象的结构模式。又称为柄体(Handle and Body)模式或接口(Interface)模式。桥梁模式的用意是&l
- jdk线程池ThreadPoolExecutor的7个参数public ThreadPoolExecutor(int corePoolSiz
- 迭代器模式,一直没用过,也不会用。恰巧MyBatis框架中也使用到了迭代器模式,而且看起来还比较简单,在以后的工作中,若有需要咱们可模仿它的
- 一、定界符成帧Framer接口package framer;import java.io.IOException;import java.i
- 一、Java类的加载顺序引用1个网上的经典例子,并做稍许改动,以便大家更好地理解。public class Animal {
- 小编在之前给大家介绍过很多android项目打包的经验,本篇内容我们通过一个项目实例来给大家讲解android每一步打包和签名的过程。and
- 身为一名开发人员,大家都知道,我们经常会在项目中大量的编写许多重复的代码,比如说public Entity find(String id);