Spring Boot中的WebSocket技術實現

WebSocket協議基礎

WebSocket作為現代實時通信的核心技術,通過全雙工TCP通道實現了接近實時的數據傳輸能力。該協議主要包含以下核心特性:

協議特點與通信機制

  1. 全雙工通信:與HTTP等傳統協議不同,WebSocket允許客戶端和服務端同時發送和接收數據,消除了請求-響應模式的限制
  2. 消息類型支持:協議原生定義文本(text)和二進制(binary)兩種消息格式,開發者可根據場景靈活選擇
  3. 子協議擴展:通常配合STOMP(Simple Text-Oriented Messaging Protocol)等高層協議使用,實現結構化消息傳遞

連接建立過程

WebSocket通過特殊的握手過程建立持久連接:

客戶端請求示例:
GET /chat HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Key: dGhlIHNhbXBsZSBub25jZSB3aGljaCBrZXk=服務端響應示例:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: s3pPLMBiTxaQ9kYGzzh5fWusIqFw=

握手流程包含三個關鍵階段:

  1. 客戶端發送包含Upgrade: websocket頭的HTTP請求
  2. 服務端返回101狀態碼確認協議切換
  3. 通過Sec-WebSocket-KeySec-WebSocket-Accept完成安全驗證

STOMP子協議架構

STOMP作為WebSocket的上層協議提供消息代理功能:

// Spring Boot中的STOMP配置示例
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/ws").withSockJS();}
}

該配置實現了:

  • 消息代理前綴設置(/topic)
  • 應用目標前綴定義(/app)
  • STOMP端點注冊(/ws)

與傳統方案的對比優勢

特性WebSocketHTTP輪詢
延遲毫秒級秒級
帶寬消耗低(持久連接)高(重復頭信息)
服務器壓力恒定連接數高頻新建連接
消息方向雙向單向
協議開銷一次握手每次請求握手

實際測試表明,在每秒1000條消息的場景下,WebSocket的CPU占用率比HTTP輪詢降低約60%,網絡流量減少75%以上。這種效率優勢在實時聊天、金融行情推送等高頻交互場景中尤為明顯。

Spring Boot集成WebSocket

核心依賴配置

在Spring Boot項目中集成WebSocket只需添加spring-boot-starter-websocket依賴,該starter會自動配置必要的WebSocket基礎設施。典型Gradle配置如下:

dependencies {implementation 'org.springframework.boot:spring-boot-starter-websocket'implementation 'org.webjars:sockjs-client:1.5.1'implementation 'org.webjars:stomp-websocket:2.3.4'implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
}

關鍵依賴說明:

  • sockjs-client:提供瀏覽器兼容性支持
  • stomp-websocket:實現STOMP協議客戶端
  • jackson-datatype-jsr310:處理Java 8時間類型序列化

消息代理配置

通過實現WebSocketMessageBrokerConfigurer接口進行消息代理配置:

@Configuration
@EnableWebSocketMessageBroker
public class UserSocketConfiguration implements WebSocketMessageBrokerConfigurer {@Overridepublic void configureMessageBroker(MessageBrokerRegistry config) {config.enableSimpleBroker("/topic");config.setApplicationDestinationPrefixes("/app");}@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/logs").withSockJS();}
}

配置要點:

  1. enableSimpleBroker("/topic"):啟用內存消息代理,處理/topic前綴的消息
  2. setApplicationDestinationPrefixes("/app"):定義應用消息前綴
  3. withSockJS():啟用SockJS回退選項

消息發送實現

使用MessageSendingOperations接口實現消息發送:

@Component
@AllArgsConstructor
public class UserSocket {private final MessageSendingOperations messageSendingOperations;public void sendUserEvent(Map event) {Map message = new HashMap<>(){{put("event", event);put("version", "1.0");put("time", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));}};messageSendingOperations.convertAndSend("/topic/user-logs", message);}
}

消息處理流程:

  1. 構造包含事件數據、版本和時間戳的消息體
  2. 通過convertAndSend方法發送到指定主題
  3. 所有訂閱/topic/user-logs的客戶端將實時接收消息

客戶端實現示例

瀏覽器端使用SockJS+STOMP的典型實現:

let stompClient = null;function connect() {let socket = new SockJS('/logs');stompClient = Stomp.over(socket);stompClient.connect({}, function(frame) {stompClient.subscribe('/topic/user-logs', function(response) {showLogs(JSON.parse(response.body));});});
}function showLogs(message) {console.log('Received:', message);
}

跨應用通信實現

