1. 概述
在上篇文章 Spring Boot系列十六 WebSocket简介和spring boot集成简单消息代理 中我们使用的消息代理是spring内置的简单消息代理,简单消息代理非常适合入门,但是只支持STOMP命令的子集(如不支持acks, receipts),依赖于消息发送循环,并且不支持集群。我们可以使用外部的消息代理(如RabbitMQ, ActiveMQ),来实现全功能消息代理。本文以集成RabbitMQ为例。本文的主要内容如下:
- 使用RabbitMQ做websocket消息代理的准备工作和消息流程图
- Spring Boot使用RabbitMQ做websocket的主要代码
- 演示在RabbitMQ不同目的的(destination)用法
2. 使用RabbitMQ做websocket消息代理的准备工作和消息流程图
关于RabbitMQ的用法,可以参考本作者的 RabbitMQ系列文章
2.1. 使用RabbitMQ做websocket消息代理的准备工作
我们选择类似RabbitMQ全功能的消息代理。安装消息代理后,以支持STOMP的情况情况运行服务。 我们在RabbitMQ上启动rabbitmq_web_stomp插件
- 在RabbitMQ上启动rabbitmq_web_stomp插件,在rabbitMQ上执行如下命令:sudo rabbitmq-plugins enable rabbitmq_web_stomp
- 登录RabbitMQ管理平台,看到如下信息,发现已经开启stomp代理服务
2.2. 消息流程图
此图和使用简单消息最大的不同是"broker relay"用于通过TCP将消息传递给外部STOMP代理(如这里是RabbitMQ),并将消息从代理传递给订阅客户
3. Spring Boot使用RabbitMQ做websocket的主要代码
3.1. pom.xml
首先在上一篇文章的基础上增加如下jar
<!-- https://mvnrepository.com/artifact/io.projectreactor/reactor-net -->
<dependency>
<groupId>io.projectreactor</groupId>
<artifactId>reactor-net</artifactId>
<version>2.0.8.RELEASE</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.netty/netty-all -->
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
<version>4.1.22.Final</version>
</dependency>
3.2. BroadcastRabbitMQCtl
和上文BroadcastCtl类似,这里略
3.3. WebSocketRabbitMQMessageBrokerConfigurer 配置
配置外部Rabibitmq替代Simple Broker做消息代理:在configureMessageBroker()方法中配置外部RabbitMQ的地址、帐号密码连接到RabbitMQ
@Configuration
// 此注解开使用STOMP协议来传输基于消息代理的消息,此时可以在@Controller类中使用@MessageMapping
@EnableWebSocketMessageBroker
public class WebSocketRabbitMQMessageBrokerConfigurer extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
/**
* 注册 Stomp的端点
*
* addEndpoint:添加STOMP协议的端点。这个HTTP URL是供WebSocket或SockJS客户端访问的地址
* withSockJS:指定端点使用SockJS协议
*/
registry.addEndpoint("/websocket-rabbitmq").withSockJS();
}
@Override
public void configureMessageBroker(MessageBrokerRegistry registry) {
/**
* 配置消息代理
* 使用RabbitMQ做为消息代理,替换默认的Simple Broker
*/
registry
// "STOMP broker relay"