接口限流

项目中@Limit注解可以实现接口的限流。即规定一段时间内最多可以访问该接口的次数,超过这个次数则拒绝访问。@Limit注解如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import cc.mrbird.common.domain.LimitType;
import java.lang.annotation.*;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface Limit {
// 资源名称,用于描述接口功能
String name() default "";
// 资源 key
String key() default "";
// key prefix
String prefix() default "";
// 时间的,单位秒
int period();
// 限制访问次数
int count();
// 限制类型
LimitType limitType() default LimitType.CUSTOMER;
}

其中,limitType包含传统类型限流和根据IP限流,其为枚举类型:

1
2
3
4
5
6
public enum LimitType {
// 传统类型
CUSTOMER,
// 根据 IP 限制
IP;
}

下面举个使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import cc.mrbird.common.annotation.Limit;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.atomic.AtomicInteger;

@RestController
public class TestController {

private static final AtomicInteger ATOMIC_INTEGER = new AtomicInteger();

@Limit(key = "test", period = 600, count = 10, name = "resource", prefix = "limit")
@GetMapping("/test")
public int testLimiter() {
return ATOMIC_INTEGER.incrementAndGet();
}
}

上面配置表示使用传统限流的方式,testLimiter方法在600秒内最多只能访问10次。当600秒内第11次访问该接口时,接口返回{"msg":"接口访问超出频率限制","code":500}


© 2017 - 2018  MrBird & Hosted by Coding Pages