「java网关限流」java限流算法
今天给各位分享java网关限流的知识,其中也会对java限流算法进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!
本文目录一览:
- 1、SpringCloud系列之网关gateway-14.网关层的其他妙用 - 限流
- 2、云南java课程分享分布式限流的运行原理
- 3、又被面试官装到了:Spring Cloud Gateway 网关限流怎么做?
SpringCloud系列之网关gateway-14.网关层的其他妙用 - 限流
这里采用令牌桶计数的方式做限流,总共分三步
我们的Best Practice是基于Redis来实现限流,因此要保证本地启动了Redis服务。同时将下列配置加入到Gateway的配置文件中:
这里是配置Redis连接信息的,假如你不配置的话,Gateway也会尝试用默认配置项来连接Redis。但如果你在Redis配置信息中提供了错误的IP或者Port的话,调用方法时依然会成功,不过限流功能就失效了,因为底层的Netty服务无法连接到Redis,也就无法提供限流支持。但Gateway为了保证服务可用性,限流功能的异常并不会阻碍正常的方法调用。
Gateway的限流组件要求定义一个Key Resolver用来对每次路由请求生成一个Key,这个Key就是一个限流分组的标识,每个Key相当于一个令牌桶。假如我们限定了一个服务每秒只能被调用3次,这个限制会对不同的Key单独计数,我们把调用方机器的Host Name作为限流Key,那么来自同一台机器的调用将落到同一个Key下面,也就是说在这个场景下,每台机器都独立计算单位时间调用量。
创建Key Resolver的方式很简单:
上面的例子创建了基于Host Name的令牌生成器,我们可以根据自己的业务来选择合适的Key,比如说可以在接口层面做限流(使用接口的Path作为Key),还可以从Request中提取业务字段作为Key(比如用户ID等)。
在上面的限流配置中,我们主要关注最后3行中的属性:
key-resolver:这里注入的就是在上一步中我们定义的Key Resolver,它使用SpEL表达式从Spring上下文中获取指定Bean
replenishRate:令牌桶每秒的平均填充速度
burstCapacity:令牌桶总量
假如我们不想依赖Redis的话,还有其他选择方案吗?必须有,但是要靠大家自己动动手。如果大家想借助其他存储介质实现限流,可以参考RedisRateLimiter这个类的实现,通过继承AbstractRateLimiter来创建一个自定义的计数器。
云南java课程分享分布式限流的运行原理
分布式编程架构技术我们在前几期的文章中已经给大家简单分析过很多次了,今天我们就一起来了解一下API网关分布式限流的运行原理都有哪些。
API网关中针对一个API、API分组、接入应用APPID,IP等进行限流。这些限流条件都将会产生一个限流使用的key,在后续的限流中都是对这个key进行限流。
限流算法通常在API网关中可以采用令牌桶算法实现。
必须说明一点的是分布式限流由于有网络的开销,TPS的支持隔本地限流是有差距的,因此在对于TPS要求很高的场景,建议采用本地限流进行处理。
下面讨论我们应该采用redis的哪一种分布式锁的方案:
由于redis事务要得到锁的效果需要在高TPS时会产生大量的无效的访问请求,所以不建议在这种场景下使用。
SETNX/EX的锁方案会产生在过期时间的问题,同时也有异步复制master数据到slave的问题。相比lua方案会产生更多的不稳定性。
我建议采用lua的方案来实施分布式锁,因为都是单进程单线程的执行,因此在TPS上和二种方案没有大的区别,而且由于只是一个lua脚本在执行,甚至是可能纯lua执行可能会有更高的TPS。当然是lua脚本中可能还是会去设置过期时间,但是应用server宕机并不会影响到redis中的锁。当然master异步复制的问题还是有,但是并不会造成问题,因为数据只会有1个lua脚本执行问题,下一个执行就正常了。
在实现方案的时候使用了Jedis库,云南java课程认为有一些问题在方案的实现层面我已经去做过验证了,可能也会是读者的疑问。
又被面试官装到了:Spring Cloud Gateway 网关限流怎么做?
在我们平时开发过程中,一般一个请求都是需要经过多个微服务的, 比如: 请求从A服务流过B服务,如果A服务请求过快,导致B服务响应慢,那么必然会导致系统出现问题。因为,我们就需要有限流操作。
限流的key 生成规则,默认是 PrincipalNameKeyResolver来实现 限流算法,默认是 RedisRateLimiter来实现,是令牌桶算法。
在Spring Cloud Gateway中默认提供了 RequestRateLimiter 过滤器来实现限流操作。
1.引入jar包
2.编写配置文件
3.网关正常响应
4.网关限流响应
1.自定义限流key
配置文件中的写法(部分)
2.自定义限流算法
配置文件中的写法(部分)
注意⚠️: 这个类需要加上 @Primary 注解。
3.配置文件中的写法
关于java网关限流和java限流算法的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-04,除非注明,否则均为
原创文章,转载请注明出处。