3

我正在使用 Spring Boot 2.1.6.RELEASE 和 Webflux 构建应用程序

我们有一个端点,我们可以使用多部分上传文件,并使用 WebClient 进行上传。

我们的上传客户端代码如下所示

@Component
class UploadClient(
    private val client: WebClient,
) {
    suspend fun upload(filePath: String) =
        client.post()
              .uri("/upload")
              .contentType(MULTIPART_FORM_DATA)   
              .body(BodyInserters.fromMultipartData(generateMultipartBody(filePath)))
              .retrieve()
              .bodyToMono(UploadResult::class.java)
              .awaitFirst()

    private fun generateMultipartBody(filePath: String): MultiValueMap<String, HttpEntity<*>> {
        val builder = MultipartBodyBuilder()
        builder.part("file", FileSystemResource(filePath))
        return builder.build()
    }
}

然而,当我们上传一个大文件(1.6gb)时,我们看到整个文件被加载到直接内存中:

视觉虚拟机

随着文件上传,内存被释放,然后当下一个文件上传时,您可以再次看到内存中的峰值。

相比之下,我尝试用https://github.com/AsyncHttpClient/async-http-client替换 WebClient并且内存使用量要低得多,每次上传约 60mb

当 WebFlux 客户端适用于我们所有其他用途时,我真的不想引入另一个 http 客户端依赖项。

4

1 回答 1

3

这是 Spring 框架中的一个错误 - https://github.com/spring-projects/spring-framework/issues/23518

于 2020-01-22T10:23:00.437 回答