Python 官方文档:入门教程 => 点击学习
本文实例为大家分享了Java实现接口限流方案的具体代码,供大家参考,具体内容如下 RateLimiter Google开源工具包Guava提供了限流工具类RateLimiter,基于
本文实例为大家分享了Java实现接口限流方案的具体代码,供大家参考,具体内容如下
RateLimiter
Google开源工具包Guava提供了限流工具类RateLimiter,基于令牌桶算法实现。
<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>27.1-jre</version>
</dependency>
import java.lang.annotation.*;
import java.util.concurrent.TimeUnit;
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestLimiter {
double QPS() default 10D;
long timeout() default 500;
TimeUnit timeunit() default TimeUnit.MILLISECONDS;
String msg() default "请稍后再试!";
}
import com.alibaba.fastJSON.jsON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.util.concurrent.RateLimiter;
import com.tiam.panshi.cloud.appback.annotation.RequestLimiter;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.WEB.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.Http.httpservletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.PrintWriter;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
@Component
@Slf4j
public class RequestLimitingInterceptor implements HandlerInterceptor {
private final Map<String, RateLimiter> rateLimiterMap = new ConcurrentHashMap<>();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
//这里可以抽出去定义返回信息
JSONObject jsonObject = new JSONObject();
jsonObject.put("10001", "玩命加载中,请稍后再试");
try {
if (handler instanceof HandlerMethod) {
HandlerMethod handlerMethod = (HandlerMethod) handler;
RequestLimiter rateLimit = handlerMethod.getMethodAnnotation(RequestLimiter.class);
//判断是否有注解
if (rateLimit != null) {
// 获取请求url
String url = request.getRequestURI();
RateLimiter rateLimiter;
// 判断map集合中是否有创建好的令牌桶
if (!rateLimiterMap.containsKey(url)) {
// 创建令牌桶,以n r/s往桶中放入令牌
rateLimiter = RateLimiter.create(rateLimit.QPS());
rateLimiterMap.put(url, rateLimiter);
}
rateLimiter = rateLimiterMap.get(url);
// 获取令牌
boolean acquire = rateLimiter.tryAcquire(rateLimit.timeout(), rateLimit.timeunit());
if (acquire) {
//获取令牌成功
return true;
} else {
log.warn("请求被限流,url:{}", request.getServletPath());
makeResult(response, renderJson(jsonObject));
return false;
}
}
}
return true;
} catch (Exception var6) {
var6.printStackTrace();
makeResult(response, renderJson(jsonObject));
return false;
}
}
private void makeResult(HttpServletResponse response, JSONObject jo) {
response.setContentType("application/json; charset=utf-8");
response.setCharacterEncoding("UTF-8");
try (PrintWriter out = response.getWriter()) {
out.append(jo.toJSONString());
} catch (Exception e) {
e.printStackTrace();
}
}
private JSONObject renderJson(Object o) {
return JSONObject.parseObject(JSON.toJSONString(o));
}
@Configuration
public class WebmvcConfig extends WebMvcConfigurationSupport {
@Autowired
protected RequestLimitingInterceptor requestLimitingInterceptor;
@Override
public void addInterceptors(InterceptorReGIStry registry) {
// 请求限流
registry.addInterceptor(requestLimitingInterceptor).addPathPatterns("/**");
}
}
@RequestLimiter(QPS = 5D, timeout = 200, timeunit = TimeUnit.MILLISECONDS,msg = "玩命加载中,请稍后再试")
@GetMapping("/test")
@ResponseBody
public String test(){
return "";
}
--结束END--
本文标题: Java实现接口限流方案
本文链接: https://www.lsjlt.com/news/158316.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-03-01
2024-03-01
2024-03-01
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
2024-02-29
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0