博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring cloud gateway(三、实现限流)
阅读量:4935 次
发布时间:2019-06-11

本文共 2490 字,大约阅读时间需要 8 分钟。

限流一般有两个实现方式,令牌桶和漏桶

金牌桶是初始化令牌(容器)的个数,通过拿走里边的令牌就能通过, 没有令牌不能报错,可以设置向容器中增加令牌的速度和最大个数

漏桶是向里边放入请求,当请求数量达到最大值后,丢弃,漏桶中的数据以一定速度流出,没有则不流出

金牌桶实现方式如下:

pom

com.github.vladimir-bukhtoyarov
bucket4j-core
4.0.0
org.springframework.boot
spring-boot-starter-data-redis-reactive

创建下边类并且继承下边类 

public class LimitFilter implements GatewayFilter, Ordered {
private final Logger logger = LoggerFactory.getLogger(LimitFilter.class); int capacity; int refillTokens; Duration refillDuration; public LimitFilter(int capacity, int refillTokens, Duration refillDuration) {
this.capacity = capacity; this.refillTokens = refillTokens; this.refillDuration = refillDuration; } private static final Map
CACHE = new ConcurrentHashMap<>(); private Bucket createNewBucket() {
Refill refill = Refill.of(refillTokens,refillDuration); Bandwidth limit = Bandwidth.classic(capacity,refill); return Bucket4j.builder().addLimit(limit).build(); } @Override public Mono
filter(ServerWebExchange exchange, GatewayFilterChain chain) {
String ip = exchange.getRequest().getRemoteAddress().getAddress().getHostAddress(); Bucket bucket = CACHE.computeIfAbsent(ip,k -> createNewBucket()); logger.info("IP: " + ip + ",TokenBucket Available Tokens: " + bucket.getAvailableTokens()); if (bucket.tryConsume(1)) {
return chain.filter(exchange); } else {
exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS); return exchange.getResponse().setComplete(); } } @Override public int getOrder() {
return 0; } }

配置路由

@Bean     public RouteLocator customerRouteLocator(RouteLocatorBuilder builder) {
// @formatter:off return builder.routes() .route(r -> r.path("/consulserver/**") .filters(f -> f.stripPrefix(1) .filter(new LimitFilter(10,1,Duration.ofSeconds(1)))) .uri("lb://consulserver") .order(0) .id("throttle_customer_service") ).build(); // @formatter:on } 

 原文:https://blog.csdn.net/m0_37834471/article/details/82621353

redis限流原文:https://blog.csdn.net/ifrozen/article/details/80016566 

转载于:https://www.cnblogs.com/tflike/p/10044877.html

你可能感兴趣的文章
把字符串转换成整数
查看>>
9.4/9.5 sed
查看>>
POJ 3280 —— Cheapest Palindrome
查看>>
REST和SOAP区别
查看>>
记一次WinForm中屏蔽空格键对按钮的作用
查看>>
数据库同步中差异数据捕获方案设计与实现
查看>>
安卓开发中全局变量的创建
查看>>
让进程在后台可靠运行的几种方法
查看>>
Centos6.2设置静态ip和dns
查看>>
Ubuntu系统较全面清理
查看>>
个人总结-8-重新写注册和登录界面
查看>>
冲刺2-5
查看>>
jQuery常用方法(三)-jQuery Ajax
查看>>
javascript之Publish/Subscribe模式
查看>>
Vivado_MicroBlaze_问题及解决方法_汇总(不定时更新)
查看>>
Microsoft Azure Storage Explorer
查看>>
java step1:基础知识2
查看>>
CSS3中的ul,li; ul li; ul>li
查看>>
第32节:Java中-构造函数,静态方法,继承,封装,多态,包
查看>>
VS2010ReportViewer教程(4)-为报表打造数据源
查看>>