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

标签 spring-boot tomcat kubernetes istio

我正在将Spring Boot与Embedded Tomcat 9.0.36一起使用。它在Kubernetes中用作Docker镜像。最近,升级特使后,我开始遇到异常。

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

有人建议将闲置连接超时增加到60秒,但是它可以自动引导我找到“连接超时”和“保持 Activity 超时”。我使用下面的代码将它们增加到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中。我可以在服务中看到成功的响应,但是之后,看不到任何日志。

最佳答案

我花了一个星期从应用程序的 Angular 分析此问题。我遵循了运营团队建议的一些步骤。

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


  • //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());
    }

    关于spring-boot - 上游连接错误或在 header 之前断开连接/重置。重置原因:使用Spring Boot时连接终止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61460578/

    相关文章:

    java - 如何在Spring Boot中拒绝请求中的3位数字时间?

    java - Json反序列化错误Spring Boot测试-无法构造实例

    java - org.springframework.web.servlet.PageNotFound - 不支持请求方法 'POST'

    java - GregorianCalendar 上的内存泄漏

    docker - Kubernetes - 机器上已存在容器镜像

    kubernetes - k8 pod优先级和测试

    java - 不能@autowired 存储库。 Bean 循环引用

    java - Spring 中的丰富 HTML 电子邮件与 Thymeleaf

    java - 在服务器上不断运行java应用程序

    kubernetes - Kubernetes-证书经理-Hashicorp Vault-证书的就绪状态为空