微服务网关限流算法(微服务网关集群)

网友投稿 297 2023-01-10


本篇文章给大家谈谈微服务网关限流算法,以及微服务网关集群对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享微服务网关限流算法的知识,其中也会对微服务网关集群进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Spring Cloud Zuul微服务网关的API限流

微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。

微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,这里有一个基于zuul微服务网关的API限流库:

https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit

比如我们要对 user-service 这个服务进行限流,限制每个请求源每分钟最多只能请求10次。

首先在项目中添加 spring-cloud-zuul-ratelimit 依赖:

然后再添加如下配置即可:

对API限流是基于Zuul过滤器完成的,默认情况下限流数据是记录在内存中的,实际上是用ConcurrentHashMap保存,当然也提供了多种存储方式,包括Redis、Consul、Spring Data JPA,使用这三种存储方式要添加相关依赖。

然后再添加存储配置,比如使用Redis的配置:

限流过滤器是在请求被转发之前调用的

限流类型主要包括url、origin、user三种

在过滤器的run方法中判断请求剩余次数,小于0就拦截请求:

可以看到,单位时间内剩余请求次数小于0时抛出ZuulRuntimeException,直接返回客户端TOO_MANY_REQUESTS异常消息,达到拦截请求的效果。

https://github.com/yunTerry/spring-cloud-netflix

Spring Cloud Gateway 网关限流

在我们平时开发过程中,一般一个请求都是需要经过多个微服务的, 比如: 请求从A服务流过B服务,如果A服务请求过快,导致B服务响应慢,那么必然会导致系统出现问题。因为,我们就需要有限流操作。

限流的key 生成规则,默认是 PrincipalNameKeyResolver 来实现
限流算法,默认是 RedisRateLimiter 来实现,是令牌桶算法。

在 Spring Cloud Gateway 中默认提供了 RequestRateLimiter 过滤器来实现限流操作。

配置文件中的写法(部分)

配置文件中的写法(部分)

注意⚠️:
这个类需要加上 @Primary 注解。

https://gitee.com/huan1993/spring-cloud-alibaba-parent/tree/master/gateway-redis-limiter

1、 https://docs.spring.io/spring-cloud-gateway/docs/current/reference/html/#the-redis-ratelimiter

限流和常见的三种算法

限流的三种算法
https://www.cnblogs.com/forezp/p/10140316.html

限流要解决的问题

典型限流的应用场景微服务网关限流算法

如何限流?
一般网关都有这种功能。 gateway、nginx、zuul等

限流:一定时间内微服务网关限流算法,只允许N次请求。
从计算机友好的角度出发微服务网关限流算法,是希望能在单位时间内均摊掉请求,使用漏斗算法可以达到这种效果。
但是漏斗算法有个弊端,就是先快后慢的这种请求,那么峰值的请求也只能排队等待被消费。实际上计算机是具备一定的高并发处理能力的,只要不是一直处于高并发下即可。所以 计数器限流和 漏洞限流折中的算法,令牌限流成为现在最主流的算法。

(Redis 结合expire方案可以实现)
第一次请求开始计时,例如1s以内,达到100次请求就拒绝访问了,直到1s过后,重新开始计数。

优点:

缺点:短暂的峰值过高对服务器不友好。服务器希望能把请求尽量的均摊开来,这样可以充分利用计算机资源。

消费的速度是恒定的,对于服务器而言是最友好的。
在算法实现方面,可以准备一个队列,用来保存请求,另外通过一个线程池(ScheduledExecutorService)来定期从队列中获取请求并执行,可以一次性获取多个并发执行。
参数:消费速度、桶容量(超过就抛弃,可以避免内存过大,有过多的等待的任务)

优点:

缺点:

令牌桶算法是比较常见的限流算法之一,大概描述如下:
1)所有的请求在处理之前都需要拿到一个可用的令牌才会被处理;
2)根据限流大小,设置按照一定的速率往桶里添加令牌;
3)桶设置最大的放置令牌限制,当桶满时、新添加的令牌就被丢弃活着拒绝;
4)请求达到后首先要获取令牌桶中的令牌,拿着令牌才可以进行其微服务网关限流算法他的业务逻辑,处理完业务逻辑之后,将令牌直接删除;
5)令牌桶有最低限额,当桶中的令牌达到最低限额的时候,请求处理完之后将不会删除令牌,以此保证足够的限流;

