报错是这么冒出来的。Spring Boot 3.2 用 WebClient 调流式接口,返回体超过 256KB 就抛 DataBufferLimitException,提示 Exceeded limit on max bytes to buffer : 262144,短回答正常,长回答必现。

中间走过弯路,把「网关侧还叠了一层响应缓冲」当成主因,改完现象没变。

把日志和配置对完,能解释这个现象的基本就这几处。编解码器的 maxInMemorySize 默认 256KB。另一种情况是用了 bodyToMono 把整段流攒成一个字符串。

另外,重试逻辑把已读的流又拼了一次。

上来先改成 bodyToFlux 按行消费

grep -n bodyToMono src/main/java/ChatClient.java

调大编解码器的缓冲上限

grep -rn maxInMemorySize src/main/resources/

接着用 curl 直连确认服务端逐块返回

curl -N -H "Accept: text/event-stream" http://localhost:8080/v1/chat

等前面都确认过,再关掉中间层的响应缓冲

grep -n proxy_buffering /etc/nginx/conf.d/llm.conf

中途换过一次思路,把范围缩到最小的那一层,反而快了。

别只看报错消失,验证要多做一步。长回答按块到达,日志里不再出现 DataBufferLimitException,堆内存随流消费回落并保持平稳。

这里还有个坑。把缓冲调大只是止血,真正的修法是用 Flux 消费,否则并发一高堆内存还是会顶上去。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189