当前位置:   article > 正文

Redis+Lua脚本+AOP+反射+自定义注解,打造内部基础架构限流组件

Redis+Lua脚本+AOP+反射+自定义注解,打造内部基础架构限流组件

1.开发自定义限流注解给全团队赋能共用,一个注解搞定

2.可配置【时间窗口内可以随意灵活调整时间和次数】 + 可拔插

3.支持高并发【redis下干的】且满足事务一致性要求,lua脚本

注意!限流是在Controller层做的,不要干到Service层【做业务逻辑的】

1.自定义注解RedisLimitAnnotation实现业务解耦

2.高并发实时配置下的LuaScript处理

3.自定义AOP切面类

RedisLimitController

  1. @Slf4j
  2. @RestController
  3. public class RedisLimitController{
  4. @GetMapping("/redis/limit/test")
  5. public String redisLimit(){
  6. return "业务正常返回,订单流水:" + IdUtil.fastUUID();
  7. }
  8. }

限流后

时间窗口在这等价于redis 的 key的过期时间

  1. @Slf4j
  2. @RestController
  3. // 1秒内只允许2个人点击
  4. @RedisLimitAnnotation(key = "redis-limit:test" , permitsPerSecond = 2,expire = 1, msg = "当前排队人数过多,请稍后再试!")
  5. public class RedisLimitController{
  6. @GetMapping("/redis/limit/test")
  7. public String redisLimit(){
  8. return "业务正常返回,订单流水:" + IdUtil.fastUUID();
  9. }
  10. }

RedisConfig

redis序列化的工具配置类【一定要开启】

  1. public class RedisConfig{
  2. // 执行 keys *
  3. // 野生:"\xac\xed\x00\aord:102" 序列化后:"ord:102"
  4. @Bean
  5. public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactor){
  6. RedisTemplate<String,Object> redisTemplate = new RedisTemplate<>();
  7. redisTemplate.setConnectionFactory(redisConnectionFactor);
  8. // 设置key序列化方式String
  9. redisTemplate.setKeySerializer(new StringRedisSerializer());
  10. // 设置value的序列化方式json,使用GenericJackson2JsonRedisSerializer替换默认序列化
  11. redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
  12. redisTemplate.setHashKeySerializer(new StringRedisSerializer());
  13. redisTemplate.setHashValueSerializer(new GenericJackson2JsonRedisSerializer());
  14. redisTemplate.afterPropertiesSet();
  15. return redisTemplate;
  16. }
  17. }

RedisLimitAnnotation

  1. @Retentiom(RetentionPolicy.RUNTIME)
  2. @Target({ElementType.METHOD})
  3. @Document
  4. public @interface RedisLimitAnnotation{
  5. // 资源key唯一,不同接口不同流量控制 模拟Sentinel资源key resource
  6. String key() default "";
  7. // 最多访问限制次数
  8. long permitsPerSecond() default 2;
  9. // 过期时间 滑动窗空时间 单位秒 默认60
  10. long expire() default 60;
  11. // 得不到令牌提示语
  12. String msg() default "系统繁忙 点击太快请稍后重试";
  13. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/335781
推荐阅读
相关标签
  

闽ICP备14008679号