01、RabbitMQ入门

news2024/11/20 3:25:35

目录

1.、什么是MQ

2、应用场景

 3、主流MQ框架

4、Docker安装部署RabbitMQ 

5、RabbitMQ管理平台

6、MQ的核心概念

单一生产者和单一消费者

7、springboot整合rabbitmq

执行测试方法testRabbitmq,控制台输出:receive msg : test rabbitmq message !!!


1.、什么是MQ

消息队列(Message Queue,简称MQ),从字面意思上看,本质是个队列,FIFO先入先出,只不过队列中存放的内容是message而已

作用:应用程序“对”应用程序的通信方法。

2、应用场景

主要解决异步处理、应用解耦、流量削锋等问题,实现高性能,高可用,可伸缩和最终一致性架构

1.异步处理
     用户注册后,需要发注册邮件和注册短信

 

 

 

 2.应用解耦
     用户下单后,订单系统需要通知库存系统

 

 3.流量削锋(重点)
     流量削锋也是消息队列中的常用场景,一般在秒杀或团抢活动中使用广泛

 应用场景:秒杀活动,一般会因为流量过大,导致流量暴增,应用挂掉。为解决这个问题,一般需要在应用前端加入消息队列
     a、可以控制活动的人数
     b、可以缓解短时间内高流量压垮应用
用户的请求,服务器接收后,首先写入消息队列。假如消息队列长度超过最大数量,则直接抛弃用户请求或跳转到错误页面。秒杀业务根据消息队列中的请求信息,再做后续处理

4.日志处理
     日志处理是指将消息队列用在日志处理中,比如Kafka的应用,解决大量日志传输的问题
     1.日志采集客户端,负责日志数据采集,定时写受写入Kafka队列
     2.Kafka消息队列,负责日志数据的接收,存储和转发
     3.日志处理应用:订阅并消费kafka队列中的日志数据

 3、主流MQ框架

MQ框架非常之多,比较流行的有RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ。本文主要介绍RabbitMq 。

RabbitMQ是以AMQP协议实现的一种消息中间件产品。AMQP是Advanced Message Queuing Protocol的简称,它是一个面向消息中间件的开放式标准应用层协议。

4、Docker安装部署RabbitMQ 

注意获取镜像的时候要获取management版本的,不要获取last版本的,management版本的才带有管理界面

#1.查询镜像

   $ docker search rabbitmq:management 

   #2.获取镜像

   $ docker pull rabbitmq:management
  
   #3.运行镜像
   ##方式一:默认guest用户,密码也是guest

   $ docker run -d -p 5672:5672 -p 15672:15672 --name rabbitmq rabbitmq:management

   ##方式二:设置用户名和密码

   $ docker run -d \
     --name my-rabbitmq \
     -p 5672:5672 -p 15672:15672 \
     -v /data:/var/lib/rabbitmq \
     --hostname my-rabbitmq-host \
     -e RABBITMQ_DEFAULT_VHOST=my_vhost \
     -e RABBITMQ_DEFAULT_USER=admin \
     -e RABBITMQ_DEFAULT_PASS=admin \
     --restart=always \
     rabbitmq:management 

 参数说明:
   -d:后台运行容器
   -name:指定容器名
   -p:指定服务运行的端口(5672:应用访问端口;15672:控制台Web端口号)
   -v:映射目录或文件,启动了一个数据卷容器,数据卷路径为:/var/lib/rabbitmq,再将此数据卷映射到住宿主机的/data目录
   --hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
   -e:指定环境变量;(
RABBITMQ_DEFAULT_VHOST:默认虚拟机名;
RABBITMQ_DEFAULT_USER:默认的用户名;
RABBITMQ_DEFAULT_PASS:默认用户名的密码)
   --restart=always:当Docker重启时,容器能自动启动   
   rabbitmq:management:镜像名

注1:RABBITMQ_DEFAULT_VHOST=my_vhost,my_vhost名字请记好,在之后的编程中要用到,如果启动时没指定,默认值为/

