spring-base-parent

spring-base-limit

概览

使用说明

  1. 需要在启动类添加@EnableLimitCheck注解
     //默认基于redis,如果应用配置多个StringRedisTemplate,需要配置redisTemplateName属性指定bean
     //如果不想基于redis实现,可以不配置redisTemplateName属性
     @EnableLimitCheck(redisTemplateName = "stringRedisTemplate")
     public class DemoApplication  {
     }
    
  2. 注解调用示例如下,默认Spel表达式解析器,可配置其他key解析器,定义keyResolver即可
     //当前示例场景:默认TIME_WINDOW时间窗口限流,300秒只能调用1次
     @LimitCheck(key = "'GY:LIMIT:TEST:' + #user.name", limit = 1, time = 300)
     public void test(User user){
         System.out.println("------------>>>>>>>>"+user);
     }
       
     //当前示例场景:TOKEN_BUCKET令牌桶限流,最大并发数为100,QPS限制为50
     @LimitCheck(key = "'GY:LIMIT:TEST:' + #user.name", limit = 50, capacity = 100, typeEnum = LimitTypeEnum.TOKEN_BUCKET)
     public void test(User user){
         System.out.println("------------>>>>>>>>"+user);
     }
       
     //当前示例场景:SLIDING_WINDOW滑动窗口限流,每秒500次
     @LimitCheck(key = "'GY:LIMIT:TEST:' + #user.name", limit = 500, time = 1, typeEnum = LimitTypeEnum.SLIDING_WINDOW)
     public void test(User user){
         System.out.println("------------>>>>>>>>"+user);
     }
    
  3. 限流降级行为,默认会抛出LimitException异常,可以针对此异常自定义返回信息,也可自定义降级函数fallback,优先级高于异常处理
    • 降级函数在当前bean ```java //降级函数fallback定义示例 @LimitCheck(key = “‘GY:LIMIT:TEST:’ + #user.name”, limit = 1, time = 300, fallback = “fallbackMethod1”) public void test(User user){ System.out.println(“————»»»»“+user); }

    //场景一:降级fallback方法带原参数+LimitException public void fallbackMethod1(User user, LimitException e){ System.out.println(“fallback————»»»»“+user); }

    //场景二:降级fallback方法带原参数,无LimitException public void fallbackMethod2(User user){ System.out.println(“fallback————»»»»“+user); }

           - 降级函数在其他bean
     ```java
     //降级函数fallback和fallbackBean定义示例
     @LimitCheck(key = "'GY:LIMIT:TEST:' + #user.name", limit = 1, time = 300, fallback = "fallbackMethod3", fallbackBean = FallbackHandler.class)
     public void test(User user){
         System.out.println("------------>>>>>>>>"+user);
     }
        
     @Component
     public class FallbackHandler  {
         //场景三:降级fallback方法带原参数+LimitException
         public void fallbackMethod3(User user, LimitException e){
             System.out.println("fallback------------>>>>>>>>"+user);
         }
            
         //场景四:降级fallback方法带原参数,无LimitException
         public void fallbackMethod4(User user){
             System.out.println("fallback------------>>>>>>>>"+user);
         }
     }
    
  4. 动态设置限流大小
    • limitExpression:限制数量表达式,支持SpEL或${spring.xxx},优先级高于limit
    • capacityExpression:令牌桶容量表达式,支持SpEL或${spring.xxx},优先级高于capacity
       //表达式配置示例
       @LimitCheck(key = "'GY:LIMIT:TEST:' + #user.name", limitExpression = "${limitCheck.limit:1}", time = 300, fallback = "fallbackMethod3", fallbackBean = FallbackHandler.class)
       public void test(User user){
         System.out.println("------------>>>>>>>>"+user);
       }