繁体   English   中英

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

[英]upstream connect error or disconnect/reset before headers. reset reason: connection termination when using Spring Boot

我正在使用带有嵌入式 Tomcat 9.0.36 的 Spring 引导。 它在 Kubernetes 中用作 Docker 图像。 最近升级特使后,我开始收到异常。

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

有人建议将空闲连接超时增加到 60 秒,但它 spring-boot 我能够找出“连接超时”和“保持活动超时”。 我使用下面的代码将它们增加到 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 中。 我能够在我的服务中看到成功的响应,但在那之后,我看不到任何日志。

我花了一周的时间从应用程序的角度分析了这一点。 我遵循了运营团队建议的几个步骤。

  • 将 Tomcat 服务器中的超时时间增加到 60 秒,因为它们在 Envoy 中配置相同
  • 我确实增加了时间,但无法解决问题。
  • 我正在使用 Spring Cloud Gateway 进行网关服务,我认为这是问题所在,所以我将其更改为 Rest 模板,但这也没有解决问题。
  • 幸运的是,健康检查 API 工作正常,除了那些在内部与其他服务通信的 API。 在 Health API 中,他们还与其他服务通信以检查他们的 Health,但我没有直接返回响应。 我正在打包修改它的响应主体并将其转发到 UI。 我也应用了相同的方法,并使用了您可以轻松理解的以下代码。我创建了一个新的响应实体并删除了我从内部 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()); }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM