Spring Cloud 2020.0.3使用WebClient出现DataBufferLimitException缓冲超限问题
问题原因
你遇到的DataBufferLimitException是WebClient默认的单请求内存缓冲上限导致的:Spring WebFlux体系下WebClient默认限制单请求最多加载256KB的内容到内存,你请求的图片大小超过该阈值就会触发报错。
你提到的Hoxton SR7版本修复,仅针对Spring Cloud Gateway组件内置的WebClient默认缓冲上限做了调整,你自己手动创建/注入的WebClient实例默认还是沿用256KB的限制,所以仍然会触发异常。
解决方案
你可以根据自己的使用场景选择以下任意一种方案:
- 方案1:全局配置调整缓冲上限
直接在application.yml或application.properties中添加如下配置,统一调整当前项目所有Spring Codec相关组件的内存上限,适配大文件/大图片场景:spring: codec: max-in-memory-size: 10MB # 可根据实际最大图片大小调整为对应值 - 方案2:单独为当前WebClient实例调整缓冲上限
如果你只需要给请求图片的WebClient调整上限,不需要全局生效,可以在创建WebClient实例时手动指定Codec参数:WebClient webClient = WebClient.builder() // 其他自定义配置(如baseUrl、拦截器等)保持不变 .codecs(configurer -> configurer.defaultCodecs().maxInMemorySize(10 * 1024 * 1024)) // 设置为10MB,按需调整 .build(); - 方案3:流式处理大文件避免内存占用过高(推荐超大文件场景使用)
如果你的图片大小超过几十MB,直接全部加载到内存容易引发OOM,建议改为流式处理响应,不需要将整个响应内容加载到内存:public void findImage(String guid, OutputStream outputStream) { webClient .get() .uri(sUrl + "/findImage/" + guid ) .header(AUTHORIZATION_PROPERTY, AUTHENTICATION_SCHEME + clientToken) .retrieve() .onStatus(HttpStatus::isError, it -> handleError(it.statusCode().getReasonPhrase())) .bodyToFlux(DataBuffer.class) .doOnNext(dataBuffer -> { try { Channels.newChannel(outputStream).write(dataBuffer.asByteBuffer()); DataBufferUtils.release(dataBuffer); } catch (IOException e) { throw new RuntimeException(e); } }) .blockLast(Duration.of(6000, ChronoUnit.MILLIS)); }
内容的提问来源于stack exchange,提问作者B Randall。
相关产品推荐
相关产品推荐

