Spring?Boot?整合?SSE(Server-Sent?Events)實(shí)戰(zhàn)案例(全網(wǎng)最全)
Spring Boot 整合 SSE(Server-Sent Events)

1、簡述
SSE(Server-Sent Events)是一種基于HTTP協(xié)議的單向通信機(jī)制,允許服務(wù)器向?yàn)g覽器持續(xù)發(fā)送實(shí)時更新。與WebSocket不同,SSE更簡單,使用HTTP/1.1協(xié)議即可,不需要額外的協(xié)議升級。它通過簡單的文本流格式(data: ...\n\n)傳輸事件,支持自定義事件類型和重連機(jī)制。
SSE與其他技術(shù)的對比
| 技術(shù) | 協(xié)議 | 雙向通信 | 復(fù)雜度 | 適用場景 |
|---|---|---|---|---|
| SSE | HTTP | 單向 | 低 | 服務(wù)器主動推送(如通知) |
| WebSocket | WS | 雙向 | 高 | 實(shí)時聊天、游戲 |
| 長輪詢 | HTTP | 半雙工 | 中 | 兼容性要求高的場景 |
SSE的特點(diǎn):
- 自動重連:客戶端在連接斷開時會自動嘗試重新連接。
- 輕量級協(xié)議:事件流格式簡單,無需額外解析庫。
- 瀏覽器原生支持:現(xiàn)代瀏覽器通過
EventSourceAPI直接使用。
2、Spring Boot 中的SSE實(shí)現(xiàn)
2.1 添加依賴與配置
驗(yàn)證Spring Boot版本兼容性:確保使用Spring Boot 2.2+版本以獲得更好的異步支持。
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.0</version>
</parent>2.2 實(shí)現(xiàn)后端接口
代碼深度解析:
- 使用
Stream.generate生成數(shù)據(jù)流,但需注意無限流會導(dǎo)致線程阻塞,推薦結(jié)合異步線程池。 - 添加事件ID和重試機(jī)制(增強(qiáng)SSE規(guī)范支持):
@GetMapping(value = "/sse/stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<String> stream() {
return Flux.interval(Duration.ofSeconds(1))
.map(sequence -> "id: " + sequence + "\n"
+ "data: " + LocalTime.now() + "\n\n")
.take(10);
}
2.3 超時與異常處理
精細(xì)化配置:
- 通過
SseEmitter設(shè)置超時回調(diào),記錄未完成的連接:
emitter.onTimeout(() -> {
log.warn("SSE連接超時:{}", emitter);
emitters.remove(emitter);
});
- 全局異常處理:使用
@ExceptionHandler捕獲IOException,避免連接中斷導(dǎo)致服務(wù)不可用。
2.4 前端實(shí)現(xiàn)優(yōu)化
增強(qiáng)健壯性:
- 監(jiān)聽特定事件類型并處理重連:
eventSource.addEventListener("customEvent", function(e) {
console.log("自定義事件數(shù)據(jù):", e.data);
});
eventSource.onerror = function() {
setTimeout(() => new EventSource('/sse/stream'), 5000); // 5秒后重連
};- 添加心跳檢測:服務(wù)器定期發(fā)送注釋行(
:keep-alive\n)防止代理超時。
3、高級實(shí)踐
3.1 結(jié)合Spring Security實(shí)現(xiàn)鑒權(quán)
保護(hù)SSE端點(diǎn):
@GetMapping("/sse/private-stream")
public SseEmitter privateStream(Authentication authentication) {
if (authentication == null) {
throw new SecurityException("未授權(quán)訪問");
}
return ssePushService.subscribe();
}
Token驗(yàn)證:前端在初始化EventSource時攜帶Token:
new EventSource('/sse/private-stream?token=xxxx');
3.2 分布式場景下的解決方案
使用消息隊列廣播事件(以Redis Pub/Sub為例):
- 引入依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>- 訂閱Redis頻道并推送消息:
@Bean
public MessageListenerAdapter redisListener(SsePushService pushService) {
return new MessageListenerAdapter((message, channel) ->
pushService.pushMessage(message.toString()));
}
3.3 性能監(jiān)控與調(diào)優(yōu)
- 監(jiān)控連接數(shù):通過
/actuator/metrics/sse.emitters端點(diǎn)(需集成Actuator)。 - 背壓控制:使用Project Reactor的
Flux處理背壓,避免服務(wù)器過載。
4、注意事項(xiàng)(增強(qiáng)版)
- 瀏覽器兼容性:
- IE完全不支持,可通過
polyfill(如eventsource庫)降級為長輪詢。 - 移動端瀏覽器需測試網(wǎng)絡(luò)切換(如4G/WiFi)對連接的影響。
- 消息格式規(guī)范:
- 每條消息以
data:開頭,結(jié)尾必須有兩個換行符。 - 發(fā)送JSON數(shù)據(jù)需轉(zhuǎn)義換行符:
data: {\"time\": \"12:00\"}\n\n。
- 每條消息以
- 安全加固:
- 啟用HTTPS防止中間人攻擊。
- 限制每IP連接數(shù),防止DDoS攻擊。
5、實(shí)戰(zhàn)案例:實(shí)時日志監(jiān)控系統(tǒng)
架構(gòu)設(shè)計
- 日志收集:Filebeat監(jiān)聽日志文件變動。
- 消息中轉(zhuǎn):Kafka接收日志并緩存。
- SSE推送:Spring Boot消費(fèi)Kafka消息并廣播。
關(guān)鍵代碼
@KafkaListener(topics = "logs")
public void handleLog(String logMessage) {
ssePushService.pushMessage(logMessage);
}
6、調(diào)試與測試技巧
- 使用Curl測試SSE:
curl -N http://localhost:8080/sse/stream
- 瀏覽器開發(fā)者工具:
- 網(wǎng)絡(luò)面板查看
EventStream分幀詳情。 - 控制臺調(diào)試
EventSource事件監(jiān)聽。
- 網(wǎng)絡(luò)面板查看
延伸閱讀:
到此這篇關(guān)于Spring Boot 整合 SSE(Server-Sent Events)實(shí)戰(zhàn)案例(全網(wǎng)最全)的文章就介紹到這了,更多相關(guān)Spring Boot 整合 SSE內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java實(shí)現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例
這篇文章主要介紹了Java實(shí)現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能,結(jié)合具體實(shí)例形式分析了java日期與時間戳類型的表示與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下2017-06-06
IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)
intellij?idea?2022是一款市面上最好的JAVA?IDE編程工具,該工具支持git、svn、github等版本控制工具,整合了智能代碼助手、代碼自動提示等功能,本教程給大家分享IDEA?2022最新永久激活碼,感興趣的朋友參考下吧2020-10-10
解決idea update project 更新選項(xiàng)消失的問題
這篇文章主要介紹了解決idea update project 更新選項(xiàng)消失的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-01-01
Spring-AOP @AspectJ進(jìn)階之如何綁定代理對象
這篇文章主要介紹了Spring-AOP @AspectJ進(jìn)階之如何綁定代理對象的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
SpringBoot + Druid + Dynamic Dataso
本文通過實(shí)例代碼給大家介紹SpringBoot整合Druid與多數(shù)據(jù)源配置,涵蓋自動裝配流程、數(shù)據(jù)源動態(tài)切換方案及監(jiān)控功能實(shí)現(xiàn),感興趣的朋友一起看看吧2025-08-08
Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例
最近工作中遇到了一個需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實(shí)現(xiàn)最為方法,下面這篇文章就主要介紹了Java通過正則表達(dá)式獲取字符串中數(shù)字的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。2017-03-03
Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備(測試代碼)
BlueCove是一個開源的藍(lán)牙協(xié)議棧實(shí)現(xiàn),旨在為Java開發(fā)者提供一個全面的、易于使用的API,從而在應(yīng)用程序中實(shí)現(xiàn)藍(lán)牙功能,該項(xiàng)目支持多種操作系統(tǒng),這篇文章主要介紹了Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備,需要的朋友可以參考下2025-01-01
Java tomcat中的類加載器和安全機(jī)制你了解嗎
這篇文章主要介紹了Tomcat 類加載器的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下,希望能夠給你帶來幫助2021-09-09

