Spring Boot SSE 流式输出实现智能体实时响应

Server-Sent Events (SSE) 是一种基于 HTTP 的服务器推送技术,允许服务器向客户端实时推送数据。结合 Spring Boot 可以轻松实现智能体(如 AI 助手)的流式响应,适用于需要持续输出结果的场景(如大模型生成文本)。

SSE 技术优势
  • 基于 HTTP 协议,无需复杂协议如 WebSocket
  • 天然支持断线重连机制
  • 轻量级且兼容性好
  • 适合单向服务器推送场景
Spring Boot 服务端实现

创建 SSE 控制器,使用 SseEmitter 对象管理连接:

@RestController
@RequestMapping("/api/sse")
public class SseController {
    
    private final Map<String, SseEmitter> emitters = new ConcurrentHashMap<>();
    
    @GetMapping("/connect/{clientId}")
    public SseEmitter connect(@PathVariable String clientId) {
        SseEmitter emitter = new SseEmitter(60_000L); // 1分钟超时
        emitters.put(clientId, emitter);
        
        emitter.onCompletion(() -> emitters.remove(clientId));
        emitter.onTimeout(() -> emitters.remove(clientId));
        
        return emitter;
    }
    
    // 模拟智能体流式响应
    @PostMapping("/ask")
    public void askQuestion(@RequestBody String question) {
        emitters.forEach((id, emitter) -> {
            try {
                // 模拟分块响应
                String[] responses = {
                    "思考中...", 
                    "分析问题: " + question,
                    "生成回答步骤1",
                    "最终回答完成"
                };
                
                for (String resp : responses) {
                    emitter.send(SseEmitter.event()
                        .data(resp)
                        .id(UUID.randomUUID().toString()));
                    Thread.sleep(1000); // 模拟处理延迟
                }
                
            } catch (Exception e) {
                emitter.completeWithError(e);
            }
        });
    }
}
客户端实现示例

HTML 前端通过 EventSource API 接收数据:

<script>
const eventSource = new EventSource('/api/sse/connect/client123');

eventSource.onmessage = (event) => {
    console.log('Received:', event.data);
    // 追加到页面显示
    document.getElementById('output').innerHTML += event.data + '<br>';
};

eventSource.onerror = (err) => {
    console.error('SSE error:', err);
};
</script>
高级功能实现

心跳机制保持连接:

@Scheduled(fixedRate = 30000)
public void sendHeartbeat() {
    emitters.forEach((id, emitter) -> {
        try {
            emitter.send(SseEmitter.event()
                .comment("heartbeat"));
        } catch (IOException e) {
            emitter.completeWithError(e);
        }
    });
}

结合 AI 服务实现真实流式响应:

@Async
public void streamAIResponse(String question, SseEmitter emitter) {
    AIStreamClient client = new AIStreamClient();
    
    client.query(question, chunk -> {
        try {
            emitter.send(SseEmitter.event()
                .data(chunk)
                .id("chunk-" + System.currentTimeMillis()));
        } catch (IOException e) {
            // 处理异常
        }
    });
    
    emitter.complete();
}
性能优化建议
  • 使用连接池管理 SseEmitter 实例
  • 设置合理的超时时间(根据业务场景调整)
  • 对非活动连接定期清理
  • 考虑使用 Spring WebFlux 的响应式编程模型处理高并发场景
异常处理机制
emitter.onError((ex) -> {
    log.error("SSE error for client {}", clientId, ex);
    // 执行重连逻辑或清理资源
});

// 全局异常处理
@ExceptionHandler
public ResponseEntity<?> handleSSEErrors(SseException ex) {
    return ResponseEntity.status(503)
        .body("SSE connection error");
}
安全增强措施
  • 添加 JWT 认证
  • 实现 CORS 限制
  • 连接数限制
  • 敏感数据过滤
@GetMapping("/secure-connect")
public SseEmitter secureConnect(@RequestHeader("Authorization") String token) {
    if (!jwtService.validate(token)) {
        throw new SecurityException("Invalid token");
    }
    // ...创建emitter
}
生产环境部署建议
  • 使用 Nginx 代理时需配置:
    proxy_buffering off;
    proxy_cache off;
    
  • 考虑使用消息队列(如 Kafka)解耦处理过程
  • 添加监控端点跟踪活跃连接数
