在使用SpringBoot做接口访问如何做接口的限流,这里我们可以使用google的Guava包来实现.

1.在项目中引入Guava相关包

  1. <dependency>
  2. <groupId>com.google.guava</groupId>
  3. <artifactId>guava</artifactId>
  4. <version>23.5-jre</version>
  5. </dependency>

2.创建拦截器

  1. public class AuthInterceptor extends HandlerInterceptorAdapter {
  2. enum LimiterTypeEnum {
  3. DROP,//丢弃
  4. WAIT //等待
  5. }
  6. //限流器
  7. private RateLimiter rateLimiter;
  8. //限流类型
  9. private LimiterTypeEnum limiterType;
  10. /**
  11. * @param permitsPerSecond 限流量 (每秒处理量)
  12. * @param limiterType 限流类型
  13. */
  14. public AuthInterceptor(int permitsPerSecond, LimiterTypeEnum limiterType) {
  15. this.rateLimiter = RateLimiter.create(permitsPerSecond);
  16. this.limiterType = limiterType;
  17. }
  18. /**
  19. * @param permitsPerSecond 每秒新增的令牌数(这个是平滑增长,有一个预热过程)
  20. * @param limiterType 限流类型
  21. */
  22. public AuthInterceptor(double permitsPerSecond, LimiterTypeEnum limiterType) {
  23. this.rateLimiter = RateLimiter.create(permitsPerSecond, 1, TimeUnit.SECONDS);
  24. this.limiterType = limiterType;
  25. }
  26. @Override
  27. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
  28. if (Objects.equals(limiterType, LimiterTypeEnum.DROP)) {
  29. return rateLimiter.tryAcquire(); //false为被限流
  30. } else {
  31. rateLimiter.acquire();//一直等待,直到拿到令牌
  32. return true;
  33. }
  34. }
  35. }

3.添加拦截器

  1. @Configuration
  2. public class AuthHandlerAdapter extends WebMvcConfigurerAdapter {
  3. @Override
  4. public void addInterceptors(InterceptorRegistry registry) {
  5. registry.addInterceptor(new AuthInterceptor(10, AuthInterceptor.LimiterTypeEnum.DROP))
  6. .addPathPatterns("/*");
  7. }
  8. }

4.测试

  • controller```java @RestController public class TestController {

    @GetMapping public String TestGetString() {

    1. return "爱生活,爱java";

    } } ```

  • 并发请求```java public class RequestTest { public static void main(String[] args) {

    1. HttpClient httpClient = new HttpClient("http://127.0.0.1:8080", 2000, 2000);
    2. IntStream.range(0, 1000).forEach(value -> {
    3. testSend(httpClient);
    4. try {
    5. TimeUnit.MILLISECONDS.sleep(100);
    6. } catch (InterruptedException e) {
    7. e.printStackTrace();
    8. }
    9. });

    } public static void testSend(HttpClient httpClient) {

    1. try {
    2. httpClient.sendGet("UTF-8");
    3. } catch (Exception e) {
    4. e.printStackTrace();
    5. }

    } } ```