专栏名称: hryou0922
目录
相关文章推荐
建E室内设计网  ·  建E首发 | 奥迅设计:慵懒时光,收纳美学的治愈力 ·  2 天前  
FM1031济南交通广播  ·  暴涨近1000%! ·  2 天前  
FM1031济南交通广播  ·  暴涨近1000%! ·  2 天前  
有方空间  ·  彼得·卒姆托作品全集 ... ·  3 天前  
51好读  ›  专栏  ›  hryou0922

Spring Boot系列十七 Spring Boot 集成 websocket,使用RabbitMQ做为消息代理

hryou0922  · 掘金  ·  · 2018-04-08 05:35

正文

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插件

  1. 在RabbitMQ上启动rabbitmq_web_stomp插件,在rabbitMQ上执行如下命令:sudo rabbitmq-plugins enable rabbitmq_web_stomp
  2. 登录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"处理所有消息将消息发送到外部的消息代理
                .enableStompBrokerRelay("/exchange","/topic","/queue","/amq/queue")
                .setRelayHost("192.168.0.113")
                .setClientLogin("hry")
                .setClientPasscode("hry")
                .setSystemLogin("hry")
                .setSystemPasscode("hry")
                .setSystemHeartbeatSendInterval(5000)
                .setSystemHeartbeatReceiveInterval(4000);
                ;
}
}

3.4. ws-broadcast-rabbitmq.jsp

这里的jsp和上面的jsp类似,这里略

3.5. 测试方法

执行启动类: WebSocketRabbitMQApplication 如果连接RabbitMQ,会打印如下信息:

2018-03-26 23:22:04.354 [reactor-tcp-io-1] INFO  o.s.m.s.s.StompBrokerRelayMessageHandler - "System" session connected.
2018-03-26 23:22:04.358 [reactor-tcp-io-1] INFO  o.s.m.s.s.StompBrokerRelayMessageHandler - BrokerAvailabilityEvent[available=true, StompBrokerRelay[192.168.0.113:61613]]

测试请求:
http://127.0.0.1:8080//broadcast-rabbitmq/index
具体测试的配置见下方

4. 演示在RabbitMQ不同目的的(destination)用法

WebSocketRabbitMQMessageBrokerConfigurer中我们需要配置消息代理的前缀。在RabbitMQ中合法的目的前缀:/temp-queue, /exchange, /topic, /queue, /amq/queue, /reply-queue/. 我们这里演示以上后4个的用法







请到「今天看啥」查看全文