当前位置: 首页 > article >正文

RuoYi-Vue-Plus项目实战:用WebSocket实现‘服务端通知’功能,我踩了这些坑

RuoYi-Vue-Plus实战WebSocket服务端通知功能深度解析与避坑指南在当今企业级应用开发中实时通信已成为提升用户体验的关键要素。当产品经理提出后台操作成功时前端实时弹窗提示的需求时作为技术负责人的你该如何选择技术方案本文将基于RuoYi-Vue-Plus框架深入剖析WebSocket的实现之道分享从架构设计到生产环境部署的全流程实战经验。1. 技术选型与架构设计1.1 轮询与WebSocket的抉择在实时通信领域开发者常面临轮询与WebSocket的技术选型难题。让我们通过一组对比数据揭示两者的本质差异对比维度短轮询长轮询WebSocket连接方式频繁HTTP请求保持连接直到响应持久化全双工连接延迟性高依赖轮询间隔中等极低毫秒级服务器压力高频繁建立连接中等低维持少量连接适用场景实时性要求低中等实时性要求高实时性要求关键结论对于后台操作通知这类需要即时反馈的场景WebSocket在性能和用户体验上具有压倒性优势。但要注意WebSocket并非银弹——在移动网络不稳定的环境下需要考虑消息可靠性的补偿机制。1.2 RuoYi-Vue-Plus中的WebSocket架构RuoYi-Vue-Plus框架基于Spring Boot和Vue.js其WebSocket实现采用了典型的服务端推送架构graph TD A[客户端] --|建立连接| B(WebSocket服务端) B -- C[Redis在线用户管理] D[业务系统] --|触发事件| B B --|推送消息| A注实际实现时需要处理以下核心问题连接鉴权与用户会话绑定分布式环境下的连接管理消息格式标准化断线重连机制2. 服务端实现关键步骤2.1 基础环境配置首先在ruoyi-common模块添加依赖dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-websocket/artifactId /dependency配置类需要特别注意容器适配问题。RuoYi-Vue-Plus默认使用Undertow服务器其配置与Tomcat存在差异Configuration EnableWebSocket public class WebSocketConfig { Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }2.2 用户会话管理实战用户区分是WebSocket实现中的关键难点。我们采用Redis用户名绑定的混合方案ServerEndpoint(/websocket/{userName}) public class WebSocketService { private static final ConcurrentHashMapString, Session sessions new ConcurrentHashMap(); OnOpen public void onOpen(PathParam(userName) String userName, Session session) { sessions.put(userName, session); RedisUtils.setCacheObject(ws:user:userName, active); } public static void sendMessage(String userName, String message) { Session session sessions.get(userName); if (session ! null session.isOpen()) { session.getAsyncRemote().sendText(message); } } }避坑指南会话存储需要使用线程安全的ConcurrentHashMapRedis需要设置合理的过期时间建议30分钟必须实现心跳机制检测死连接2.3 消息协议设计规范良好的消息协议是系统可扩展性的保障。推荐采用以下JSON格式{ msgId: UUID, type: NOTIFICATION|ALERT|PROGRESS, title: 操作成功, content: 用户数据已更新, timestamp: 1630000000000, metadata: { businessId: 123, priority: 1 } }关键设计原则包含唯一消息ID便于追踪明确的消息类型字段扩展metadata字段应对未来需求变化时间戳采用毫秒级Unix时间3. 前端实现与优化3.1 Vue组件化封装前端实现建议采用策略模式根据不同消息类型展示不同UI// websocket-mixin.js export default { data() { return { wsReconnectCount: 0, maxReconnectAttempts: 5 } }, methods: { initWebSocket() { const wsUrl ws://${location.host}/websocket/${this.$store.state.user.name} this.websocket new WebSocket(wsUrl) this.websocket.onmessage (event) { const message JSON.parse(event.data) switch(message.type) { case NOTIFICATION: this.showNotification(message) break case PROGRESS: this.updateProgress(message) break default: console.warn(未知消息类型, message) } } this.websocket.onclose () { if (this.wsReconnectCount this.maxReconnectAttempts) { setTimeout(() { this.initWebSocket() this.wsReconnectCount }, 3000) } } } } }3.2 性能优化技巧消息节流高频消息如进度更新需要做前端聚合let progressUpdateTimer function handleProgress(message) { clearTimeout(progressUpdateTimer) progressUpdateTimer setTimeout(() { updateUI(message) }, 200) // 200ms内只更新最后一次 }内存管理及时清理无用的消息监听器离线处理本地存储重要消息待用户上线后提示4. 生产环境进阶问题4.1 Undertow容器适配问题RuoYi-Vue-Plus默认使用Undertow容器与WebSocket集成时需注意工作线程配置server: undertow: worker-threads: 20 io-threads: 4缓冲区大小调整Bean public WebServerFactoryCustomizerUndertowServletWebServerFactory undertowCustomizer() { return factory - factory.addDeploymentInfoCustomizers(deploymentInfo - { deploymentInfo.setBufferSize(1024 * 16); }); }4.2 分布式环境解决方案在集群部署时需要引入消息中间件实现跨节点通信// 使用Redis发布订阅 Bean public RedisMessageListenerContainer container(RedisConnectionFactory factory) { RedisMessageListenerContainer container new RedisMessageListenerContainer(); container.setConnectionFactory(factory); container.addMessageListener((message, pattern) - { String msg new String(message.getBody()); // 解析消息并转发到本地WebSocket会话 }, new ChannelTopic(websocket:msg)); return container; }4.3 监控与运维建议实现以下监控指标当前活跃连接数消息吞吐量条/分钟平均消息延迟重连率可通过Spring Boot Actuator暴露端点Endpoint(id websocket) Component public class WebSocketMetricsEndpoint { ReadOperation public MapString, Object metrics() { return Map.of( activeConnections, WebSocketService.getSessionCount(), messageRate, messageRateCalculator.getRate() ); } }5. 典型问题排查手册5.1 连接建立失败现象前端报错WebSocket connection failed排查步骤检查Nginx配置location /websocket { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection upgrade; }验证防火墙设置检查服务端线程池是否耗尽5.2 消息丢失问题解决方案实现客户端ACK机制websocket.onmessage (event) { const msg JSON.parse(event.data) if (msg.requireAck) { websocket.send(JSON.stringify({ack: msg.msgId})) } }服务端实现消息重试队列关键消息采用数据库持久化5.3 性能瓶颈优化当连接数超过5000时建议采用分片策略按用户ID哈希分配到不同服务节点升级WebSocket协议到wssTLS加密会消耗更多资源考虑使用专业消息中间件如Kafka替代原生WebSocket在最近的一个电商项目中我们采用上述方案成功支撑了秒杀结果实时通知场景峰值QPS达到12000平均延迟控制在200ms以内。关键经验是提前做好压力测试建立完善的监控体系以及设计优雅的降级方案——当WebSocket不可用时自动降级为长轮询。

