流量限制架构
示例代码
//一分钟同一个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);
}
}
使用方法
@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; }
实现效果
使用技巧
可以用在限流接口、短信验证码接口、限时抢购接口,防止接口被攻击。一般短信验证码比如60秒一次,那么这边限制50秒或者55秒配置。