springcloud中,微服务需要进行限流,以避免流量过大,引起服务宕机
Google的guava工具包,包含RateLimiter,可以实现限流(令牌)
第一步:导入guava包
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>30.1-jre</version>
</dependency>
第二步:创建ControllerLimitInterceptor拦截器类;
@Value("${controllerLimit}")
private Integer controllerLimit;
private RateLimiter rateLimiter =null;
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response, Object handler) throws Exception {
if (null == rateLimiter){
rateLimiter= RateLimiter.create(controllerLimit);
}
if (!rateLimiter.tryAcquire()){
logger.error("流量超限,实行限流");
response.setContentType("application/json;charset=UTF-8");
Result result=new Result();
result.setCode(-1);
result.setMsg("系统繁忙");
response.getOutputStream().write(JSON.toJSONString(result).getBytes());
response.getOutputStream().close();
return false;
}
return true;
}
第三步:拦截器config中添加该拦截器;
@Configuration
public class InterceptorConfig extends WebMvcConfigurerAdapter {
private static Logger logger = LoggerFactory.getLogger(InterceptorConfig.class);
@Resource
private ControllerLimitInterceptor controllerLimitInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(controllerLimitInterceptor).addPathPatterns("/**");
第四步:配置文件中配置限流数量即可。