相关文章:

RuoYi-Vue-Plus项目实战:用WebSocket实现‘服务端通知’功能,我踩了这些坑

RuoYi-Vue-Plus实战:WebSocket服务端通知功能深度解析与避坑指南 在当今企业级应用开发中,实时通信已成为提升用户体验的关键要素。当产品经理提出"后台操作成功时前端实时弹窗提示"的需求时,作为技术负责人的你该如何选择技术方案…...

告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境

告别环境报错:用Docker 10分钟在本地/服务器部署YOLOv8完整开发环境 在计算机视觉领域,YOLOv8作为当前最先进的目标检测模型之一,其强大的性能和易用性吸引了大量开发者和研究者。然而,传统的手动搭建开发环境过程往往令人望而生畏…...

LuaJIT字节码逆向难题:LJD如何帮你恢复可读源码

LuaJIT字节码逆向难题:LJD如何帮你恢复可读源码 【免费下载链接】luajit-decompiler https://gitlab.com/znixian/luajit-decompiler 项目地址: https://gitcode.com/gh_mirrors/lu/luajit-decompiler 面对编译后的LuaJIT字节码文件,你是否曾困惑…...

初创公司技术选型时为何将Taotoken作为大模型统一接入层

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 初创公司技术选型时为何将Taotoken作为大模型统一接入层 对于初创公司的技术负责人而言,在构建基于大模型的应用时&…...

HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合

HS2-HF Patch:如何用5分钟为HoneySelect2实现完整汉化与MOD整合 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch是HoneySelect2玩家的终…...

私有化视频会议平台/视频高清直播点播EasyDSS构建智慧校园音视频协作新生态

在教育数字化转型的关键阶段,智慧校园对音视频协作系统的需求,已从基础的远程沟通,升级为安全可控、体验流畅、管理智能的一体化解决方案。视频直播点播平台EasyDSS凭借技术创新与场景深耕,成为智慧校园建设的核心支撑&#xff0c…...