#4.进入RabbitMQ管理平台进行相关操作
注1:容器启动后,可以通过docker logs 窗口ID/容器名字 查看日志
        docker logs my-rabbitmq    
注2:停止并删除所有容器
        docker stop $(docker ps -aq) && docker rm $(docker ps -aq)

5、RabbitMQ管理平台

后台地址:http://[宿主机IP]:15672
默认账号:guest/guest,用户也可以自己创建新的账号,例如:admin/admin

1.Virtual Hosts
     就象mysql有数据库的概念并且可以指定用户对库和表等操作的权限。那RabbitMQ呢?RabbitMQ也有类似的权限管理。
     在RabbitMQ中可以虚拟消息服务器VirtualHost,每个VirtualHost相当于一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。另外,虚拟主机的限制有两个:最大连接数和最大队列数  

 2.RabbitMQ关键名词
     Server(Broker):接收客户端连接,实现AMQP协议的消息队列和路由功能的进程;
     Virtual Host:虚拟主机的概念,类似权限控制组,一个Virtual Host里可以有多个Exchange和Queue。
     Exchange:交换机,接收生产者发送的消息,并根据Routing Key将消息路由到服务器中的队列Queue。
     ExchangeType:交换机类型决定了路由消息行为,RabbitMQ中有三种类型Exchange,分别是fanout、direct、topic;
     Message Queue:消息队列,用于存储还未被消费者消费的消息;
     Message:由Header和body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等;body是真正需要发送的数据内容;
     BindingKey:绑定关键字,将一个特定的Exchange和一个特定的Queue绑定起来。

6、MQ的核心概念

   生产者、队列、消费者、消息 

   生产者生产消息并投递到队列中,
   消费者可以从队列中获取消息并消费,
   消息指的是各个服务之间要传递的数据

以上用个例子来说就是,生产相当于商家,队列就像是我们的骑手,消费者也就是我们,消息就像是一个美团外卖平台

单一生产者和单一消费者

7、springboot整合rabbitmq

1.安装好rabbitmq,登陆RabbitMQ管理平台,新增管理用户并设置权限

        1.新增用户:springboot/123456
        2.切换到springboot用户登陆,在All users中,点击Name为springboot, 进入权限设置页面
        3.在权限设置页面,进入Permissions页面,点击“Set permission"

 2.pom.xml添加rabbitmq依赖

<dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-amqp</artifactId>
     </dependency>

3.rabbitmq连接配置

server.port=8080
     ## rabbitmq config
     spring.rabbitmq.host=192.168.199.144
     spring.rabbitmq.port=5672
     spring.rabbitmq.username=springboot
     spring.rabbitmq.password=123456
## 与启动容器时虚拟主机名字一致~~~与启动容器时虚拟主机名字一致~~~与启动容器时虚拟主机名字一致~~~
     spring.rabbitmq.virtual-host=my_vhost
 

4.创建Rabbit配置类RabbitConfig,配置类主要用来配置队列、交换器、路由等高级信息

@Configuration
     public class RabbitConfig {
       @Bean
       public Queue firstQueue() {
         // 创建一个队列,名称为:first
         return new Queue("first");
       }
     }

5.创建消息产生者类

@Component
     public class Sender {
       @Autowired
       private AmqpTemplate rabbitTemplate;

       public void send() {
         rabbitTemplate.convertAndSend("first", "test rabbitmq message !!!");
       }
     }

6.创建消息消费者

@Component
     @RabbitListener(queues = "first")
     public class Receiver {
         @RabbitHandler
         public void process(String msg) {
             System.out.println("receive msg : " + msg);
         }
     }

注解作用:
     @RabbitListener注解:定义该类需要监听的队列
     @RabbitHandler注解:指定对消息的处理

