上游连接错误或在标头之前断开连接/重置。重置原因:使用Spring Boot时连接终止

问题描述 投票:1回答:1

我正在使用带有嵌入式Tomcat 9.0.36的Spring Boot。它在Kubernetes中用作Docker映像。最近,升级特使后,我开始出现异常。

  "upstream connect error or disconnect/reset before headers. reset reason: connection termination" with 503 status code

[有人建议将空闲连接超时增加到60秒,但是它可以自动引导我找到“连接超时”和“保持活动超时”。我使用下面的代码将它们增加到5分钟。

@Configuration
public class TomcatCustomizer implements WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

    private static final Logger LOGGER = LoggerFactory.getLogger(TomcatCustomizer.class);

    @Override
    public void customize(TomcatServletWebServerFactory factory) {

        factory.addConnectorCustomizers(connector -> {
            AbstractHttp11Protocol protocol = (AbstractHttp11Protocol) connector.getProtocolHandler();
            //Setting up connection time out
            protocol.setKeepAliveTimeout(360000);
            protocol.setConnectionTimeout(360000);
            protocol.setMaxKeepAliveRequests(120);
        });
    }
}

仍然,我遇到了同样的错误。该应用程序内部调用了另一个服务,该服务也托管在Kubernetes中。我可以在服务中看到成功的响应,但是此后,我看不到任何日志。

spring-boot tomcat kubernetes istio
1个回答
1
投票

我花了一个星期从应用程序的角度进行分析。我遵循了运营团队建议的一些步骤。

  • 由于已在Envoy中配置相同,因此将Tomcat Server中的超时增加到60秒
  • 我确实增加了时间,但无法解决问题。
  • 我当时使用的是Spring Cloud Gateway的网关服务,我认为这是问题所在,所以我将其更改为Rest模板,但这也无法解决问题。
  • 幸运的是,运行状况检查API正常运行,但那些在内部与其他服务进行通信的API除外。在Health API中,他们还与其他服务进行通信以检查其Health,但是我没有直接返回响应。我包装了修改它的响应正文并将其转发到UI。我还应用了相同的代码,并使用下面的代码(这些代码很容易理解):创建了一个新的Response Entity,并删除了从内部API接收并返回到UI的所有标头。它像魅力一样运作。

//Earlier (Forwarding same headers received from internal service to UI)
ResponseEntity responseEntity = //Received by calling other APIs;
return responseEntity;

//Now (Dropped headers)
ResponseEntity responseEntity = //Received by calling other APIs;
MultiValueMap<String, String> newHeaders = new LinkedMultiValueMap<>();          
if (Objects.nonNull(responseEntity) && Objects.nonNull(responseEntity.getBody())) {
    newHeaders.set("Content-type", responseEntity.getHeaders().getContentType().toString());
    return new ResponseEntity(responseEntity.getBody(), newHeaders, responseEntity.getStatusCode());
}
© www.soinside.com 2019 - 2024. All rights reserved.