🌟 前言
歡迎來到我的技術小宇宙!🌌 這里不僅是我記錄技術點滴的后花園,也是我分享學習心得和項目經驗的樂園。📚 無論你是技術小白還是資深大牛,這里總有一些內容能觸動你的好奇心。🔍
🤖 洛可可白:個人主頁
🔥 個人專欄:?前端技術 ?后端技術
🏠 個人博客:洛可可白博客
🐱 代碼獲取:bestwishes0203
📷 封面壁紙:洛可可白wallpaper

SpringBoot中SSE接口的兩種方法
- 實現實時數據推送:SpringBoot中SSE接口的兩種方法
- 一、什么是SSE?
- 二、項目環境準備
- 1. 基礎依賴
- 三、兩種實現方式對比
- 四、傳統Servlet實現(基于SseEmitter)
- 1. 控制器實現
- 2. 關鍵點解析
- 五、響應式實現(基于WebFlux)
- 1. 控制器實現
- 2. 核心優勢
- 六、接口測試方法
- 1. 使用curl測試
- 2. 前端示例
- 七、生產環境注意事項
- 八、擴展應用場景
- 九、總結
實現實時數據推送:SpringBoot中SSE接口的兩種方法
一、什么是SSE?
SSE(Server-Sent Events) 是一種基于HTTP的服務器向客戶端單向實時推送數據的技術。與WebSocket不同,SSE天然支持斷線重連,且協議簡單,適用于股票行情、實時日志、消息通知等場景。
二、項目環境準備
1. 基礎依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency><!-- 若使用WebFlux方式 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
三、兩種實現方式對比
特性 | 傳統Servlet方式 | WebFlux響應式方式 |
---|---|---|
線程模型 | 阻塞IO(線程池) | 非阻塞IO(事件循環) |
資源消耗 | 較高 | 較低 |
代碼復雜度 | 需手動管理線程 | 聲明式編程 |
適用場景 | 簡單低頻場景 | 高并發實時場景 |
四、傳統Servlet實現(基于SseEmitter)
1. 控制器實現
@RestController
public class SseController {@GetMapping("/sse")public SseEmitter handleSse() {SseEmitter emitter = new SseEmitter();ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();Runnable task = () -> {try {String data = "Time: " + LocalDateTime.now();emitter.send(SseEmitter.event().data(data).id(String.valueOf(System.currentTimeMillis())));} catch (IOException e) {emitter.completeWithError(e);executor.shutdown();}};// 定時發送(立即執行,每秒一次)executor.scheduleAtFixedRate(task, 0, 1, TimeUnit.SECONDS);// 客戶端斷開處理emitter.onCompletion(executor::shutdown);emitter.onTimeout(executor::shutdown);return emitter;}
}
2. 關鍵點解析
- SseEmitter:核心類,保持長連接
- ScheduledExecutorService:定時任務線程池
- 事件結構:支持設置id/event/data等字段
- 資源釋放:通過onCompletion/onTimeout確保線程池關閉
五、響應式實現(基于WebFlux)
1. 控制器實現
@RestController
public class SseWebFluxController {@GetMapping(value = "/sse-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)public Flux<ServerSentEvent<String>> streamEvents() {return Flux.interval(Duration.ofSeconds(1)).map(sequence -> ServerSentEvent.<String>builder().id(String.valueOf(sequence)).event("time-update").data("SSE from WebFlux - " + LocalDateTime.now()).build());}
}
2. 核心優勢
- 非阻塞IO:基于Reactor庫實現響應式流
- 自動背壓:處理客戶端消費速度差異
- 簡潔API:使用Flux流式編程
六、接口測試方法
1. 使用curl測試
curl http://localhost:8080/sse
curl http://localhost:8080/sse-stream
2. 前端示例
<script>
const eventSource = new EventSource('/sse');eventSource.onmessage = (e) => {console.log('Received:', e.data);
};eventSource.addEventListener('time-update', (e) => {console.log('Custom event:', e.data);
});
</script>
七、生產環境注意事項
-
連接管理:設置合理的超時時間(默認30秒)
-
錯誤處理:添加onError回調記錄異常
-
跨域配置:需要配置CORS
@Configuration public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/sse*").allowedOrigins("*");} }
-
性能監控:跟蹤活躍連接數
八、擴展應用場景
- 實時股票報價推送
- 系統運行狀態監控
- 聊天應用消息通知
- 長耗時任務進度更新
九、總結
兩種實現方式各有優勢:
- 傳統Servlet方式 適合簡單場景,快速實現
- WebFlux方式 更適合高并發、低延遲需求
建議根據實際場景選擇,對于新項目推薦使用WebFlux實現,能更好地利用系統資源。希望本文能幫助您快速上手SpringBoot中的SSE開發!
源碼地址:https://gitee.com/bestwishes0203
如果對你有幫助,點贊👍、收藏💖、關注🔔是我更新的動力!👋🌟🚀