作者:陈跃西vs_298 | 来源:互联网 | 2023-08-24 20:10
文章目录一、前言二、效果三、安装rabbitmq四、开启服务五、访问http:localhost:15672#六、demo知识点ymlhtmlpom测试:发送消息方式
文章目录
- 一、前言
- 二、效果
- 三、安装rabbitmq
- 四、开启服务
- 五、访问http://localhost:15672/#/
- 六、demo
- 报错:Whoops! Lost connection to ws://127.0.0.1:15674/ws
- 解决:连接成功后,报错:Whoops! Lost connection to ws://127.0.0.1:15674/ws
- 升级版:
- 应用
- 选择哪种工作模式
- 完成消息数量
- 前端消息详情列表
- 前后端都有设置重连
- 解决会断线的情况
- 消息丟失問題
小编最近在做大屏实时推送数据;所以在网上学习了这个rabbitmq的amqp来做这个功能;附上自己的总结
消息的实时推送一般有3种方式:
1.Ajax 短轮询
2.长轮询
3.WebSocket 双向通信
短轮询的实现是定时异步刷新任务来实现数据的加载,但这种方式实时效果较差,而且对服务端的压力也较大。
长轮询的实现是通过 Ajax 机制,但区别于传统的 Ajax 应用,长轮询的服务器端会在没有数据时阻塞请求直到有新的数据产生或者请求超时才返回,之后客户端再重新建立连接获取数据。但长轮询服务端会长时间地占用资源,如果消息频繁发送的话会给服务端带来较大的压力。
WebSocket 是 HTML5 中一种新的通信协议,能够实现浏览器与服务器之间全双工通信。如果浏览器和服务端都支持 WebSocket 协议的话,该方式实现的消息推送无疑是最高效、简洁的。并且最新版本的 IE、Firefox、Chrome 等浏览器都已经支持 WebSocket 协议,Apache Tomcat 7.0.27 以后的版本也开始支持 WebSocket。
demo:[参考git项目](https://github.com/hzoboy/rabbitmq-websocket.git)
一、前言
RabbitMQ相关的一些内容
4369 (epmd), 25672 (Erlang distribution)
Epmd 是 Erlang Port Mapper Daemon 的缩写,在 Erlang 集群中相当于 dns 的作用,绑定在4369端口上。
5672, 5671 (AMQP 0-9-1 without and with TLS)
AMQP 是 Advanced Message Queuing Protocol 的缩写,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,专为面向消息的中间件设计。基于此协议的客户端与消息中间件之间可以传递消息,并不受客户端/中间件不同产品、不同的开发语言等条件的限制。Erlang 中的实现有 RabbitMQ 等。
15672 (if management plugin is enabled)
通过 http://serverip:15672 访问 RabbitMQ 的 Web 管理界面,默认用户名密码都是 guest。(注意:RabbitMQ 3.0之前的版本默认端口是55672,下同)
61613, 61614 (if STOMP is enabled)
Stomp 是一个简单的消息文本协议,它的设计核心理念就是简单与可用性,官方文档,实践一下 Stomp 协议需要:
一个支持 stomp 消息协议的 messaging server (譬如activemq,rabbitmq);
一个终端(譬如linux shell);
一些基本命令与操作(譬如nc,telnet)
1883, 8883 (if MQTT is enabled)
MQTT 只是 IBM 推出的一个消息协议,基于 TCP/IP 的。两个 App 端发送和接收消息需要中间人,这个中间人就是消息服务器(比如ActiveMQ/RabbitMQ),三者通信协议就是 MQTT
二、效果
使用了AMQP功能实时推送
三、安装rabbitmq
安装完rabbitMq后需要启动stomp有关的一系列插件:
rabbitmq-plugins enable rabbitmq_management rabbitmq_web_stomp rabbitmq_stomp rabbitmq_web_stomp_examples
其中RabbitMQ运行在15672端口,stomp服务运行在15674端口。
RabbitMQ 有很多第三方插件,可以在 AMQP 协议基础上做出许多扩展的应用。Web STOMP 插件就是基于 AMQP 之上的 STOMP 文本协议插件,利用 WebSocket 能够轻松实现浏览器和服务器之间的实时消息传递,具体实现方式如下图所示:
四、开启服务
rabbitmqctl stop
rabbitmq-server start
注:启动web查看工具会多开一个15672端口.注意3.0以下版本端口为55672,本例子为3.0以上版本所以为15672
重启完成之后你用你的浏览器输入你rabbitmq服务器地址然后访问15672端口,你会看见登陆界面,账号和密码都是guest,我在本地输入下面地址
五、访问http://localhost:15672/#/
这里有版本区分 3.0以上 以端口15672来访问管理页面
登录
guest
guest
六、demo
知识点
这里还有其他模式,根据自己需求更改
/queue/queuename:使用默认转发器订阅/发布消息,默认由stomp自动创建一个持久化队列 /amq/queue/queuename:与/queue/queuename的区别在于队列不由stomp自动进行创建,队列不存在失败 /topic/routing_key:通过amq.topic转发器订阅/发布消息,订阅时默认创建一个临时队列,通过routing_key与topic进行绑定 /temp-queue/xxx:创建一个临时队列(只能在headers中的属性reply-to中使用),可用于发送消息后通过临时队列接收回复消息,接收通过client.onreceive /exchange/exchangename/[routing_key]:通过转发器订阅/发布消息,转发器需要手动创建 client.subscribe(destination,callback,headers) :订阅消息 client.send(destination,headers,body):发布消息 client.unsubscribe(id):取消订阅,id为订阅时返回的编号 client.onreceive:默认接收回调从临时队列获取消息
yml
server.port=7070spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
html
<html> <head> <title>WebSocket</title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <div id="main" style="width: 200px;height: 200px;background-color: antiquewhite;"><div id="message"></div> </div> </body> <script src="./js/jquery.js"></script><!-- stomp协议的客户端脚本 --><script src="./js/stomp.js"></script><!-- SockJS的客户端脚本 --><script src="./js/sockjs.js"></script> <script type="text/Javascript">/**/queue/queuename:使用默认转发器订阅/发布消息,默认由stomp自动创建一个持久化队列 /amq/queue/queuename:与/queue/queuename的区别在于队列不由stomp自动进行创建,队列不存在失败 /topic/routing_key:通过amq.topic转发器订阅/发布消息,订阅时默认创建一个临时队列,通过routing_key与topic进行绑定 /temp-queue/xxx:创建一个临时队列(只能在headers中的属性reply-to中使用),可用于发送消息后通过临时队列接收回复消息,接收通过client.onreceive /exchange/exchangename/[routing_key]:通过转发器订阅/发布消息,转发器需要手动创建 client.subscribe(destination,callback,headers) :订阅消息 client.send(destination,headers,body):发布消息 client.unsubscribe(id):取消订阅,id为订阅时返回的编号 client.onreceive:默认接收回调从临时队列获取消息 */var ws = new WebSocket(&#39;ws://127.0.0.1:15674/ws&#39;);// 获得Stomp client对象var client = Stomp.over(ws);// SockJS does not support heart-beat: disable heart-beatsclient.heartbeat.outgoing = 0;client.heartbeat.incoming = 0;// 定义连接成功回调函数var on_connect = function(x) {//data.body是接收到的数据client.subscribe("/queue/shbykj-bi.queues.test", function(data) {var msg = data.body;$("#message").append("收到数据:" + msg);});};// 定义错误时回调函数var on_error = function(res) {console.log(&#39;error&#39;);console.log(res)};// 连接RabbitMQclient.connect(&#39;guest&#39;, &#39;guest&#39;, on_connect, on_error, &#39;/&#39;);console.log(">>>连接上http://127.0.0.1:15674");</script> </html>
pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.4.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.shbykj</groupId><artifactId>rabbitmq-websocket-demo</artifactId><version>0.0.1-SNAPSHOT</version><name>rabbitmq-websocket-demo</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
测试:发送消息
方式一
1.创建新队列
如下:shbykj-bi.queues.test
方式二
队列
其他
报错:Whoops! Lost connection to ws://127.0.0.1:15674/ws
这里对应
解决:连接成功后,报错:Whoops! Lost connection to ws://127.0.0.1:15674/ws
设置心跳重连时间
//设置心跳保持时间client.heartbeat.outgoing = 100; // if 5000 means client will send heart beat every 5000msclient.heartbeat.incoming = 100;// if 0 means client does not want to receive heartbeats from server
有点像定时器,不断重发
升级版:
默认情况下RabbitMQ是不开启MQTT 协议的,所以需要我们手动的开启相关的插件,而RabbitMQ的MQTT 协议分为两种。
第一种 rabbitmq_mqtt 提供与后端服务交互使用,对应端口1883。
rabbitmq-plugins enable rabbitmq_mqtt
第二种 rabbitmq_web_mqtt 提供与前端交互使用,对应端口15675。
rabbitmq-plugins enable rabbitmq_web_mqtt
应用
选择哪种工作模式
完成消息数量
前端消息详情列表
前后端都有设置重连
解决会断线的情况
消息丟失問題