> metrics = systemPublicMetrics.metrics();
Optional> freeMemoryMetric = metrics.stream()
.filter(t -> "mem.free".equals(t.getName()))
.findFirst();
// 如果不存在这个指标,稳妥起见,返回true,开启限流
if (!freeMemoryMetric.isPresent()) {
return true;
}
long freeMemory = freeMemoryMetric.get()
.getValue()
.longValue();
// 如果可用内存小于700*1024KB,开启流控
System.out.println("-----------------------------------freeMemory="+freeMemory);
return freeMemory < 700*1024L;
}
@Override
public Object run() {
try {
RequestContext context = RequestContext.getCurrentContext();
String key = null;
// 对于service格式的路由,走RibbonRoutingFilter
String serviceId = (String) context.get(SERVICE_ID_KEY);
if (serviceId != null) {
key = serviceId;
map.putIfAbsent(serviceId, RateLimiter.create(50));
}else {
// 对于URL格式的路由,走SimpleHostRoutingFilter
URL routeHost = context.getRouteHost();
if (routeHost != null) {
String url = routeHost.toString();
key = url;
map.putIfAbsent(url, RateLimiter.create(100));
}
}
RateLimiter rateLimiter = map.get(key);
if (!rateLimiter.tryAcquire()) {
accessTokenFail("系统繁忙,请稍后再试!");
}
} catch (Exception e) {
ReflectionUtils.rethrowRuntimeException(e);
}
return null;
}
/**
* 请求失败
* @param message
*/
public void accessTokenFail(String message){
Result result = new Result();
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletResponse response = ctx.getResponse();
ctx.setSendZuulResponse(false);
result.setType(TypeEnum.FAIL.getCode());
result.setMessage(message);
result.setTrue(false);
result.setCode(TypeEnum.rateLimit.getCode());
response.setContentType("application/json;charset=UTF-8");
try {
response.getWriter().write(objectMapper.writeValueAsString(result));
}catch (Exception e){
e.printStackTrace();
}
}
}