注解+redis做限流,诶嘛真香

前言

做项目时提供对外接口,为了防止频繁调用而引起的服务器崩溃,我使用注解+redis做了一个限流的功能,使用之后只能说真香。

功能需求

  • 能通过请求ip地址限流,比如该接口1分钟只能调用10次
  • 能通过请求参数限制流量:比如当user=zhangsan,我们限制其1分钟只能调用20次
  • 当基础注解不能满足时,还能自定义限流策略和实时修改策略。
  • 更高级功能:限流控制台,可以实时查看限流情况和限流策略(暂未实现)。

功能实现

1.定义注解

ip限流注解

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface IpCurrentLimit {

    String[] value() default "*";

    int limit() default 0;

    int second() default 0;

    String returnValue() default "请求频繁,请稍后访问!";

    Class CustomReturnObject() default CustomReturnInvocation.class;

}
复制代码

String[] value(): 需要被限制的ip地址,比如:127.0.0.1 。该值是一个数组可以看出,支持配置多个ip地址。

int limit(): 被限制数。 和second()的值搭配使用,表示多长时间内限制多少次数。

int second(): 时常,单位是秒。和 limit() 的值搭配使用,表示多长时间内限制多少次数。

returnValue(): 返回值提醒。比如限流提醒:请求频繁,请稍后访问!

CustomReturnObject(): 自定义返回值,比如当想返回一个对象时,就需要用到该配置。

参数限流注解

参数限流和ip注解限流大同小异,不同的只是限流的参数不同。分开的原因一是分开使用逻辑更清晰,二是支持多配置限流,比如ip分流和参数限流都可作用于一个方法,方案采用 "熔断器"(Circuit Breaker)模式,当一个策略被满足时,即时触发限流。

@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ParameterCurrentLimit {

    String[] value() default "";
  
    int limit() default 0;
 
    int second() default 0;

    String returnValue() default "请求频繁,请稍后访问!";

    Class CustomReturnObject() default CustomReturnInvocation.class;
}
复制代码

你可能感兴趣的:(redis,java,数据库)