其他Spring Boot應用可通過WebSocketStompClient接入:

@Configuration
public class UserSocketConfiguration {@Beanpublic WebSocketStompClient 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/907946.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/907946.shtml
英文地址,請注明出處:http://en.pswp.cn/news/907946.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

無法發布到PowerBI?試試拆分它

無法發布到PowerBI&#xff1f;試試拆分它 在進行PowerBI發布時&#xff0c;可能會遇到如下兩種無法發布到PowerBI的情況&#xff1a; 第一種&#xff0c;文件太大&#xff0c;無法發布&#xff0c;如圖&#xff1a; 第二種&#xff1a;遠程主機強迫關閉了一個現有的連接&…

光伏功率預測 | LSTM多變量單步光伏功率預測(Matlab完整源碼和數據)

光伏功率預測 | MATLAB實現基于LSTM長短期記憶神經網絡的光伏功率預測 目錄 光伏功率預測 | MATLAB實現基于LSTM長短期記憶神經網絡的光伏功率預測效果一覽基本介紹程序設計參考資料 效果一覽 基本介紹 光伏功率預測 | LSTM多變量單步光伏功率預測&#xff08;Matlab完整源碼和…

【圖像處理入門】2. Python中OpenCV與Matplotlib的圖像操作指南

一、環境準備 import cv2 import numpy as np import matplotlib.pyplot as plt# 配置中文字體顯示&#xff08;可選&#xff09; plt.rcParams[font.sans-serif] [SimHei] plt.rcParams[axes.unicode_minus] False二、圖像的基本操作 1. 圖像讀取、顯示與保存 使用OpenCV…

數據庫系統概論(十一)SQL 集合查詢 超詳細講解(附帶例題表格對比帶你一步步掌握)

數據庫系統概論&#xff08;十一&#xff09;SQL 集合查詢 超詳細講解&#xff08;附帶例題表格對比帶你一步步掌握&#xff09; 前言一、什么是集合查詢&#xff1f;二、集合操作的三種類型1. 并操作2. 交操作3. 差操作 三、使用集合查詢的前提條件四、常見問題與注意事項五、…

如何設計一個支持線上線下的通用訂單模塊 —— 面向本地生活服務行業的架構思路

一、背景與目標 在本地生活服務行業中&#xff0c;訂單模塊作為連接用戶、商戶、商品、支付、履約的核心組件&#xff0c;支撐著平臺內多樣化的業務形態&#xff0c;例如外賣配送、到店服務、團購核銷、即時零售、預約預訂、線下消費等。 設計一個可支持線上線下融合的通用訂…

Django數據庫連接報錯 django.db.utils.NotSupportedError: MySQL 8 or later is required

可嘗試換django版本 pip install django3.2.13 另外mysql下載地址 https://dev.mysql.com/downloads/installer/ 安裝可以參考&#xff1a; https://blog.csdn.net/HHHQHHHQ/article/details/148125549 重點&#xff1a;用戶變量添加 C:\Program Files\MySQL\MySQL Server …

github 提交失敗,連接不上

1. 第一種情況&#xff0c;開了加速器&#xff0c;導致代理錯誤 刪除hosts文件里相關的github代理地址 2. 有些ip不支持22端口連接,改為443連接 ssh -vT gitgithub.com // 命令執行結果 OpenSSH_for_Windows_9.5p1, LibreSSL 3.8.2 debug1: C…

24位高精度數據采集卡NET8860音頻振動信號采集監測滿足自動化測試應用現場的多樣化需求

NET8860 高分辨率數據采集卡技術解析 阿爾泰科技的NET8860是一款高性能數據采集卡&#xff0c;具備8路同步模擬輸入通道和24bit分辨率&#xff0c;適用于高精度信號采集場景。其輸入量程覆蓋10V、5V、2V、1V&#xff0c;采樣速率高達256KS/s&#xff0c;能夠滿足多種工業與科研…

JavaScript 模塊系統:CJS/AMD/UMD/ESM

文章目錄 前言一、CommonJS (CJS) - Node.js 的同步模塊系統1.1 設計背景1.2 瀏覽器兼容性問題1.3 Webpack 如何轉換 CJS1.4 適用場景 二、AMD (Asynchronous Module Definition) - 瀏覽器異步加載方案2.1 設計背景2.2 為什么現代瀏覽器不原生支持 AMD2.3 Webpack/Rollup 如何處…

使用NMEA Tools生成GPS軌跡圖

前言 在現代科技快速發展的時代&#xff0c;GPS定位技術已經廣泛應用于各種領域&#xff0c;如導航、物流、運動追蹤等。為了獲取和分析GPS數據&#xff0c;我們常常需要使用一些專業的工具。本文將詳細介紹如何使用一款名為“NMEA Tools”的APK應用&#xff0c;結合GPSVisual…

Word雙欄英文論文排版攻略

word寫雙欄英文論文的注意事項 排版首先改字體添加連字符還沒完呢有時候設置了兩端對齊會出現這樣的情況&#xff1a; 公式文獻 等我下學期有時間了&#xff0c;一定要學習Latex啊&#xff0c;word寫英文論文&#xff0c;不論是排版還是公式都很麻煩的&#xff0c;而Latex一鍵就…

FactoryBean 接口

Spring 框架中 FactoryBean 接口的特性&#xff0c;這是 Spring 提供的一種特殊機制&#xff0c;用于創建和管理復雜 Bean。讓我通過示例和解釋幫您理解這個概念。 一、FactoryBean 是什么&#xff1f; FactoryBean 是 Spring 框架提供的一個工廠接口&#xff0c;用于創建復雜…

MySQL + CloudCanal + Iceberg + StarRocks 構建全棧數據服務

簡述 在業務數據快速膨脹的今天&#xff0c;企業對 低成本存儲 與 實時查詢分析能力 的需求愈發迫切。 本文將帶你實戰構建一條 MySQL 到 Iceberg 的數據鏈路&#xff0c;借助 CloudCanal 快速完成數據遷移與同步&#xff0c;并使用 StarRocks 完成數據查詢等操作&#xff0c…

javaEE->多線程:線程池

線程池 線程誕生的意義&#xff1a;因為進程的創建/銷毀&#xff0c;太重量了&#xff08;比較慢&#xff09; 但如果近一步提高創建/銷毀的頻率&#xff0c;線程的開銷也不容忽視。 有兩種方法可以提高效率&#xff1a; 1.協程&#xff08;輕量級線程&#xff09;&#xff…

【001】利用github搭建靜態網站_essay

文章目錄 1. 簡介2. 先了解網址規則2.1 文件及網址形式2.2 相互訪問 3. 搭建網頁的過程3.1 網頁文件3.2 github搭建倉庫及文件上傳3.3 搭建網站 1. 簡介 相信大家都有過想要自己搭建一個穩定可靠的網站&#xff0c;github是一個不錯的選擇&#xff0c;本來國內有gitee可以搭建…

搜索引擎2.0(based elasticsearch6.8)設計與實現細節(完整版)

1 簡介 1.1 背景 《搜索引擎onesearch 1.0-設計與實現.docx》介紹了1.0特性&#xff0c;搜索schema&#xff0c;agg&#xff0c;表達式搜索映射&#xff0c;本文介紹onesearch 2.0 新特性, 參考第2節 規劃特性與發布計劃 1.2 關鍵詞 文檔 Document elasticsearch 一行數據稱為…

【ClickHouse】RollingBitmap

ClickHouse 的 RollingBitmap 是一種基于 Bitmap 的數據結構&#xff0c;用于高效處理數據的動態變化和時間窗口計算。以下是關于 ClickHouse RollingBitmap 的相關信息&#xff1a; RollingBitmap 的應用場景 RollingBitmap 主要用于需要處理動態數據和時間窗口計算的場景&am…

新版智慧社區(小區)智能化弱電系統解決方案

該方案聚焦新版智慧社區智能化弱電系統建設,以物聯網、云計算、AI 人臉識別等技術為支撐,構建涵蓋智能可視化對講、智慧門禁、智能梯控、智慧停車、視頻監控等核心系統的社區智能化體系,并通過智慧社區集成平臺實現設備管理、數據統計、預警聯動等功能。方案旨在解決傳統社區…

11高可用與容錯

一、Broker 高可用架構設計 1.1 RabbitMQ 鏡像集群方案 集群搭建步驟 # 節點1初始化 rabbitmq-server -detached rabbitmq-plugins enable rabbitmq_management# 節點2加入集群 rabbitmqctl stop_app rabbitmqctl join_cluster rabbitnode1 rabbitmqctl start_app# 創建鏡像…

AsyncIOScheduler與BackgroundScheduler的線程模型對比

1. BackgroundScheduler的線程機制? ?多線程模型?&#xff1a;BackgroundScheduler基于線程池執行任務&#xff0c;默認通過ThreadPoolExecutor創建獨立線程處理任務&#xff0c;每個任務運行在單獨的線程中&#xff0c;主線程不會被阻塞。?適用場景?&#xff1a;適合同步…