7.启动主程序,控制台如果出现以下信息,则说明rabbitmq连接成功

 Created new connection: rabbitConnectionFactory#5adb0db3:0/SimpleConnection@183e8023 [delegate=amqp://springboot@192.168.199.144:5672/my_vhost, localPort= 53066] 

8.创建测试类 

@RunWith(SpringJUnit4ClassRunner.class)
     @SpringBootTest
     public class RabbitmqTest {

         @Autowired
         private Sender sender;

         @Test
         public void testRabbitmq() throws Exception {
             sender.send();
         }
     }

执行测试方法testRabbitmq,控制台输出:receive msg : test rabbitmq message !!!

注1:测试用例报错“@RunWith和@SpringBootTest注解失效”
          解决方案:将测试用例保存到test/java目录下,而非main/java目录下

感谢大佬们的赏读

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/62551.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计时间管理软件appSpringboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Vector-常用CAN工具 - CANoe入门到精通_01

之前有写过相关的CANoe工程配置&#xff0c;不过没有进行系统的介绍&#xff0c;通过各位热心人士的反馈&#xff0c;有些内容无法看懂&#xff0c;因此后续的内容会做好排版&#xff0c;让大家从入门到精通&#xff0c;一次性掌握所有的相关内容。今天就主要来介绍下VN1640/VN…

读vue源码搞懂响应式原理

vue2响应式原理 Vue2是借助Object.defineProperty()实现的&#xff0c;而Vue3是借助Proxy实现的想深入学习 Vue2 的响应式原理, 需要先学习 Object.defineProperty() 方法为了称呼方便, 后续说 Vue 响应式原理统一指 Vue2 的响应式原理 1.Object.defineProperty 方法 - 简介 定…

go实战(1)-hello,world与包基础(1)-模块基础