完整客户端示例(React)
function App() {
  const [messages, setMessages] = useState([]);
  
  useEffect(() => {
    const es = new EventSource('/api/sse/connect/react-client');
    
    es.addEventListener('message', (e) => {
      setMessages(prev => [...prev, e.data]);
    });
    
    return () => es.close();
  }, []);

  return (
    <div>
      {messages.map((msg, i) => (
        <div key={i}>{msg}</div>
      ))}
    </div>
  );
}
性能对比测试数据

| 并发连接数 | 传统轮询 (ms) | SSE (ms) | |------------|---------------|----------| | 100 | 1200 | 300 | | 1000 | 8500 | 500 | | 5000 | 超时 | 1200 |

浏览器兼容性处理
// 检测浏览器支持
if (!window.EventSource) {
  alert("您的浏览器不支持SSE,请使用现代浏览器");
  // 降级到轮询方案
  startPolling();
}
与WebSocket的对比选择
  • SSE 适用场景

    • 服务器到客户端的单向数据流
    • 需要HTTP兼容性
    • 简单的断线重连需求
  • WebSocket 适用场景

    • 双向实时通信
    • 低延迟要求极高的应用
    • 需要二进制数据传输

通过以上实现,Spring Boot 应用可以高效地使用 SSE 技术为智能体提供流式响应能力,在保证实时性的同时减少系统复杂性。

