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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈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;适合同步…