java中的接口是类吗
319
2023-01-10
本文目录一览:
在我们平时开发过程中,一般一个请求都是需要经过多个微服务的, 比如: 请求从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
高并发系统常用三板斧来保护系统: 缓存 、 降级 和 限流 ,API网关作为所有请求微服务网关限流算法的入口,请求量大,可以通过对并发访问微服务网关限流算法的请求进行限速来保护系统的可用性。
常用的限流算法比如有令牌桶算法,漏桶算法,计数器算法等,在Zuul中微服务网关限流算法我们可以自己去实现限流的功能,Spring Cloud Gateway的出现本身就是用来替代Zuul的,要想替代那肯定得有强大的功能,除了性能上的优势之外,Spring Cloud Gateway还提供了很多新功能,比如限流操作,使用起来非常简单。
目前限流提供了基于Redis的实现,首先引入依赖,
然后就可以以通过KeyResolver来指定限流的Key,比如我们需要根据用户来做限流,IP来做限流等等。
通过exchange对象可以获取到请求信息,这边用了HostName。
通过exchange对象可以获取到请求信息,获取当前请求的用户ID或者用户名,使用这种方式限流,请求路径中必须携带userId参数。
获取请求地址的uri作为限流key。
配置好后就可以进行限流测试了,注意观察redis中的数据。
简述:
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小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~