RabbitMQ 实现即时通讯居然如此简单!后端代码都省得写了
QoS 0(Almost Once):至多一次,只发送一次,会发生消息丢失或重复;
QoS 1(Atleast Once):至少一次,确保消息到达,但消息重复可能会发生;
QoS 2(Exactly Once):只有一次,确保消息只到达一次。
[](
)RabbitMQ 启用 MQTT 功能
=======================================================================================
RabbitMQ 启用 MQTT 功能,需要先安装然 RabbitMQ 然后再启用 MQTT 插件。
首先我们需要安装并启动 RabbitMQ,对 RabbitMQ 不了解的朋友可以参考《花了 3 天总结的 RabbitMQ 实用技巧,有点东西!》;
接下来就是启用 RabbitMQ 的 MQTT 插件了,默认是不启用的,使用如下命令开启即可;
rabbitmq-plugins?enable?rabbitmq_mqtt
开启成功后,查看管理控制台,我们可以发现 MQTT 服务运行在 1883 端口上了。
[](
)MQTT 客户端
==============================================================================
我们可以使用 MQTT 客户端来测试 MQTT 的即时通讯功能,这里使用的是 MQTTBox 这个客户端工具。
首先下载并安装好 MQTTBox,下载地址:http://workswithweb.com/mqttbox.html
点击 Create MQTT Client 按钮来创建一个 MQTT 客户端;
接下来对 MQTT 客户端进行配置,主要是配置好协议端口、连接用户名密码和 QoS 即可;
再配置一个订阅者,订阅者订阅 testTopicA 这个主题,我们会向这个主题发送消息;
发布者向主题中发布消息,订阅者可以实时接收到。
[](
)前端直接实现即时通讯
=================================================================================
既然 MQTTBox 客户端可以直接通过 RabbitMQ 实现即时通讯,那我们是不是直接使用前端技术也可以实现即时通讯?答案是肯定的!下面我们将通过 html+javascript 实现一个简单的聊天功能,真正不写一行后端代码实现即时通讯!
由于 RabbitMQ 与 Web 端交互底层使用的是 WebSocket,所以我们需要开启 RabbitMQ 的 MQTT WEB 支持,使用如下命令开启即可;
rabbitmq-plugins?enable?rabbitmq_web_mqtt
开启成功后,查看管理控制台,我们可以发现 MQTT 的 WEB 服务运行在 15675 端口上了;
WEB 端与 MQTT 服务进行通讯需要使用一个叫 MQTT.js 的库,项目地址:https://github.com/mqttjs/MQTT.js
实现的功能非常简单,一个单聊功能,需要注意的是配置好 MQTT 服务的访问地址为:ws://localhost:15675/ws
<!DOCTYPE?html><html?lang="en"><head>????<meta?charset="UTF-8">????<title>Title</title></head><body><div>????<label>目标 Topic:<input?id="targetTopicInput"?type="text"></label><br>????<label>发送消息:<input?id="messageInput"?type="text"></label><br>????<button?onclick="sendMessage()">发送</button>????<button?onclick="clearMessage()">清空</button>????<div?id="messageDiv"></div></div></body><script?src="https://unpkg.com/mqtt/dist/mqtt.min.js"></script><script>????//RabbitMQ 的 web-mqtt 连接地址????const?url?=?'ws://localhost:15675/ws';????//获取订阅的 topic????const?topic?=?getQueryString("topic");????//连接到消息队列????let?client?=?mqtt.connect(url);????client.on('connect',?function?()?{????????//连接成功后订阅 topic????????client.subscribe(topic,?function?(err)?{????????????if?(!err)?{????????????????showMessage("订阅 topic:"?+?topic?+?"成功!");????????????}????????});????});????//获取订阅 topic 中的消息????client.on('message',?function?(topic,?message)?{????????showMessage("收到消息:"?+?message.toString());????});????//发送消息????function?sendMessage()?{????????let?targetTopic?=?document.getElementById("targetTopicInput").value;????????let?message?=?document.getElementById("messageInput").value;????????//向目标 topic 中发送消息????????client.publish(targetTopic,?message);????????showMessage("发送消息给"?+?targetTopic?+?"的消息:"?+?message);????}????//从 URL 中获取参数????function?getQueryString(name)?{????????let?reg?=?new?RegExp("(^|&)"?+?name?+?"=([^&]*)(&|$)",?"i");????????let?r?=?window.location.search.substr(1).match(reg);????????if?(r?!=?null)?{????????????return?decodeURIComponent(r[2]);????????}????????retu
rn?null;????}????//在消息列表中展示消息????function?showMessage(message)?{????????let?messageDiv?=?document.getElementById("messageDiv");????????let?messageEle?=?document.createElement("div");????????messageEle.innerText?=?message;????????messageDiv.appendChild(messageEle);????}????//清空消息列表????function?clearMessage()?{????????let?messageDiv?=?document.getElementById("messageDiv");????????messageDiv.innerHTML?=?"";????}</script></html>
接下来我们订阅不同的主题开启两个页面测试下功能(页面放在了 SpringBoot 应用的 resource 目录下了,需要先启动应用再访问):
第一个订阅主题 testTopicA,访问地址:http://localhost:8088/page/index?topic=testTopicA
第二个订阅主题 testTopicB,访问地址:http://localhost:8088/page/index?topic=testTopicB
之后互相发送消息,让我们来看看效果吧!
[](
)在 SpringBoot 中使用
=====================================================================================
没有特殊业务需求的时候,前端可以直接和 RabbitMQ 对接实现即时通讯。但是有时候我们需要通过服务端去通知前端,此时就需要在应用中集成 MQTT 了,接下来我们来讲讲如何在 SpringBoot 应用中使用 MQTT。
首先我们需要在 pom.xml 中添加 MQTT 相关依赖;
在 application.yml 中添加 MQTT 相关配置,主要是访问地址、用户名密码、默认主题信息;
rabbitmq:??mqtt:????url:?tcp://localhost:1883????username:?guest????password:?guest????defaultTopic:?testTopic
编写一个 Java 配置类从配置文件中读取配置便于使用;
评论