Spring云性能调整

时间:2016-03-22 22:29:17

标签: spring-cloud

我正在针对Spring Cloud应用程序进行性能测试。当并发用户数超过150时,它开始提供“转发错误”

{"timestamp":1458685370986,"status":500,"error":"Internal Server Error","exception":"com.netflix.zuul.exception.ZuulException","message":"Forwarding error"}

我应该调整哪个参数来摆脱错误?

1 个答案:

答案 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的实例。以下是HystrixCommandexecute() 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.

注意:要增加线程池大小,我们必须确保机器具有提供资源的容量,如果同时执行多个线程的话。