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

WebSocket子协议STOMP

1. 核心概念:为什么需要 STOMP?

  • WebSocket 的局限性:WebSocket 协议本身只定义了如何建立一个全双工的通信通道(text 和 binary 两种消息类型),但它没有定义消息的具体内容、格式和语义。它就像一条高速公路,但没有规定路上跑的车是什么(是货车还是客车?载什么货?)。
  • STOMP 的作用:STOMP 就是跑在这条高速公路上的“车辆标准”。它是一个应用层协议,定义了:
    • 消息格式:基于文本的“帧”(Frame)结构,包含命令(如 SEND, SUBSCRIBE)、头信息(Headers)和可选的正文(Body)。
    • 通信模式:清晰地支持发布/订阅 (Pub/Sub)点对点 (Point-to-Point) 模式。
    • 目的地 (Destination):通过类似 URL 的路径(如 /topic/news, /queue/tasks)来标识消息的“目的地”,这是实现消息路由的关键。

简单来说,STOMP 让 WebSocket 从一个“裸”的通信管道,变成了一个功能完备的消息系统。


2. Spring 中的 STOMP 架构:服务器扮演什么角色?

文档的核心是理解 Spring 应用在 STOMP 通信中的角色。它不是一个简单的 WebSocket 服务器,而是一个消息代理 (Message Broker)消息代理的代理 (Broker Relay)

  • 场景一:使用内置的 Simple Broker (简单代理)

    • Spring 应用就是 Broker:Spring 应用自身维护一个内存中的订阅列表,并负责将消息广播给订阅者。
    • 配置
      @Configuration
      @EnableWebSocketMessageBroker
      public class WebSocketConfig implements WebSocketMessageBrokerConfigurer {@Overridepublic void registerStompEndpoints(StompEndpointRegistry registry) {registry.addEndpoint("/portfolio").withSockJS(); // STOMP 端点}@Overridepublic void configureMessageBroker(MessageBrokerRegistry registry) {registry.setApplicationDestinationPrefixes("/app"); // 应用处理的路径前缀registry.enableSimpleBroker("/topic", "/queue"); // 启用内置简单代理,处理 /topic 和 /queue 路径}
      }
      
    • 优点:简单,易于上手,适合小型应用或原型开发。
    • 缺点:功能有限(不支持 ACK、Receipts 等),不支持集群,不适合高并发生产环境。
  • 场景二:使用外部的 Full-Featured Broker (如 RabbitMQ, ActiveMQ)

    • Spring 应用是 Broker Relay (代理中继):Spring 应用不再自己处理消息的存储和广播,而是作为一个“中继站”,将来自客户端的消息转发给外部的、功能强大的消息代理(如 RabbitMQ),再将代理广播的消息转发回给客户端。
    • 配置
      @Override
      public void configureMessageBroker(MessageBrokerRegistry registry) {registry.enableStompBrokerRelay("/topic", "/queue"); // 启用对 RabbitMQ 等外部代理的中继registry.setApplicationDestinationPrefixes("/app");
      }
      
    • 优点:功能强大,支持集群,高可用,高并发,适合生产环境。
    • 缺点:需要额外部署和维护消息代理。

3. 消息的流动 (Flow of Messages)

理解消息在服务器内部是如何流转的至关重要。文档中的“Flow of Messages”部分(4.4.5)描绘了清晰的流程:

  1. 客户端 -> 服务器 (Inbound)

    • 客户端发送 STOMP 帧(如 SENDSUBSCRIBE)。
    • 消息被解码成 Spring 的 Message 对象。
    • 发送到 clientInboundChannel
    • 路由
      • 如果目的地以 /app 开头(如 /app/greeting),则被路由到带有 @MessageMapping 注解的控制器方法进行处理。
      • 如果目的地以 /topic/queue 开头,则直接路由到消息代理(Simple Broker 或 Broker Relay)。
  2. 服务器 -> 客户端 (Outbound)

    • 控制器返回消息:当 @MessageMapping 方法处理完消息后,它的返回值会被自动包装成一个新消息,目的地通常是 /topic/greeting(将 /app 替换为 /topic),然后发送到 brokerChannel
    • 代理广播:消息代理接收到消息后,会找到所有订阅了该目的地的客户端,并通过 clientOutboundChannelMESSAGE 帧发送回这些客户端的 WebSocket 连接。

关键点:服务器不能主动向未订阅的客户端发送消息。所有从服务器发出的 MESSAGE 帧都必须是对某个 SUBSCRIBE 消息的响应。


4. 核心组件与编程模型

  • @MessageMapping:这是最核心的注解,类似于 HTTP 中的 @RequestMapping。它将特定目的地的 STOMP 消息映射到 Java 方法上。
    @Controller
    public class GreetingController {@MessageMapping("/greeting") // 处理发往 /app/greeting 的消息@SendTo("/topic/greetings") // 将返回值发送到 /topic/greetingspublic Greeting handle(Greeting greeting) {return new Greeting("Hello, " + greeting.getName() + "!");}
    }
    
  • @SendTo / @SendToUser:用于自定义控制器方法返回消息的广播目的地。
    • @SendTo:向所有订阅该目的地的用户广播。
    • @SendToUser点对点,向特定用户(如 /user/queue/errors)发送消息。这是实现“用户专属消息”(如私信、个人通知)的关键。
  • SimpMessagingTemplate:这是手动发送消息的“瑞士军刀”。任何 Spring 组件(如 @Service)都可以注入它,主动向任意目的地或特定用户发送消息。
    @Service
    public class NotificationService {private final SimpMessagingTemplate messagingTemplate;public void sendNotification(String username, String message) {messagingTemplate.convertAndSendToUser(username, "/queue/notifications", message);}
    }
    
  • 认证 (Authentication):文档强调,通常不要在 STOMP 的 CONNECT 帧中使用 login/passcode。而是在 HTTP 层(WebSocket 握手时)进行认证(如使用 Spring Security),Spring 会自动将认证的 Principal 与 WebSocket 会话关联,并在后续的所有 STOMP 消息中添加 user 头信息。这是安全且符合 Web 习惯的做法。

5. 关键特性与高级主题

  • 用户目的地 (User Destinations):通过 /user/{username}/destination 的语法,可以轻松实现向特定用户发送消息,无论该用户有多少个活跃的 WebSocket 会话。
  • 消息顺序 (Order of Messages):默认情况下,由于多线程处理,消息到达客户端的顺序可能不保证。可以通过 setPreservePublishOrder(true) 来保证同一会话内消息的发送顺序。
  • 性能与监控
    • 可以配置 clientInboundChannelclientOutboundChannel 的线程池大小以应对不同的负载。
    • 可以设置 sendTimeLimitsendBufferSizeLimit 来防止慢客户端拖垮服务器。
    • WebSocketMessageBrokerStats 提供了丰富的运行时监控数据,是诊断问题的利器。
  • 测试:文档提到了两种测试策略:
    • 服务端测试:不启动服务器,直接测试 @MessageMapping 方法的逻辑。
    • 端到端测试:启动嵌入式服务器,使用 STOMP 客户端进行完整的通信测试。

总结

这份文档全面阐述了如何利用 Spring + STOMP over WebSocket 构建实时应用。

  • STOMP 解决了 WebSocket 消息语义缺失的问题,提供了一个标准化的、基于目的地的发布/订阅和点对点通信模型。
  • Spring 提供了强大的基础设施,让你可以用熟悉的注解(@MessageMapping)来处理消息,并通过 SimpMessagingTemplate 主动发送消息。
  • 架构选择:你可以选择轻量的 Simple Broker 快速开始,或选择强大的 External Broker (如 RabbitMQ) 来构建可扩展的生产级应用。
  • 安全性:推荐在 HTTP 层进行认证,而不是在 STOMP 协议层。

总而言之,这份文档是使用 Spring 构建现代实时 Web 应用(如聊天室、实时通知、股票行情推送等)的权威指南。

http://www.dtcms.com/a/548485.html

相关文章:

  • 品牌网站制作流程图抓取网站后台
  • 堆内存与栈内存的所有权管理:Rust 内存安全的底层逻辑
  • 从零开始的C++学习生活 18:C语言复习课(期末速通)
  • 跳水不改大趋势!盘后出利好!
  • phpstudy(PHP 集成开发环境工具)下载安装教程
  • 题解:CF2150B Grid Counting
  • 远程操作怕“泄密“?深度解析ToDesk/向日葵/Splashtop/AnyDesk安全隐私防护力
  • SQL之表的查改(上)
  • 专业制作网站 郑在电脑上做苗木网站
  • wordpress 主题采集网站大图片优化
  • 快站app制作教程钟表玻璃东莞网站建设
  • 网站首页一般做多大尺寸小程序开发兼职
  • 菜鸟网站建设行业网站建设哪家好
  • 自助建站源码下载直播软件视频软件
  • 安徽省建设干部学校网站关停手机网站开发软件下载
  • 电子手工外发加工网成都黑帽seo
  • 常德seowordpress评论框优化
  • 石家庄企业建站哪家好可以做用户调研的网站
  • 广西网站建设定制医疗营销网站建设
  • 企业网站内容如何搭建wordpress模板本地怎么安装
  • 免费网站在线观看人数在哪直播中小企业网站建设价格
  • 郑州陆港开发建设有限公司网站wordpress 关闭警告
  • 做韩国的跨境电商网站如何k掉网站
  • 佛山免费网站建设网站如何优化
  • 企业网网站怎么做保定建网站公司
  • 建设银行辽宁招聘网站社科联网站建设方案策划书
  • 如何建网站要什么条件wordpress 多地址插件
  • 有没有专门做尾料回收的网站宁德网站建设
  • 有关天猫网站开发的论文搭建钓鱼网站教程
  • 连云港网站建设培训班ajax瀑布流网站模板