目录程序结构程序代码使用和建立包建立目录模块参考中的身份验证计算哈希值go.sum文件Checksum database程序结构 声明一个main包(包是对函数进行分组的一种方法&#xff0c;它由同一目录中的所有文件组成)。 导入流行的fmt包&#xff0c;它包含格式化文本的函数&#xff0c;…

WIFI码挪车码创建生成CPS聚合流量主小程序开发

WIFI码挪车码创建生成CPS聚合流量主小程序开发 系统特点// 这不是一套普通的给别人开SAAS账号的CPS推广返利系统&#xff0c;而是一套服务商版的CPS推广返利系统&#xff01;所谓服务商版&#xff0c;就是所有CPS推广走你的渠道接口&#xff0c;除了可以给你的下级客户开账号外…

MySQL下载安装运行

方式1、MySQL 官方网站&#xff1a;http://www.mysql.com 拉到最下面&#xff1a; 方式2、Windows版 MySQL 的官方下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 配置环境变量&#xff1a;在Path中添加至“\bin”&#xff08;系统盘C盘&#xff09;形式 使用管…

【OpenCV 例程 300篇】249. 特征描述之视网膜算法(FREAK)

『youcans 的 OpenCV 例程300篇 - 总目录』 【youcans 的 OpenCV 例程 300篇】249. 特征检测之视网膜算法&#xff08;FREAK&#xff09; 1. FREAK 算法简介 快速视网膜算法&#xff08;FREAK&#xff09;算法是 Alexandre Alahi 在 ICCV 2012 的论文 FREAK: Fast Retina Keyp…

1.32 Cubemx_STM32F429串口中断+空闲中断

1、简介 有时候串口接收数据时,没有帧头与帧尾,单纯使用单字节中断接收数据,不太好断帧。如果单纯使用空闲中断接收数据,当帧内数据不连续或者黏包,使用空闲中断接收就会出现接收的数据小于或者大于帧长度,比较难断帧。解决办法 方法1、单字节中断接收+空闲中断 发送命…

Spring Cache组件

《Spring Cache组件》 提示: 本材料只做个人学习参考,不作为系统的学习流程,请注意识别!!! 《Spring Cache组件》《Spring Cache组件》1. Spring Cache组件概述2. ConcurrentHashMap缓存管理3. Cacheable详解4. Caffeine缓存管理5. 缓存更新策略6. 缓存清除策略7. 多级缓存策略…

[附源码]计算机毕业设计基于Springboot景区直通车服务系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

探究商城中的在线语音谈判功能开发

近年来&#xff0c;电子商务已经成为一种新型的商业形式&#xff0c;电子商务的发展让传统的面对面谈判发展为以互联网为依托的在线沟通&#xff0c;相较于传统的谈判方式&#xff0c;在线语音谈判方式更便捷、更高效&#xff0c;逐渐成为商务谈判的主流&#xff0c;因此该功能…

FastReport Mono 2023.1 Crack

与位于 FastReport 云服务器上的报表进行交互。特征 现在支持与 FastReport Cloud 报告生成器的部分集成。改进的报告验证器包括一个带有错误编号的新的可自定义列。添加了来自 JasperReports 的模板转换器。改进的“MSChartObject”&#xff1a; 常用设置已移至单独的编辑器。…

线程池详细介绍

线程池执行流程 线程池的状态 RUNNINGSHUTDOWNSTOPTIDYINGTERMINATED 线程池优雅关闭 线程池有两个关闭方法&#xff0c;shutdown()和shutdownNow()&#xff0c;shutdown()切换到SHUTDOWN状态&#xff0c;shutdownNow()切换到STOP状态&#xff0c;当队列和线程池都为空的时候…

学习 | ANSYS经典界面在压力容器分析设计中的应用

导读&#xff1a;分析设计作为压力容器设计的重要方法&#xff0c;不仅解决了压力容器常规设计所不能解决的问题&#xff0c;而且也是压力容器设计观点与方法上的一个质的飞跃。 分析设计通常分为两类&#xff1a;应力分类法&#xff08;弹性方法&#xff09;和直接法&#xf…

基于FPGA的SD NAND图片显示实现

文章目录 0、前言 1、目标 2、图片的预处理 3、SD NAND的预处理 4、FPGA实现 4.1、详细设计 4.2、仿真 4.3、实验结果 0、前言 在上一篇文章《基于FPGA的SD卡的数据读写实现&#xff08;SD NAND FLASH&#xff09;》中&#xff0c;我们了解到了SD NAND Flash的相关知识…

大(json)文件压缩(minify)

文章目录Preface解决方案Preface 现在在做一个 GIS 地图的项目, 做过地图的应该就知道各省/市/县的json文件有多大(大部分都是经纬度数据), 就直接放前台public目录下了. 文件过大, 上传到服务器就占用很多空间, 这时候就有人提出需求, 让把这个问题处理一下. (虽然这个事情没…

mysql日志管理 、备份与恢复

目录 一、数据备份的重要性与分类 1、数据备份的重要性 2、从物理与逻辑的角度&#xff0c;备份分为 3、从数据库的备份策略角度&#xff0c;备份可分为 3.1 完全备份&#xff08;只适合第一次&#xff09; 3.2 差异备份&#xff08;用的较少&#xff0c;有丢失数据的现象…

应用 Serverless 化,让业务开发心无旁骛

我们希望让用户做得更少而收获更多&#xff0c;通过Serverless化&#xff0c;用云就像用电一样简单。”张建锋表示&#xff0c;Serverless 让云计算从一种资源真正变成一种能力&#xff0c;未来云将全面 Serverless 化&#xff0c;更加接近“电网”模式&#xff0c;按计算的调用…

使用Visual Studio Code 进行Python编程

1、下载Visual Studio Code 到微软的Visual Studio Code官方主页下载Visual Studio Code: Visual Studio: 面向软件开发人员和 Teams 的 IDE 和代码编辑器Visual Studio 开发工具和服务让任何开发人员在任何平台和语言的应用开发都更加轻松。 随时随地免费使用代码编辑器或 I…

web期末网站设计大作业:基于HTML+CSS+JavaScript制作新能源汽车企业网站

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…