Spring端点接收较大http请求的截断正文

Bas*_*s E 4 java spring amazon-ec2 truncation spring-boot

我有一个组件,部署在 AWS 上的 EC2 实例中,当发送较大的有效负载 (40k) 时,该组件会“随机”失败(约 70% 的请求)。

发送请求是使用 Postman 完成的。一遍又一遍地发送相同的请求(之间有相同的延迟或尽可能快),每次我都会遇到一些失败,然后成功(有时连续两次,然后出现一些失败,重复)

这是一个 Java Spring Boot 应用程序,控制器片段:

    @PostMapping
    @RequestMapping("/some/url")
    ResponseEntity<MyClass> methodName(@RequestBody String data, @RequestHeader("content-length") String header) {

        log.info("Content-Length header was: "+header);
        log.info("Length of inputJson (@RequestBody) was: "+data.length());
        log.info(inputJson);
Run Code Online (Sandbox Code Playgroud)

对于每个请求(失败或成功),我都会获得相同的内容长度标头值。数据长度要么相同(成功调用),要么更短(失败调用)。

我添加了一些如上所述的日志记录,这似乎证明接收到的数据实际上被截断了。

我使用启用了访问日志

server.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %{content-length}i %{Content-Length}i
Run Code Online (Sandbox Code Playgroud)

访问日志显示与内容长度标头相同的值。

环顾四周,我发现了几篇文章,但没有一篇文章有​​我可以使用的答案。考虑到这也成功了 30%(或较小的请求),我认为代码本身可能没问题。只是不知道接下来要改变什么以进一步调查这一点。

一些相关链接对我的问题没有帮助(可能对其他人有帮助):

小智 8

在我们的例子中,我们遇到了类似的问题,即请求被随机截断(~ 10-20%)。同一应用程序版本部署在多个环境中。该问题仅在某些环境中存在。我们尝试通过执行以下操作来重现该问题:

  • 将应用程序 API 端点从 HTTPS 更改为 HTTP,没有任何问题。我们还将 ALB 的后端协议从 HTTPS 更改为 HTTP。
  • 尝试从本地主机访问 HTTPS 端点。该问题不存在。

后来我们检查了已经到位的应用程序服务器。我们在 Spring Boot 应用程序中使用嵌入式 tomcat,版本为 9.0.31。已知此版本的 tomcat 在 HTTPS 负载方面存在问题。通过在 pom.xml 中显式定义此版本,将 tomcat 版本更改为 9.0.30 解决了我们的问题。

相关链接,以便这可以帮助其他人: