我正在针对Spring Cloud应用程序进行性能测试。当并发用户数超过150时,它开始提供“转发错误”
{"timestamp":1458685370986,"status":500,"error":"Internal Server Error","exception":"com.netflix.zuul.exception.ZuulException","message":"Forwarding error"}
我应该调整哪个参数来摆脱错误?
答案 0 :(得分:1)
您应该发布您的日志以查找错误,但我们只能猜出确切的错误是什么。由Forwarding error
报告的ZuulExcetption
是一般错误。
请参阅此链接,了解实际报告此错误的RibbonRoutingFilter.forward()方法。我在这里添加代码用于备份。
private HttpResponse forward(RestClient restClient, String service, Verb verb, String uri, Boolean retryable,
MultiValueMap<String, String> headers, MultiValueMap<String, String> params,
InputStream requestEntity) throws Exception {
Map<String, Object> info = this.helper.debug(verb.verb(), uri, headers, params,
requestEntity);
RibbonCommand command = new RibbonCommand(service, restClient, verb, uri, retryable,
headers, params, requestEntity);
try {
HttpResponse response = command.execute();
this.helper.appendDebug(info, response.getStatus(),
revertHeaders(response.getHeaders()));
return response;
}
catch (HystrixRuntimeException ex) {
info.put("status", "500");
if (ex.getFallbackException() != null
&& ex.getFallbackException().getCause() != null
&& ex.getFallbackException().getCause() instanceof ClientException) {
ClientException cause = (ClientException) ex.getFallbackException()
.getCause();
throw new ZuulException(cause, "Forwarding error", 500, cause
.getErrorType().toString());
}
throw new ZuulException(ex, "Forwarding error", 500, ex.getFailureType()
.toString());
}
}
正如您所看到的,只有可以生成错误的可行位置在command.execute()
中,其中command是HystrixCommand
的实例。以下是HystrixCommand
中execute() method的链接。
以下是备份代码。
public R execute() {
try {
return queue().get();
} catch (Exception e) {
throw decomposeException(e);
}
}
此处queue()
是Future instance
Future可能发生的最常见错误是超时异常。由于此处Future
实例queue()
不受任何timetout值的约束,因此它可以继续等待。
然而,大多数使用Future
的API都有一个线程监视它们所花费的时间,并在一段时间后中断它。同样由Ribbon
完成。
如果您确实是超时问题,那么一个简单的解决方案就是通过使用以下属性来增加Ribbon timeout value。
ribbon.ReadTimeout=10000
//or
<client-name>.ribbon.ReadTimeout=10000
如果承载由Zuul代理的服务的tomcat服务器负载太大,则主要可能发生超时。它的整个线程池已经耗尽,导致下一个请求需要等待很长时间。
通过使用以下属性更改服务tomcat具有的线程数,可以缓解这种情况。
server.tomcat.max-threads=0
默认情况下,它设置为0,这使其成为嵌入式服务器的默认设置。在tomcat的情况下,它是200.参见参考maxThreads property in tomcat.
注意:要增加线程池大小,我们必须确保机器具有提供资源的容量,如果同时执行多个线程的话。