SpringBoot(五)之分布式限流

本文深入探讨了分布式系统中限流的必要性和实现方法,通过自定义注解、SpringAop和RedisCache,详细介绍了如何在集群环境下有效进行限流控制,以应对高并发场景。

分布式限流

单机版中我们了解到 AtomicInteger、RateLimiter、Semaphore 这几种解决方案,但它们也仅仅是单机的解决手段,在集群环境下就透心凉了,后面又讲述了 Nginx 的限流手段,可它又属于网关层面的策略之一,并不能解决所有问题。例如供短信接口,你无法保证消费方是否会做好限流控制,所以自己在应用层实现限流还是很有必要的。

本章目标

利用 自定义注解、Spring Aop、Redis Cache 实现分布式限流….

具体代码

导入依赖

在 pom.xml 中添加上 starter-web、starter-aop、starter-data-redis 的依赖即可,习惯了使用 commons-lang3 和 guava 中的一些工具包…

df66cb73dd795943926c350fb795862d135.jpg

属性配置

在 application.properites 资源文件中添加 redis 相关的配置项

spring.redis.host=localhost
spring.redis.port=6379
spring.redis.password=battcn

Limit 注解(限流)

创建一个 Limit 注解,不多说注释都给各位写齐全了….

8c5a395045ca6dc50a6a4486ff36913b6de.jpg

ac1165006679b1409669c9e109c5e150c07.jpg

RedisTemplate

默认情况下 spring-boot-data-redis 为我们提供了StringRedisTemplate 但是满足不了其它类型的转换,所以还是得自己去定义其它类型的模板….

b1091565eec52477e7624770052bb0bab6d.jpg

Limit 拦截器(AOP)

熟悉 Redis 的朋友都知道它是线程安全的,我们利用它的特性可以实现分布式锁、分布式限流等组件。官方虽然没有提供相应的API,但却提供了支持 Lua 脚本的功能,我们可以通过编写 Lua 脚本实现自己的API,同时他是满足原子性的….

下面核心就是调用 execute 方法传入我们的 Lua 脚本内容,然后通过返回值判断是否超出我们预期的范围,超出则给出错误提示。

由于篇幅问题,分开截图:

LimitInterceptor.java

 

40a3e046b3c9f685b55ddf698a5bb77b236.jpg

16e99510e6bb4acec16d222222d5ff4b217.jpg

bdeae4573c12d2a64cd0d05a043a0b63008.jpg

控制层

在接口上添加 @Limit() 注解,如下代码会在 Redis 中生成过期时间为 100s 的 key = test 的记录,特意定义了一个 AtomicInteger 用作测试…

97fa3d6c0717a6f3d54c1731fba0faee94b.jpg

主函数

8a2440ff1d51ef744f81c95467f0e32ad41.jpg

测试

未达设定的阀值时

4acf6f8e90c825409ddf7278683f143094f.jpg

达到设置的阀值时

506705bc31ffc14c0631edc67772804b453.jpg

 

转载于:https://my.oschina.net/90888/blog/2996677

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值