这种算法,既可以保证系统由一定的高并发能力,比如当前令牌桶容量是100,一开始直接消费掉100个请求。有保证服务器不会因为短暂的爆发,而导致server端空闲,因为令牌桶还会持续的生产令牌。

既有一定的并发能力,又不至于完全失去控制,可控的兼具并发力和流量控制的限流算法.是计数器算法(一定的并发处理能力)和漏洞限流(高峰过后仍然会持续的产生令牌)的折中算法。

Spring Cloud Gateway 之限流操作

高并发系统常用三板斧来保护系统: 缓存 、 降级 和 限流 ,API网关作为所有请求微服务网关限流算法的入口,请求量大,可以通过对并发访问微服务网关限流算法的请求进行限速来保护系统的可用性。

常用的限流算法比如有令牌桶算法,漏桶算法,计数器算法等,在Zuul中微服务网关限流算法我们可以自己去实现限流的功能,Spring Cloud Gateway的出现本身就是用来替代Zuul的,要想替代那肯定得有强大的功能,除了性能上的优势之外,Spring Cloud Gateway还提供了很多新功能,比如限流操作,使用起来非常简单。

目前限流提供了基于Redis的实现,首先引入依赖,

然后就可以以通过KeyResolver来指定限流的Key,比如我们需要根据用户来做限流,IP来做限流等等。

通过exchange对象可以获取到请求信息,这边用了HostName。

通过exchange对象可以获取到请求信息,获取当前请求的用户ID或者用户名,使用这种方式限流,请求路径中必须携带userId参数。

获取请求地址的uri作为限流key。

配置好后就可以进行限流测试了,注意观察redis中的数据。

SpringCloud使用Zuul限流(spring-cloud-zuul-ratelimit)

简述:
Spring Cloud Zuul RateLimit项目Github地址:
https://github.com/marcosbarbero/spring-cloud-zuul-ratelimit
该包实现了在Zuul对每个服务进行限流

微服务开发中有时需要对API做限流保护,防止网络攻击,比如做一个短信验证码API,限制客户端的请求速率能在一定程度上抵御短信轰炸攻击,降低损失。微服务网关是每个请求的必经入口,非常适合做一些API限流、认证之类的操作,本文介绍Zuul如何进行限流操作

个人建议:如果在网关做细粒度的限流,后面微服务业务变化的话网关也要跟着变,而且后面涉及到微服务之间的调用,这个网关限流做不了。所以在网关上不能做细粒度的限流,网关主要为服务器硬件设备的并发处理能力做限流,细粒度的限流还是交给专门的熔断限流微服务去处理,这样利于各微服务之间的解构和各团队的协同开发

1、限流策略

2、可用的实现

Bucket4j实现需要相关的bean @Qualifier("RateLimit"):

3、常见的配置属性

policy的相关属性

4、发生错误如何处理

1、导入依赖

2、启动类标注解

3、配置文件

4、启动后进行访问
由于我们配置的是一秒只允许3个请求,当我们超过时,会抛出过多请求异常

5、自定义Key策略
如果希望自己控制key的策略,可以通过自定义RateLimitKeyGenerator的实现来增加自己的策略逻辑。

实例:

根据请求上的参数来对请求进行限流。比如有一个请求是 http://localhost:9070/api-a//hello2?name=kevin ,对相同的name值进行限流。我们设置了1分钟内,限流10次,那么如果1分钟内,name是kevin的请求超过10次,就会发生限流。

自定义RateLimitKeyGenerator的实现:

到此本文就结束啦!
参考:

关于微服务网关限流算法和微服务网关集群的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 微服务网关限流算法的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于微服务网关集群、微服务网关限流算法的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:spring中通过ApplicationContext getBean获取注入对象的方法实例
下一篇:JAVA线程池原理实例详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~