背景
最近用 DeepSeek 或 OpenAI 这类大模型时,发现回复内容是一点点蹦出来的。这背后其实是流式传输(Streaming Response)在起作用。相比传统接口一次性吐完所有数据,流式返回能让用户边接收边处理,体验更流畅。
流式返回的核心价值
传统 Web 开发里,接口通常要等服务器算完所有数据才返回。流式模式则不同,它把响应拆成片段逐步推送。这样做有几个实实在在的好处:
- 体验更好:像聊天机器人或长文本生成,用户不用盯着空白页傻等,能立刻看到首字。
- 省内存:服务器不用缓存整个大包,高并发下 OOM 风险更低。
- 支持实时:天生适合日志监控、行情推送,配合 SSE 或 WebSocket 效果更佳。
Spring Boot 服务端实现
要在 Spring Boot 里搞流式,首选 WebFlux 和 Reactor 的 Flux。
先加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
控制器层面,关键是设置 produces = MediaType.TEXT_EVENT_STREAM_VALUE,告诉浏览器这是 SSE 格式。
@RestController
@RequestMapping("/api/chat")
public class ChatController {
@PostMapping(produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> streamChat(@RequestBody ChatRequest request) {
return callLargeModelApi(request.message())
.doOnNext(chunk -> log.info("发送响应片段:{}", chunk))
.doOnError(error -> log.error("流式处理出错", error));
}
private Flux<String> callLargeModelApi(String prompt) {
// 实际项目替换为真实调用逻辑
return Flux.just("您好!", , + prompt)
.delayElements(Duration.ofMillis());
}
}


