SpringBoot2.x系列教程(四十六)Spring Boot集成WebSocket之STOMP协议简介

在上篇文章中我们学习了WebSocket的基础概念,依旧相关的实战项目。在本篇文章中,我们来学习一下如何基于STOMP协议来进行WebSocket协议的实现。

也就是说基于WebSocket协议有多种实现,基于STOMP来实现是其中的一种,也是Spring Boot推荐的一种。

学习完WebSocket协议,我们知道它并没有规定其消息发送的详细格式。那就意味着每个使用WebSocket的开发者,都需要在服务端和客户端定义一套规则,用来传输信息。而STOMP的出现,正好解决了该问题。

STOMP协议

STOMP:原文Simple Text Orientated Messaging Protocol,是一个简单的文本消息传输协议,属于WebSocket的子协议,

STOMP提供了一个可互操作的连接格式,允许STOMP客户端与任意STOMP消息代理(Broker)进行交互。STOMP协议由于设计简单,易于开发客户端,因此在多种语言和多种平台上得到广泛地应用。

STOMP协议并不是为WebSocket所设计的,它其实是消息队列的一种协议,与AMQP,JMS是平级的。只不过由于它的简单性恰巧可以用于定义Websocket的消息体格式。目前很多服务端消息队列都已经支持了STOMP,比如RabbitMQ,Apache ActiveMQ等。

STOMP协议构成

STOMP是基于Text的,也允许传输二进制数据,默认编码是UTF-8。

STOMP是一种基于帧的协议。一帧由一个命令,一组可选的Header和一个可选的Body组成。

COMMAND        -- 注释:命令
header1:value1 -- 注释:一组可选Header之一
header2:value2 -- 注释:一组可选Header之一
               -- 注释:一个空行
Body^@         -- 注释:一个可选的Body

上述协议结构中,命令(COMMAND)对应的有SEND、SUBSCRIBE、MESSAGE、CONNECT、CONNECTED等。

Header类似HTTP的Header,有content-length,content-type等。

Body可以是二进制也可以是文本。Body与Header间通过一个空行(EOL)来分隔。

具体实例如下:

SEND
destination:/welcome
content-length:12

{"name":"1"}

STOMP服务端

STOMP服务端可以接收客户端发送的一组目标地址。

地址的格式在协议中并没有具体定义。使用/topic/a、/queue/a、queue-a等格式都是可以的。

这样的好处就是可以通过自定义不同的格式来表示不同的含义。比如,以/topic开头的为发布订阅模式,所有消费端都可以接收到消息;以/user开头的为点对点模式,只会被一个消费者客户端收到。

STOMP客户端

STOMP的客户端可以同时扮演两种角色:消息生产者和消息消费者。

作为生产者时通过SEND帧发送消息到指定的地址。

作为消费者时通过发送SUBSCRIBE帧到已知地址来进行消息订阅,当有生产者发送消息到对应的订阅地址时,作为消费者便会接收到对应的消息。

Spring Boot中的STOMP

首先看STOMP在Spring Boot中的简单流程图:

image

图中各个组件介绍:

  • 生产者客户端(左上组件):发送SEND命令到目的地址(destination)。
  • 消费者客户端(左下组件):订阅地址(destination),并接收此目的地址所推送过来的消息。
  • request channel:一组用来接收生产者型客户端所推送过来的消息的线程池。
  • response channel:一组用来推送消息给消费者型客户端的线程池。
  • broker: 消息队列管理者,也称消息代理。接收客户端的订阅指令,并记录订阅者与目的地址(destination)的关系。
  • SimpAnnotatonMethod:发送到达broker之前,会被该组件拦截,可先处理一些业务逻辑。
  • SimpleBroker:直接转到broker。不会被应用拦截。

整个流程如下:

  • 生产者客户端发送SEND命令消息到指定地址;
  • 服务端request channel接收到消息进行判断;
  • 如果目的地址是应用(/app)目的地址则转到SimpAnnotatonMethod中定义的业务方法进行处理。然后,再转到broker(SimpleBroker)。
  • 如果目的地址是非应用目的地址则直接转到broker。broker构建MESSAGE命令消息, 通过response channel推送给所有订阅对应地址的消费者

小结

本篇文章,关于STOMP协议相关内容就讲到这里,下篇文章,我们将以实战的形式,展示如何在Spring Boot中集成使用。

发布了562 篇原创文章 · 获赞 5153 · 访问量 339万+

猜你喜欢

转载自blog.csdn.net/wo541075754/article/details/104534998
今日推荐