首页>代码>springboot+mybatis-plus框架实现java web项目公共图片上传接口(图片服务器)>/imgserver/src/main/java/com/npf/imgserver/aspect/RateLimitAop.java
package com.npf.imgserver.aspect;
import com.google.common.util.concurrent.RateLimiter;
import com.npf.imgserver.common.base.ResultBase;
import com.npf.imgserver.common.enums.ResultCodeEnum;
import com.npf.imgserver.utils.JsonUtil;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@Component
@Scope
@Aspect
public class RateLimitAop {
public static final Logger logger = LoggerFactory.getLogger(RateLimitAop.class);
@Autowired
private HttpServletResponse response;
//秒并发限制 50/s
private RateLimiter rateLimiter = RateLimiter.create(50.0);
@Pointcut("@annotation(com.npf.imgserver.aspect.RateLimitAspect)")
public void serviceLimit() {
}
@Around("serviceLimit()")
public Object around(ProceedingJoinPoint joinPoint) {
Boolean flag = rateLimiter.tryAcquire();
Object obj = null;
try {
if (flag) {
obj = joinPoint.proceed();
} else {
ResultBase resultBase = new ResultBase(ResultCodeEnum.RATE_LIMIT_WARN);
String result = JsonUtil.object2json(resultBase);
output(response, result);
}
} catch (Throwable e) {
logger.error("限流信息输出异常", e);
}
return obj;
}
/**
* 限流信息输出
*
* @param response
* @param msg
* @throws IOException
*/
public void output(HttpServletResponse response, String msg) throws IOException {
response.setContentType("application/json;charset=UTF-8");
ServletOutputStream outputStream = null;
try {
outputStream = response.getOutputStream();
outputStream.write(msg.getBytes("UTF-8"));
} catch (IOException e) {
logger.error("限流信息IO异常", e);
} finally {
outputStream.flush();
outputStream.close();
}
}
}
最近下载更多

最近浏览