热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

java高级进阶|单机版限流之Ratelimiter

0x01,感悟好早之前写的一篇文章了,当时的感悟是,为什么要一直写文章呢?我也不知道,可能是为了将自己的内容做

0x01,感悟

好早之前写的一篇文章了,当时的感悟是,为什么要一直写文章呢?我也不知道,可能是为了将自己的内容做下总结吧,其实写的文章可能会用的很少,因为现在的项目基本上都有成熟的框架了,全新搭建一个项目或许很少,所以总觉得写了也没有什么意义,但是就是为了总结一下,以后用这些文章的时候可以翻阅查找。

0x02,文章整理

这篇文章的内容是自己在18年的时候写了一下示例程序,但是没有将它整理成文章,所以这里就简单整理了一下,顺便用了一下测试工具jmeter,很简单,毕竟不是专业的测试工具,若后面需要再继续看下jmeter的用法吧,这里就先有个概念。

0x03,拦截器和限流组件的整合

本文基于拦截器和guava提供的Ratelimiter进行请求的限流的示例程序的模拟的,文章整合起来很简单,限流主要为了防止过量的请求对服务器造成的压力而拒绝服务了,所以这里就简单模拟了一下,具体的示例程序如下。

0x04,需要的jar包依赖信息

org.springframework.bootspring-boot-starter-webcom.google.guavaguava27.1-jre

0x05,示例程序

其次就是编写拦截器和注册拦截器的示例程序了。

package com.wpw.springbootratelimiter;import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public abstract class AbstractIntercepter extends HandlerInterceptorAdapter {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {return preHandle(request);}protected abstract boolean preHandle(HttpServletRequest request);
}
package com.wpw.springbootratelimiter;import com.google.common.util.concurrent.RateLimiter;
import org.springframework.stereotype.Component;import javax.servlet.http.HttpServletRequest;@Component
public class RatelimiterInterceptor extends AbstractIntercepter {private static final RateLimiter rateLimiter = RateLimiter.create(1);@Overrideprotected boolean preHandle(HttpServletRequest request) {if (!rateLimiter.tryAcquire()) {System.out.println("稍后重试");return false;}System.out.println("获取许可成功");return true;}
}
package com.wpw.springbootratelimiter;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;@Component
public class WebMvcConfigurationSupport implements WebMvcConfigurer {@Autowiredprivate RatelimiterInterceptor ratelimiterInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(ratelimiterInterceptor);}
}
package com.wpw.springbootratelimiter;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;/*** @author wpw*/
@RestController
public class UserController {@GetMapping(value = "/hello")public String hello() {return "access success";}
}

0x06,测试工具的使用

测试程序可以基于postman测试工具测试,不过为了模拟并发的请求,这里采用了jemeter进行了测试,截个图,不会jemeter的可以自己看下教程,这里就不做演示了。

看到后台的日志信息打印,发现了下面的重试信息的输出,说明我们的限流作用起作用了

0x07,总结

理解限流可以去理解火车站排队的场景或者去景点玩的场景,这里就不过多介绍了,这里自己就是为了总结一下和回顾一下自己的知识点,梳理一下。



推荐阅读
author-avatar
任乔彦
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有