SpringMVC 限流的示例代码

2025-05-27 0 76

在使用SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现,当然我们也可以自己实现限流,Guava中的限流是久经考验的我们没必需重新再去写一个,如果想了解限流原理的同学可以自己查阅一下相关的资料,本文不作过来说明噢。

使用说明

在项目中引入Guava相关包

http://mvnrepository.com/artifact/com.google.guava/guava/21.0

maven项目

?

1

2

3

4

5

6
<!-- https://mvnrepository.com/artifact/com.google.guava/guava -->

<dependency>

<groupId>com.google.guava</groupId>

<artifactId>guava</artifactId>

<version>21.0</version>

</dependency>

gradle项目

?

1

2
// https://mvnrepository.com/artifact/com.google.guava/guava

compile group: 'com.google.guava', name: 'guava', version: '21.0'

写一个SpringMVC的拦截器

SmoothBurstyInterceptor.java

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77
import com.google.common.util.concurrent.RateLimiter;

import org.springframework.web.servlet.ModelAndView;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.util.concurrent.TimeUnit;

public class SmoothBurstyInterceptor extends HandlerInterceptorAdapter {

public enum LimitType {

DROP,//丢弃

WAIT //等待

}

/**

* 限流器

*/

private RateLimiter limiter;

/**

* 限流方式

*/

private LimitType limitType = LimitType.DROP;

public SmoothBurstyInterceptor() {

this.limiter = RateLimiter.create(10);

}

/**

* @param tps 限流量 (每秒处理量)

* @param limitType 限流类型:等待/丢弃(达到限流量)

*/

public SmoothBurstyInterceptor(int tps, SmoothBurstyInterceptor.LimitType limitType) {

this.limiter = RateLimiter.create(tps);

this.limitType = limitType;

}

/**

* @param permitsPerSecond 每秒新增的令牌数

* @param limitType 限流类型:等待/丢弃(达到限流量)

*/

public SmoothBurstyInterceptor(double permitsPerSecond, SmoothBurstyInterceptor.LimitType limitType) {

this.limiter = RateLimiter.create(permitsPerSecond, 1000, TimeUnit.MILLISECONDS);

this.limitType = limitType;

}

@Override

public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

if (limitType.equals(LimitType.DROP)) {

if (limiter.tryAcquire()) {

return super.preHandle(request, response, handler);

}

} else {

limiter.acquire();

return super.preHandle(request, response, handler);

}

throw new Exception("网络异常!");//达到限流后,往页面提示的错误信息。

}

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

super.postHandle(request, response, handler, modelAndView);

}

@Override

public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

super.afterCompletion(request, response, handler, ex);

}

public RateLimiter getLimiter() {

return limiter;

}

public void setLimiter(RateLimiter limiter) {

this.limiter = limiter;

}

}

SpringMVC拦截配置

WebConfig.java

?

1

2

3

4

5

6

7

8

9

10

11

12
@Component

public class WebConfig extends WebMvcConfigurerAdapter {

@Override

public void addInterceptors(InterceptorRegistry registry) {

// 多个拦截器组成一个拦截器链

registry.addInterceptor(new SmoothBurstyInterceptor(100, SmoothBurstyInterceptor.LimitType.DROP)).addPathPatterns("/**");

//限流可配置为SmoothBurstyInterceptor.LimitType.DROP丢弃请求或者SmoothBurstyInterceptor.LimitType.WAIT等待,100为每秒的速率

super.addInterceptors(registry);

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持快网idc。

原文链接:http://blog.csdn.net/dounine/article/details/71439809

收藏 (0) 打赏

感谢您的支持,我会继续努力的!

打开微信/支付宝扫一扫,即可进行扫码打赏哦,分享从这里开始,精彩与您同在
点赞 (0)

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

快网idc优惠网 建站教程 SpringMVC 限流的示例代码 https://www.kuaiidc.com/76993.html

相关文章

发表评论
暂无评论