最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2025年08月15日 14:38:43   作者:null.equals()  
本文通過實戰(zhàn)案例講解SpringBoot整合SSE技術(shù),涵蓋實現(xiàn)原理、代碼配置、異常處理及前端交互,討論與WebSocket對比、分布式解決方案、性能監(jiān)控,感興趣的朋友跟隨小編一起看看吧

Spring Boot 整合 SSE(Server-Sent Events)

1、簡述

SSE(Server-Sent Events)是一種基于HTTP協(xié)議的單向通信機(jī)制,允許服務(wù)器向瀏覽器持續(xù)發(fā)送實時更新。與WebSocket不同,SSE更簡單,使用HTTP/1.1協(xié)議即可,不需要額外的協(xié)議升級。它通過簡單的文本流格式(data: ...\n\n)傳輸事件,支持自定義事件類型和重連機(jī)制。

SSE與其他技術(shù)的對比

技術(shù)協(xié)議雙向通信復(fù)雜度適用場景
SSEHTTP單向服務(wù)器主動推送(如通知)
WebSocketWS雙向實時聊天、游戲
長輪詢HTTP半雙工兼容性要求高的場景

SSE的特點:

  • 自動重連:客戶端在連接斷開時會自動嘗試重新連接。
  • 輕量級協(xié)議:事件流格式簡單,無需額外解析庫。
  • 瀏覽器原生支持:現(xiàn)代瀏覽器通過EventSource API直接使用。

2、Spring Boot 中的SSE實現(xiàn)

2.1 添加依賴與配置

驗證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 實現(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 前端實現(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、高級實踐

3.1 結(jié)合Spring Security實現(xiàn)鑒權(quán)

保護(hù)SSE端點

@GetMapping("/sse/private-stream")
public SseEmitter privateStream(Authentication authentication) {
    if (authentication == null) {
        throw new SecurityException("未授權(quán)訪問");
    }
    return ssePushService.subscribe();
}

Token驗證:前端在初始化EventSource時攜帶Token:

new EventSource('/sse/private-stream?token=xxxx');

3.2 分布式場景下的解決方案

使用消息隊列廣播事件(以Redis Pub/Sub為例):

  1. 引入依賴:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
  1. 訂閱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端點(需集成Actuator)。
  • 背壓控制:使用Project Reactor的Flux處理背壓,避免服務(wù)器過載。

4、注意事項(增強(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、實戰(zhàn)案例:實時日志監(jiān)控系統(tǒng)

架構(gòu)設(shè)計

  1. 日志收集:Filebeat監(jiān)聽日志文件變動。
  2. 消息中轉(zhuǎn):Kafka接收日志并緩存。
  3. SSE推送:Spring Boot消費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)聽。

延伸閱讀

到此這篇關(guān)于Spring Boot 整合 SSE(Server-Sent Events)實戰(zhàn)案例(全網(wǎng)最全)的文章就介紹到這了,更多相關(guān)Spring Boot 整合 SSE內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例

    Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能示例

    這篇文章主要介紹了Java實現(xiàn)的時間戳與date對象相互轉(zhuǎn)換功能,結(jié)合具體實例形式分析了java日期與時間戳類型的表示與轉(zhuǎn)換相關(guān)操作技巧,需要的朋友可以參考下
    2017-06-06
  • 計算一個Java對象占用字節(jié)數(shù)的方法

    計算一個Java對象占用字節(jié)數(shù)的方法

    這篇文章主要介紹了計算一個Java對象占用字節(jié)數(shù)的方法,較為詳細(xì)的分析了Java中各類對象所占用的字節(jié)數(shù),需要的朋友可以參考下
    2015-01-01
  • 淺談一下數(shù)據(jù)庫連接池Druid德魯伊

    淺談一下數(shù)據(jù)庫連接池Druid德魯伊

    數(shù)據(jù)庫連接池就是一個容器持有多個數(shù)據(jù)庫連接,當(dāng)程序需要操作數(shù)據(jù)庫的時候直接從池中取出連接,使用完之后再還回去,和線程池一個道理,需要的朋友可以參考下
    2023-05-05
  • IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)

    IntelliJ?IDEA?2020.2.3永久破解激活教程(親測有效)

    intellij?idea?2022是一款市面上最好的JAVA?IDE編程工具,該工具支持git、svn、github等版本控制工具,整合了智能代碼助手、代碼自動提示等功能,本教程給大家分享IDEA?2022最新永久激活碼,感興趣的朋友參考下吧
    2020-10-10
  • 解決idea update project 更新選項消失的問題

    解決idea update project 更新選項消失的問題

    這篇文章主要介紹了解決idea update project 更新選項消失的問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Spring-AOP @AspectJ進(jìn)階之如何綁定代理對象

    Spring-AOP @AspectJ進(jìn)階之如何綁定代理對象

    這篇文章主要介紹了Spring-AOP @AspectJ進(jìn)階之如何綁定代理對象的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • SpringBoot + Druid + Dynamic Datasource 多數(shù)據(jù)源配置方案

    SpringBoot + Druid + Dynamic Dataso

    本文通過實例代碼給大家介紹SpringBoot整合Druid與多數(shù)據(jù)源配置,涵蓋自動裝配流程、數(shù)據(jù)源動態(tài)切換方案及監(jiān)控功能實現(xiàn),感興趣的朋友一起看看吧
    2025-08-08
  • Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    Java通過正則表達(dá)式獲取字符串中數(shù)字的方法示例

    最近工作中遇到了一個需求,需要利用java獲取字符串中的數(shù)字,嘗試幾種方法后發(fā)現(xiàn)利用正則表達(dá)式實現(xiàn)最為方法,下面這篇文章就主要介紹了Java通過正則表達(dá)式獲取字符串中數(shù)字的方法,文中給出了詳細(xì)的示例代碼,需要的朋友可以參考下。
    2017-03-03
  • Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備(測試代碼)

    Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備(測試代碼)

    BlueCove是一個開源的藍(lán)牙協(xié)議棧實現(xiàn),旨在為Java開發(fā)者提供一個全面的、易于使用的API,從而在應(yīng)用程序中實現(xiàn)藍(lán)牙功能,該項目支持多種操作系統(tǒng),這篇文章主要介紹了Java?Bluetooth?藍(lán)牙通訊?BlueCove?掃描附近的藍(lán)牙設(shè)備,需要的朋友可以參考下
    2025-01-01
  • Java tomcat中的類加載器和安全機(jī)制你了解嗎

    Java tomcat中的類加載器和安全機(jī)制你了解嗎

    這篇文章主要介紹了Tomcat 類加載器的實現(xiàn)方法,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值 ,需要的朋友可以參考下,希望能夠給你帶來幫助
    2021-09-09

最新評論

浏阳市| 乌拉特后旗| 金乡县| 巨鹿县| 克东县| 贵溪市| 高要市| 百色市| 隆德县| 琼结县| 中江县| 保康县| 万州区| 武汉市| 白山市| 宽城| 阿巴嘎旗| 故城县| 边坝县| 普兰县| 噶尔县| 曲阜市| 无极县| 潼南县| 怀宁县| 天水市| 当雄县| 望奎县| 彭山县| 辛集市| 厦门市| 贡觉县| 盐山县| 巨野县| 凯里市| 松原市| 濮阳县| 南开区| 永康市| 商河县| 临武县|