使用 Taotoken 管理多个 API Key 并设置访问权限与审计

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 使用 Taotoken 管理多个 API Key 并设置访问权限与审计 在开发和集成大模型应用时,一个常见的需求是为不同的应用、环境…...

PaddleOCR训练集制作避坑指南:从text_renderer合成到roLabelImg标注的全链路解析

PaddleOCR训练集制作全流程实战:从数据合成到模型调优的完整方法论 在工业级OCR项目落地过程中,数据集质量往往比模型架构更能决定最终效果上限。不同于学术界的标准benchmark竞赛,真实业务场景面临字体缺失、背景干扰、版式多变等复杂挑战。…...

别再傻傻分不清了!GIS新手必看:WGS84和UTM到底怎么选?附QGIS/ArcGIS实操对比

GIS坐标系选择指南:WGS84与UTM的核心差异与实战决策 刚接触地理信息系统(GIS)时,坐标系的选择往往令人困惑。为什么同样的位置数据,在不同坐标系下显示的数值完全不同?为什么测量同一个区域的面积会得到差异巨大的结果&#xff1f…...

通过 curl 命令直接测试 taotoken 大模型接口的响应

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 通过 curl 命令直接测试 taotoken 大模型接口的响应 在开发或调试大模型应用时,有时我们希望绕过 SDK,直接…...

Cortex-Debug终极指南:5分钟掌握VSCode最强STM32调试工具

Cortex-Debug终极指南:5分钟掌握VSCode最强STM32调试工具 【免费下载链接】cortex-debug Visual Studio Code extension for enhancing debug capabilities for Cortex-M Microcontrollers 项目地址: https://gitcode.com/gh_mirrors/co/cortex-debug 还在为…...

终极免费跨平台方案:draw.io桌面版完美编辑Visio文件

终极免费跨平台方案:draw.io桌面版完美编辑Visio文件 【免费下载链接】drawio-desktop Official electron build of draw.io 项目地址: https://gitcode.com/GitHub_Trending/dr/drawio-desktop 还在为不同操作系统间的Visio文件兼容性而烦恼吗?当…...

Python核心基础

本文摘要:Python核心基础章节系统讲解了编程基础知识,主要包括:1.字面量的概念与写法,强调字符串必须使用引号包裹;2.变量与常量的定义与使用,介绍命名规则和三种命名风格;3.注释的两种形式&…...

发现FinalBurn Neo:解锁经典街机游戏的终极模拟方案

发现FinalBurn Neo:解锁经典街机游戏的终极模拟方案 【免费下载链接】FBNeo FinalBurn Neo - We are Team FBNeo. 项目地址: https://gitcode.com/gh_mirrors/fb/FBNeo 你是否曾想重温那些定义了游戏黄金时代的经典街机游戏,却苦于找不到合适的平…...

告别IBus!在Ubuntu 22.04上为Fcitx5安装搜狗输入法并设置自启动的完整流程

在Ubuntu 22.04上深度配置Fcitx5与搜狗输入法的现代输入方案 对于追求高效输入的Linux用户而言,输入法框架的选择往往决定了日常使用的流畅度体验。传统IBus框架虽然预装在大多数发行版中,但在中文输入场景下常显力不从心——词库更新滞后、云输入支持有…...

X86与ARM架构深度解析:从指令集到生态的全面对比

1. 项目概述:为什么我们需要重新审视X86与ARM最近几年,无论是选购新电脑、关注手机芯片,还是围观科技新闻,你肯定没少听到“X86”和“ARM”这两个词。苹果的Mac电脑全面转向自研的M系列芯片,让“ARM架构”从手机、平板…...

ZYNQ启动全解析:从BootROM到你的App,SD卡与QSPI Flash烧录究竟差在哪?

ZYNQ启动全解析:从BootROM到你的App,SD卡与QSPI Flash烧录究竟差在哪? 当一块ZYNQ开发板静静躺在桌面上,按下电源键的瞬间,芯片内部究竟发生了什么?为什么有的工程师选择SD卡启动,而另一些则坚…...

做网安的这几年,挖漏洞接私活赚的是我工资的3倍,这些门道没几人知道

前言 这是我做网络安全工程师(简称网安)的第9个年头,从我工作的第3年起,我就一直在开始尝试去接网安方面的私活,这6年平均下来,我接私活赚的钱几乎是我工资的3倍。 而很多人要么不敢去做,要么就…...

