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中的简单流程图:
图中各个组件介绍:
- 生产者客户端(左上组件):发送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中集成使用。
上一篇: 大作业--月球绕地球旋转简版