热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

RabbitMQ使用amqp实现实时推送功能

文章目录一、前言二、效果三、安装rabbitmq四、开启服务五、访问http:localhost:15672#六、demo知识点ymlhtmlpom测试:发送消息方式


文章目录

    • 一、前言
    • 二、效果
    • 三、安装rabbitmq
    • 四、开启服务
    • 五、访问http://localhost:15672/#/
    • 六、demo
      • 知识点
      • yml
      • html
      • pom
      • 测试:发送消息
        • 方式一
        • 方式二
          • 队列
        • 其他
    • 报错: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


应用


选择哪种工作模式

在这里插入图片描述


完成消息数量


前端消息详情列表


前后端都有设置重连


解决会断线的情况


消息丟失問題

在这里插入图片描述

在这里插入图片描述


推荐阅读
  • Skywalking系列博客1安装单机版 Skywalking的快速安装方法
    本文介绍了如何快速安装单机版的Skywalking,包括下载、环境需求和端口检查等步骤。同时提供了百度盘下载地址和查询端口是否被占用的命令。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • 负载均衡_Nginx反向代理动静分离负载均衡及rewrite隐藏路径详解(Nginx Apache MySQL Redis)–第二部分
    nginx反向代理、动静分离、负载均衡及rewrite隐藏路径详解 ... [详细]
  • 本文介绍了南邮ctf-web的writeup,包括签到题和md5 collision。在CTF比赛和渗透测试中,可以通过查看源代码、代码注释、页面隐藏元素、超链接和HTTP响应头部来寻找flag或提示信息。利用PHP弱类型,可以发现md5('QNKCDZO')='0e830400451993494058024219903391'和md5('240610708')='0e462097431906509019562988736854'。 ... [详细]
  • Ubuntu安装常用软件详细步骤
    目录1.GoogleChrome浏览器2.搜狗拼音输入法3.Pycharm4.Clion5.其他软件1.GoogleChrome浏览器通过直接下载安装GoogleChro ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • Centos7搭建ELK(Elasticsearch、Logstash、Kibana)教程及注意事项
    本文介绍了在Centos7上搭建ELK(Elasticsearch、Logstash、Kibana)的详细步骤,包括下载安装包、安装Elasticsearch、创建用户、修改配置文件等。同时提供了使用华为镜像站下载安装包的方法,并强调了保证版本一致的重要性。 ... [详细]
  • 本文介绍了网页播放视频的三种实现方式,分别是使用html5的video标签、使用flash来播放以及使用object标签。其中,推荐使用html5的video标签来简单播放视频,但有些老的浏览器不支持html5。另外,还可以使用flash来播放视频,需要使用object标签。 ... [详细]
  • 本文介绍了Java后台Jsonp处理方法及其应用场景。首先解释了Jsonp是一个非官方的协议,它允许在服务器端通过Script tags返回至客户端,并通过javascript callback的形式实现跨域访问。然后介绍了JSON系统开发方法,它是一种面向数据结构的分析和设计方法,以活动为中心,将一连串的活动顺序组合成一个完整的工作进程。接着给出了一个客户端示例代码,使用了jQuery的ajax方法请求一个Jsonp数据。 ... [详细]
  • springboot启动不了_Spring Boot + MyBatis 多模块搭建教程
    作者:枫本非凡来源:www.cnblogs.comorzlinp9717399.html一、前言1、创建父工程最近公司项目准备开始重构,框 ... [详细]
  • 浅析Mysql数据回滚错误的解决方法_PHP教程:MYSQL的事务处理主要有两种方法。1、用begin,rollback,commit来实现begin开始一个事务rollback事 ... [详细]
  • 【系列二】长连接,短连接及WebSocket介绍(含http1.0,1.1,2.0相关)
    前言上一节讲了长轮询和轮询及其实现,这节讲一讲长连接、短连接及webSocket,在讲这些之前,我们先来普及一下http相关的一 ... [详细]
  • 一、前言2012年毕业,2016年转行,没有一个体面的工作,机缘巧合之下,来到了大连,Java培训,一个全新的领域,迷茫、困惑、漫无目的的努力,转行真的被歧视,真的不行吗?我命由我 ... [详细]
  • Istio是一个用来连接、管理和保护微服务的开放平台。Istio提供一种简单的方式来为已部署的服务建 ... [详细]
author-avatar
陈跃西vs_298
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有