Spring Boot 中基于 WebClient 的 SSE 流式接口实战

—— 从 Feign 到 WebClient 的一次真实踩坑记录

一、背景:为什么我要做 SSE?

在最近的一个项目中,我负责接入一个 AI 问答服务
一开始的接口形态非常常规:

@PostMapping("/health_manager") public RespBean<HealthManagerQueryDataVO> sendQuery(...) 

客户端发请求,服务端等 AI 全部生成完内容,再一次性返回。

问题很快就暴露了:

  • AI 返回慢(10 秒甚至更久)
  • 用户页面“卡死”,体验极差
  • 其实 AI 是“边生成边返回”的,但我们完全浪费了这个能力

于是,目标就很明确了:

把原有同步接口,改造成支持 SSE(Server-Sent Events)的流式接口

二、什么是 SSE?为什么适合 AI 问答?

1️⃣ SSE 是什么?

SSE(Server-Sent Events)是一种 服务器主动推送 的 HTTP 通信方式:

  • 基于 HTTP
  • 单向(服务端 → 客户端)
  • 长连接
  • 文本流(text/event-stream

返回的数据长这样:

data: 你好 data: 我是 data: AI 

客户端可以一边接收,一边渲染


2️⃣ 为什么 SSE 特别适合 AI 场景?

技术适配度
HTTP 普通接口❌ 等全部生成
WebSocket❌ 太重
SSE✅ 天生流式

AI 的输出特征是:

  • token 级 / 句子级生成
  • 可边生成边消费
  • 用户随时可能中断

👉 SSE 几乎是最优解


三、第一个坑:Feign 不支持 SSE

项目里原本调用 AI 服务用的是 Feign

@FeignClient("mb-ai") RespBean sendQuery(...) 

一开始我尝试“硬改”,但很快发现:

Feign 本质是一次性 HTTP 调用,它不支持流式消费响应体

哪怕 AI 服务是 SSE,Feign 也会:

  • 等完整响应
  • 再反序列化
  • 流式直接失效

结论很明确:

❌ Feign 不能用于 SSE
✅ SSE 必须用 WebClient / HttpClient

四、正确姿势:WebClient + SseEmitter

1️⃣ Controller 层:返回 SseEmitter

SSE 接口和普通接口最大的不同是:
返回值不再是业务对象,而是一个“连接本身”

@PostMapping( value = "/health_manager/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE ) public SseEmitter healthManagerStream( @RequestBody HealthManagerQueryDTO request) { SseEmitter emitter = new SseEmitter(0L); // 不超时 aiService.streamQuery(request, emitter); return emitter; } 

关键点:

  • produces = text/event-stream
  • 返回 SseEmitter
  • 业务逻辑交给 Service

2️⃣ Service 层:WebClient 真正消费 AI 流

webClient.post() .uri("/health_manager") .contentType(MediaType.APPLICATION_JSON) .accept(MediaType.TEXT_EVENT_STREAM) .bodyValue(request) .retrieve() .bodyToFlux(String.class) .subscribe( data -> emitter.send(data), error -> emitter.completeWithError(error), emitter::complete ); 

这段代码的含义是:

  • AI 每吐一段数据
  • 我就 emitter.send()
  • 前端立刻收到

真正实现了“边生成、边返回、边渲染”


五、第二个大坑:UnknownHostException: mb-ai

代码写完,一跑,直接报错:

java.net.UnknownHostException: mb-ai 

第一反应:

“不对啊,Feign 一直是能调用 mb-ai 的”

原因分析

  • Feign:自动走注册中心(Nacos / Eureka)
  • WebClient:只认 DNS
.baseUrl("http://mb-ai") 

在 WebClient 看来:

mb-ai 就是一个普通域名
但 DNS 根本不认识它

六、正确解法:WebClient 接入服务发现

1️⃣ 引入 LoadBalancer

<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> 

2️⃣ 给 WebClient.Builder 加 @LoadBalanced

@Configuration public class WebClientConfig { @Bean @LoadBalanced public WebClient.Builder webClientBuilder() { return WebClient.builder(); } } 

3️⃣ baseUrl 继续用服务名

.baseUrl("http://mb-ai") 

此时调用链变成:

WebClient → LoadBalancer → Nacos → 真实 IP:PORT 

UnknownHostException 到此彻底解决


七、最终依赖组合(最小可用)

<!-- WebClient / SSE --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-webflux</artifactId> </dependency> <!-- 服务发现 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-loadbalancer</artifactId> </dependency> <!-- Nacos(项目里一般已有) --> spring-cloud-starter-alibaba-nacos-discovery 
⚠️ 不会把项目变成 WebFlux
只是“在 MVC 项目里用 WebClient”

八、架构上的最终形态(我现在的做法)

Feign └── 普通同步接口(兼容老系统) WebClient └── SSE 流式接口(AI 问答) 

接口层设计成:

POST /health_manager // 非流式 POST /health_manager/stream // SSE 

前端可以按需选择。


九、一些实战踩坑总结

❌ Feign 强行做 SSE

→ 行不通

❌ WebClient 不加 LoadBalanced

→ 必炸 UnknownHostException

❌ 忘了 produces

→ 前端收不到流

❌ AI 实际没返回 text/event-stream

→ 你这边再对也没用


十、写在最后

这次改造最大的收获不是“把 SSE 跑通了”,而是更清楚地理解了:

  • Feign 和 WebClient 的边界
  • 同步接口和流式接口在架构层面的本质差异
  • AI 场景对交互模型的倒逼

如果你现在也在做:

  • AI 问答
  • 长文本生成
  • 实时推送

那么,SSE 几乎是绕不开的一步

Read more

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

【Claude Code解惑】深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王?

深度评测:Claude Code vs. GitHub Copilot CLI,谁才是终端之王? 目录 1. 引言与背景 2. 原理解释(深入浅出) 3. 10分钟快速上手(可复现) 4. 代码实现与工程要点 5. 应用场景与案例 6. 实验设计与结果分析 7. 性能分析与技术对比 8. 消融研究与可解释性 9. 可靠性、安全与合规 10. 工程化与生产部署 11. 常见问题与解决方案(FAQ) 12. 创新性与差异性 13. 局限性与开放挑战 14. 未来工作与路线图 15. 扩展阅读与资源 16. 图示与交互 17. 术语表与速查表 18. 互动与社区 0.

【资讯热点】2026 AI 编程新范式:从 Copilot 到 Agentic Coding 的效率革命

【资讯热点】2026 AI 编程新范式:从 Copilot 到 Agentic Coding 的效率革命

【资讯热点】2026 AI 编程新范式:从 Copilot 到 Agentic Coding 的效率革命 文章目录 * 【资讯热点】2026 AI 编程新范式:从 Copilot 到 Agentic Coding 的效率革命 * 一、AI编程的变革:从工具到智能伙伴(引言) * 二、Copilot的崛起与挑战:效率提升与局限性(发展现状) * 三、Agentic Coding:驱动未来编程的智能体(核心概念) * 四、Agentic Coding的工作流与应用场景(实战展望) * 五、挑战与机遇:拥抱AI编程新范式(展望与建议) * 六、总结:AI编程的未来已来(价值升华) * 七、下一期预告(系列引导) * 参考链接

从 99.8% 到 14.9%:Paperzz 降重 / 降 AIGC 实测,破解知网最新检测的实用指南

从 99.8% 到 14.9%:Paperzz 降重 / 降 AIGC 实测,破解知网最新检测的实用指南

Paperzz-AI官网免费论文查重复率AIGC检测/开题报告/文献综述/论文初稿paperzz - 降重/降AIGChttps://www.paperzz.cc/weight 当知网、维普再次升级 AIGC 检测机制,不少同学的论文初稿被打出 99.8% 的 AIGC 疑似度时,那种 “一夜回到解放前” 的焦虑,想必很多人都深有体会。传统的同义词替换、语序调整早已失效,单纯降重又容易让文本变得口语化、散文化。Paperzz 的 “降重 / 降 AIGC” 功能,正是在这样的背景下,成为了不少人应对学术检测的 “救命稻草”。本文将结合平台界面,为你深度拆解 Paperzz 如何通过 AI 技术与专业服务,帮你安全、高效地通过最新一轮学术检测。 一、检测升级:知网 AIGC

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【大模型科普】AIGC技术发展与应用实践(一文读懂AIGC)

【作者主页】Francek Chen 【专栏介绍】 ⌈ ⌈ ⌈人工智能与大模型应用 ⌋ ⌋ ⌋ 人工智能(AI)通过算法模拟人类智能,利用机器学习、深度学习等技术驱动医疗、金融等领域的智能化。大模型是千亿参数的深度神经网络(如ChatGPT),经海量数据训练后能完成文本生成、图像创作等复杂任务,显著提升效率,但面临算力消耗、数据偏见等挑战。当前正加速与教育、科研融合,未来需平衡技术创新与伦理风险,推动可持续发展。 文章目录 * 一、AIGC概述 * (一)什么是AIGC * (二)AIGC与大模型的关系 * (三)常见的AIGC应用场景 * (四)AIGC技术对行业发展的影响 * (五)AIGC技术对职业发展的影响 * (六)常见的AIGC大模型工具 * (七)AIGC大模型的提示词 * 二、文本类AIGC应用实践 * (一)案例1:与DeepSeek进行对话 * (二)案例2:与百度文心一言进行对话 * (三)案例3:使用讯飞智文生成PPT