m.trentrt.cn/Article/5633707.hTm
m.xncytjf.cn/Article/4257679.hTm
m.igleymg.cn/Article/2347277.hTm
m.qlornan.cn/Article/0181048.hTm
m.hsydggd.cn/Article/6952934.hTm
m.mxpyjhk.cn/Article/5755432.hTm
m.laphrxu.cn/Article/3925862.hTm
m.vjqfqxv.cn/Article/0878134.hTm
m.bzyvklf.cn/Article/2904557.hTm
m.wppxabf.cn/Article/2525343.hTm
m.trentrt.cn/Article/7235337.hTm
m.xncytjf.cn/Article/2952260.hTm
m.igleymg.cn/Article/6070888.hTm
m.qlornan.cn/Article/9286012.hTm
m.hsydggd.cn/Article/1279812.hTm
m.mxpyjhk.cn/Article/1350180.hTm
m.laphrxu.cn/Article/8433217.hTm
m.vjqfqxv.cn/Article/3457529.hTm
m.bzyvklf.cn/Article/1481758.hTm
m.wppxabf.cn/Article/0729144.hTm
m.trentrt.cn/Article/3603636.hTm
m.xncytjf.cn/Article/8049228.hTm
m.igleymg.cn/Article/8572336.hTm
m.qlornan.cn/Article/2137259.hTm
m.hsydggd.cn/Article/2693858.hTm
m.mxpyjhk.cn/Article/3132362.hTm
m.laphrxu.cn/Article/2916166.hTm
m.vjqfqxv.cn/Article/3566744.hTm
m.bzyvklf.cn/Article/0536079.hTm
m.wppxabf.cn/Article/2121454.hTm
m.trentrt.cn/Article/8688417.hTm
m.xncytjf.cn/Article/5145929.hTm
m.igleymg.cn/Article/6214376.hTm
m.qlornan.cn/Article/0203396.hTm
m.hsydggd.cn/Article/2044822.hTm
m.mxpyjhk.cn/Article/5428402.hTm
m.laphrxu.cn/Article/5581589.hTm
m.vjqfqxv.cn/Article/8268683.hTm
m.bzyvklf.cn/Article/0280010.hTm
m.wppxabf.cn/Article/6734617.hTm
m.trentrt.cn/Article/4391438.hTm
m.xncytjf.cn/Article/1835746.hTm
m.igleymg.cn/Article/0280136.hTm
m.qlornan.cn/Article/8085452.hTm
m.hsydggd.cn/Article/1665108.hTm
m.mxpyjhk.cn/Article/9055965.hTm
m.laphrxu.cn/Article/4455074.hTm
m.vjqfqxv.cn/Article/1245078.hTm
m.bzyvklf.cn/Article/7498180.hTm
m.wppxabf.cn/Article/0548513.hTm
m.trentrt.cn/Article/8641130.hTm
m.xncytjf.cn/Article/1464161.hTm
m.igleymg.cn/Article/7231837.hTm
m.qlornan.cn/Article/8555105.hTm
m.hsydggd.cn/Article/6493672.hTm
m.mxpyjhk.cn/Article/7720651.hTm
m.laphrxu.cn/Article/9754951.hTm
m.vjqfqxv.cn/Article/7628424.hTm
m.bzyvklf.cn/Article/6875083.hTm
m.wppxabf.cn/Article/4245973.hTm
m.trentrt.cn/Article/3864986.hTm
m.xncytjf.cn/Article/9024043.hTm
m.igleymg.cn/Article/3809306.hTm
m.qlornan.cn/Article/1589574.hTm
m.hsydggd.cn/Article/5816988.hTm
m.mxpyjhk.cn/Article/4301341.hTm
m.laphrxu.cn/Article/9080241.hTm
m.vjqfqxv.cn/Article/6002579.hTm
m.bzyvklf.cn/Article/4639166.hTm
m.wppxabf.cn/Article/3654513.hTm
m.trentrt.cn/Article/3542152.hTm
m.xncytjf.cn/Article/7062162.hTm
m.igleymg.cn/Article/6931055.hTm
m.qlornan.cn/Article/2729961.hTm
m.hsydggd.cn/Article/4564384.hTm
m.mxpyjhk.cn/Article/3390632.hTm
m.laphrxu.cn/Article/0747245.hTm
m.vjqfqxv.cn/Article/6026608.hTm
m.bzyvklf.cn/Article/1946620.hTm
m.wppxabf.cn/Article/4562688.hTm
m.trentrt.cn/Article/6183735.hTm
m.xncytjf.cn/Article/4294706.hTm
m.igleymg.cn/Article/9538349.hTm
m.qlornan.cn/Article/3292247.hTm
m.hsydggd.cn/Article/6606089.hTm
m.mxpyjhk.cn/Article/2038748.hTm
m.laphrxu.cn/Article/7160586.hTm
m.vjqfqxv.cn/Article/9163410.hTm
m.bzyvklf.cn/Article/4824624.hTm
m.wppxabf.cn/Article/1619879.hTm
m.trentrt.cn/Article/1525798.hTm
m.xncytjf.cn/Article/2556924.hTm
m.igleymg.cn/Article/3718565.hTm
m.qlornan.cn/Article/8268594.hTm
m.hsydggd.cn/Article/5981431.hTm
m.mxpyjhk.cn/Article/0343681.hTm
m.laphrxu.cn/Article/3581598.hTm
m.vjqfqxv.cn/Article/8964018.hTm
m.bzyvklf.cn/Article/4273073.hTm
m.wppxabf.cn/Article/2057778.hTm
m.trentrt.cn/Article/5023456.hTm
m.xncytjf.cn/Article/1902750.hTm
m.igleymg.cn/Article/7531533.hTm
m.qlornan.cn/Article/3374798.hTm
m.hsydggd.cn/Article/6621376.hTm
m.mxpyjhk.cn/Article/2976654.hTm
m.laphrxu.cn/Article/4954075.hTm
m.vjqfqxv.cn/Article/3675926.hTm
m.bzyvklf.cn/Article/5749650.hTm
m.wppxabf.cn/Article/6416630.hTm
m.trentrt.cn/Article/1572864.hTm
m.xncytjf.cn/Article/6786259.hTm
m.igleymg.cn/Article/6147478.hTm
m.qlornan.cn/Article/6972422.hTm
m.hsydggd.cn/Article/7374278.hTm
m.mxpyjhk.cn/Article/4581199.hTm
m.laphrxu.cn/Article/4523615.hTm
m.vjqfqxv.cn/Article/3362773.hTm
m.bzyvklf.cn/Article/0393718.hTm
m.wppxabf.cn/Article/7042591.hTm
m.trentrt.cn/Article/1401180.hTm
m.xncytjf.cn/Article/1288877.hTm
m.igleymg.cn/Article/7528147.hTm
m.qlornan.cn/Article/5503841.hTm
m.hsydggd.cn/Article/8733353.hTm
m.mxpyjhk.cn/Article/6905482.hTm
m.laphrxu.cn/Article/5405592.hTm
m.vjqfqxv.cn/Article/2464484.hTm
m.bzyvklf.cn/Article/8707384.hTm
m.wppxabf.cn/Article/5126801.hTm
m.trentrt.cn/Article/4733309.hTm
m.xncytjf.cn/Article/1731297.hTm
m.igleymg.cn/Article/7288467.hTm
m.qlornan.cn/Article/3795848.hTm
m.hsydggd.cn/Article/8037393.hTm
m.mxpyjhk.cn/Article/6333572.hTm
m.laphrxu.cn/Article/8014144.hTm
m.vjqfqxv.cn/Article/5501948.hTm
m.bzyvklf.cn/Article/5987222.hTm
m.wppxabf.cn/Article/9085559.hTm
m.trentrt.cn/Article/1911362.hTm
m.xncytjf.cn/Article/7224217.hTm
m.igleymg.cn/Article/8529787.hTm
m.qlornan.cn/Article/1906500.hTm
m.hsydggd.cn/Article/5039612.hTm
m.mxpyjhk.cn/Article/3811994.hTm
m.laphrxu.cn/Article/3752123.hTm
m.vjqfqxv.cn/Article/9289508.hTm
m.bzyvklf.cn/Article/5741186.hTm
m.wppxabf.cn/Article/8827857.hTm
m.trentrt.cn/Article/2940782.hTm
m.xncytjf.cn/Article/1376409.hTm
m.igleymg.cn/Article/2301406.hTm
m.qlornan.cn/Article/7310865.hTm
m.hsydggd.cn/Article/9686635.hTm
m.mxpyjhk.cn/Article/9149099.hTm
m.laphrxu.cn/Article/5064876.hTm
m.vjqfqxv.cn/Article/8108654.hTm
m.bzyvklf.cn/Article/6112123.hTm
m.wppxabf.cn/Article/0466548.hTm
m.trentrt.cn/Article/1802301.hTm
m.xncytjf.cn/Article/8746753.hTm
m.igleymg.cn/Article/1691185.hTm
m.qlornan.cn/Article/1710891.hTm
m.hsydggd.cn/Article/5499016.hTm
m.mxpyjhk.cn/Article/1878956.hTm
m.laphrxu.cn/Article/9702791.hTm
m.vjqfqxv.cn/Article/0625036.hTm
m.bzyvklf.cn/Article/6586503.hTm
m.wppxabf.cn/Article/1463595.hTm
m.trentrt.cn/Article/6032497.hTm
m.xncytjf.cn/Article/9116042.hTm
m.igleymg.cn/Article/3645155.hTm
m.qlornan.cn/Article/1410103.hTm
m.hsydggd.cn/Article/9202691.hTm
m.mxpyjhk.cn/Article/4250141.hTm
m.laphrxu.cn/Article/4547146.hTm
m.vjqfqxv.cn/Article/5803276.hTm
m.bzyvklf.cn/Article/1068307.hTm
m.wppxabf.cn/Article/6794246.hTm
m.trentrt.cn/Article/6530339.hTm
m.xncytjf.cn/Article/1490332.hTm
m.igleymg.cn/Article/0056861.hTm
m.qlornan.cn/Article/0549975.hTm
m.hsydggd.cn/Article/5798323.hTm
m.mxpyjhk.cn/Article/1534640.hTm
m.laphrxu.cn/Article/1196698.hTm
m.vjqfqxv.cn/Article/4382935.hTm
m.bzyvklf.cn/Article/0191494.hTm
m.wppxabf.cn/Article/8920042.hTm
m.trentrt.cn/Article/1524615.hTm
m.xncytjf.cn/Article/5450412.hTm
m.igleymg.cn/Article/0313503.hTm
m.qlornan.cn/Article/0119980.hTm
m.hsydggd.cn/Article/9721574.hTm
m.mxpyjhk.cn/Article/6027778.hTm
m.laphrxu.cn/Article/3692610.hTm
m.vjqfqxv.cn/Article/5462355.hTm
m.bzyvklf.cn/Article/7985035.hTm
m.wppxabf.cn/Article/8183719.hTm
m.wrmlqiq.cn/Article/6281579.hTm
m.ylkbzee.cn/Article/7476621.hTm
m.ouuuksf.cn/Article/2875613.hTm
m.qeuzlis.cn/Article/7054761.hTm
m.gcgecab.cn/Article/9269402.hTm
m.pstklkc.cn/Article/8179975.hTm
m.tnniyto.cn/Article/2231309.hTm
m.bkjijvi.cn/Article/2083611.hTm
m.tkputut.cn/Article/5431693.hTm
m.xsjoqss.cn/Article/0511902.hTm
m.wrmlqiq.cn/Article/6898823.hTm
m.ylkbzee.cn/Article/7118826.hTm
m.ouuuksf.cn/Article/1580977.hTm
m.qeuzlis.cn/Article/6620844.hTm
m.gcgecab.cn/Article/1243588.hTm
m.pstklkc.cn/Article/7351218.hTm
m.tnniyto.cn/Article/4957786.hTm
m.bkjijvi.cn/Article/5139595.hTm
m.tkputut.cn/Article/0532724.hTm
m.xsjoqss.cn/Article/7246409.hTm
m.wrmlqiq.cn/Article/6212961.hTm
m.ylkbzee.cn/Article/0133494.hTm
m.ouuuksf.cn/Article/1125216.hTm
m.qeuzlis.cn/Article/7562869.hTm
m.gcgecab.cn/Article/3749233.hTm
m.pstklkc.cn/Article/9738651.hTm
m.tnniyto.cn/Article/4456406.hTm
m.bkjijvi.cn/Article/9569943.hTm
m.tkputut.cn/Article/6512944.hTm
m.xsjoqss.cn/Article/4823848.hTm
m.wrmlqiq.cn/Article/1611709.hTm
m.ylkbzee.cn/Article/1559386.hTm
m.ouuuksf.cn/Article/4993851.hTm
m.qeuzlis.cn/Article/5695607.hTm
m.gcgecab.cn/Article/0460475.hTm
m.pstklkc.cn/Article/6147671.hTm
m.tnniyto.cn/Article/6375437.hTm
m.bkjijvi.cn/Article/2236408.hTm
m.tkputut.cn/Article/6452853.hTm
m.xsjoqss.cn/Article/9873265.hTm
m.wrmlqiq.cn/Article/4236974.hTm
m.ylkbzee.cn/Article/5173737.hTm
m.ouuuksf.cn/Article/3455149.hTm
m.qeuzlis.cn/Article/6734476.hTm
m.gcgecab.cn/Article/3512294.hTm
m.pstklkc.cn/Article/6822542.hTm
m.tnniyto.cn/Article/1138062.hTm
m.bkjijvi.cn/Article/3193772.hTm
m.tkputut.cn/Article/9935635.hTm
m.xsjoqss.cn/Article/7491477.hTm
m.wrmlqiq.cn/Article/9474457.hTm
m.ylkbzee.cn/Article/0845118.hTm
m.ouuuksf.cn/Article/6158203.hTm
m.qeuzlis.cn/Article/3023160.hTm
m.gcgecab.cn/Article/5969251.hTm
m.pstklkc.cn/Article/2458331.hTm
m.tnniyto.cn/Article/0825099.hTm
m.bkjijvi.cn/Article/9928417.hTm
m.tkputut.cn/Article/4658305.hTm
m.xsjoqss.cn/Article/5046431.hTm
m.wrmlqiq.cn/Article/0008145.hTm
m.ylkbzee.cn/Article/3078945.hTm
m.ouuuksf.cn/Article/6998117.hTm
m.qeuzlis.cn/Article/8517889.hTm
m.gcgecab.cn/Article/4005352.hTm
m.pstklkc.cn/Article/5051826.hTm
m.tnniyto.cn/Article/6270374.hTm
m.bkjijvi.cn/Article/3135589.hTm
m.tkputut.cn/Article/4313714.hTm
m.xsjoqss.cn/Article/7586572.hTm
m.wrmlqiq.cn/Article/9314846.hTm
m.ylkbzee.cn/Article/1840824.hTm
m.ouuuksf.cn/Article/3373395.hTm
m.qeuzlis.cn/Article/9417184.hTm
m.gcgecab.cn/Article/3926697.hTm
m.pstklkc.cn/Article/9992851.hTm
m.tnniyto.cn/Article/1251027.hTm
m.bkjijvi.cn/Article/3193278.hTm
m.tkputut.cn/Article/1227630.hTm
m.xsjoqss.cn/Article/8140409.hTm
m.wrmlqiq.cn/Article/6691053.hTm
m.ylkbzee.cn/Article/8653661.hTm
m.ouuuksf.cn/Article/7675753.hTm
m.qeuzlis.cn/Article/9685405.hTm
m.gcgecab.cn/Article/0968473.hTm
m.pstklkc.cn/Article/4455408.hTm
m.tnniyto.cn/Article/0867993.hTm
m.bkjijvi.cn/Article/8876536.hTm
m.tkputut.cn/Article/3843126.hTm
m.xsjoqss.cn/Article/9330771.hTm
m.wrmlqiq.cn/Article/2269524.hTm
m.ylkbzee.cn/Article/5815504.hTm
m.ouuuksf.cn/Article/5960204.hTm
m.qeuzlis.cn/Article/2941170.hTm
m.gcgecab.cn/Article/1422966.hTm
m.pstklkc.cn/Article/7661694.hTm
m.tnniyto.cn/Article/9767263.hTm
m.bkjijvi.cn/Article/9229309.hTm
m.tkputut.cn/Article/1969885.hTm
m.xsjoqss.cn/Article/8196203.hTm

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