微服务网关用限流算法(常用限流算法)

网友投稿 234 2022-12-31


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

本文目录一览:

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

对于微服务的容错性设计,常见的有哪几种策略

对于微服务的容错性设计,常见的有以下四种策略:

1、隔离:

线程池隔离。线程池隔离就是通过Java的线程池进行隔离,B服务调用C服务给予固定的线程数量比如12个线程,如果此时C服务宕机了就算大量的请求过来,调用C服务的接口只会占用12个线程不会占用其他工作线程资源,因此B服务就不会出现级联故障。

信号量隔离。隔离信号量隔离是使用Semaphore来实现的,当拿不到信号量的时候直接拒接因此不会出现超时占用其他工作线程的情况。

2、熔断:

当下游的服务因为某种原因突然变得不可用或响应过慢,上游服务为了保证自己整体服务的可用性,不再继续调用目标服务,直接返回,快速释放资源。如果目标服务情况好转则恢复调用。

3、降级:

降级是指当自身服务压力增大时,系统将某些不重要的业务或接口的功能降低,可以只提供部分功能,也可以完全停止所有不重要的功能。

4、限流:

限流,就是限制最大流量。系统能提供的最大并发有限,同时来的请求又太多,就需要限流。

漏桶算法。漏桶算法的思路,一个固定容量的漏桶,按照常量固定速率流出水滴。如果桶是空的,则不需流出水滴。可以以任意速率流入水滴到漏桶。如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。

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小时内删除侵权内容。

上一篇:关于python实现接口的信息
下一篇:包含四方支付系统接口设计的词条
相关文章

 发表评论

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