流量限制架构

示例代码

    //一分钟同一个ip请求1次
    @LimitPoint(name = "sms_send", key = "sms")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "path", dataType = "String", name = "mobile", value = "手机号"),
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "uuid", value = "uuid"),
    })
    @GetMapping("/{verificationEnums}/{mobile}")
    @ApiOperation(value = "发送短信验证码")
    public ResultMessage getSmsCode(
            @RequestHeader String uuid,
            @PathVariable String mobile,
            @PathVariable VerificationEnums verificationEnums) {
        if (verificationService.check(uuid, verificationEnums)) {
            smsUtil.sendSmsCode(mobile, verificationEnums, uuid);
            return ResultUtil.success(ResultCode.VERIFICATION_SEND_SUCCESS);
        } else {
            return ResultUtil.error(ResultCode.VERIFICATION_SMS_EXPIRED_ERROR);
        }
    }

使用方法

  1. @Limit 限流注解,提供的参数有:

    /**
     * 限流注解
     *
     * @author Chopper
     * @since 2018-02-05
     */
    @Target({ElementType.METHOD, ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    @Inherited
    @Documented
    public @interface LimitPoint {
        /**
         * 资源的名字 无实际意义,但是可以用于排除异常
         *
         * @return String
         */
        String name() default "";
    
        /**
         * 资源的key
         * <p>
         * 如果下方 limitType 值为自定义,那么全局限流参数来自于此
         * 如果limitType 为ip,则限流条件 为 key+ip
         *
         * @return String
         */
        String key() default "";
    
        /**
         * Key的prefix redis前缀,可选
         *
         * @return String
         */
        String prefix() default "";
    
        /**
         * 给定的时间段 单位秒
         *
         * @return int
         */
        int period() default 60;
    
        /**
      * 最多的访问限制次数
         *
         * @return int
         */
        int limit() default 10;
    
        /**
         * 类型  ip限制 还是自定义key值限制
         * 建议使用ip,自定义key属于全局限制,ip则是某节点设置,通常情况使用IP
         *
         * @return LimitType
         */
        LimitType limitType() default LimitType.IP;
    }
    

实现效果

image-20200616122357697

使用技巧

可以用在限流接口、短信验证码接口、限时抢购接口,防止接口被攻击。一般短信验证码比如60秒一次,那么这边限制50秒或者55秒配置。

results matching ""

    No results matching ""