【限时解密】ElevenLabs未公开的马来文SSML扩展语法:支持“Johor-Riau变体”、“Kedah重音标记”及连读停顿控制

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs马来文语音合成的技术演进与本地化挑战 ElevenLabs自2022年推出多语言TTS服务以来,持续扩展其语音模型对东南亚语言的支持能力。马来文(Bahasa Melayu)作为…...

别再让治具压坏你的板子!手把手教你用TSK-64应力测试仪搞定ICT/FCT应力管控

从应力失控到精准管控:TSK-64测试仪在ICT/FCT产线的实战指南 当产线突然出现批量PCBA功能异常时,多数工程师的第一反应是检查焊接质量或元器件性能,却往往忽略了治具施加的机械应力这个"隐形杀手"。某汽车电子制造商曾因FCT治具压力…...

HTTP协议认识

什么是 Http 协议? 超文本传输协议,规定了浏览器与服务器通信的规则 Http 协议的特点? 面向连接、安全的协议(基于 TCP)基于请求响应模型的无状态的协议 按F12 一、状态码大类 状态码分类说明1xx响应中…...

开放量子系统模拟:分治法混合态制备与Kraus算子优化

1. 开放量子系统模拟的挑战与机遇量子计算最令人期待的潜力之一,就是能够高效模拟传统计算机难以处理的量子系统动力学。然而在实际物理系统中,完全孤立的量子系统并不存在——环境噪声、退相干效应和测量干扰都会显著影响系统演化。这类与环境相互作用的…...

瑞芯微RV1126在无人机视觉AI应用:从芯片选型到部署实战

1. 项目概述:当国产芯遇上天空之眼最近几年,无人机早已不是航拍发烧友的专属玩具,它在农业植保、电力巡检、安防监控、测绘建模等专业领域大放异彩。在这些场景里,无人机不再仅仅是“会飞的相机”,它需要成为一台“会飞…...

Python运算符:比较运算符(等于不等等于大于小于)与返回值

Python运算符:比较运算符(等于不等等于大于小于)与返回值📚 本章学习目标:深入理解比较运算符(等于不等等于大于小于)与返回值的核心概念与实践方法,掌握关键技术要点,了…...

ElevenLabs湖南话TTS深度评测(2024真实场景压测报告):声调准确率92.6%、连读自然度行业首破88分

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs湖南话语音技术概览 ElevenLabs 作为全球领先的语音合成平台,其多语言支持能力持续扩展,但需明确指出:截至 2024 年底,ElevenLabs 官方模型库*…...

ElevenLabs缅甸文TTS落地难题全拆解:从音素对齐失败到语调失真,3步精准修复

更多请点击: https://intelliparadigm.com 第一章:ElevenLabs缅甸文TTS落地难题的根源认知 ElevenLabs官方API当前未原生支持缅甸文(Burmese, my-MM),其语音合成模型训练语料库中缺乏足够规模、高质量、带韵律标注的缅…...

避坑!STM32CubeIDE偏好设置改了回不去?这份备份与恢复攻略请收好

STM32CubeIDE配置管理实战:从个人备份到团队协作的最佳实践 引言 当你花了整个下午精心调整STM32CubeIDE的代码配色方案,却发现某个关键语法高亮突然失效;当团队新成员反复询问如何统一代码格式化规则;当更换电脑后不得不重新配置…...

图文实操|飞书联动 OpenClaw,搭建智能电脑操控体系

OpenClaw 飞书机器人配置教程|一键对接飞书,聊天下达 AI 指令 适配版本:OpenClaw(小龙虾)前置要求:已部署 OpenClaw Windows 端(Win10/Win11 均可),未部署可先下载一键部…...

AM62x处理器SPI总线实战:从原理到Linux驱动配置与调试

1. 从四根线到高效数据流:深入拆解AM62x处理器的SPI总线实战在嵌入式开发里,和各类传感器、存储芯片、显示屏打交道是家常便饭。当你需要一种简单、高效、引脚又少的通信方式时,SPI总线几乎总是首选方案。它就像一条精心设计的高速公路&#…...

ElevenLabs客家话语音合规红线预警:GDPR+《生成式AI服务管理暂行办法》双框架下,3类方言数据采集授权漏洞与2种语音指纹脱敏方案(含可审计代码模板)

更多请点击: https://codechina.net 第一章:ElevenLabs客家话语音合规红线预警总览 ElevenLabs 作为前沿的AI语音合成平台,其多语言支持能力持续扩展,但对客家话等非标准化方言的生成存在明确的合规边界。平台未将客家话列入官方…...