Message queue 消息队列--RabbitMQ 【基础入门】
🎉🎉欢迎来到我的CSDN主页!🎉🎉
🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚
🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门】》。🎯🎯
🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁
目录
一,Message queue介绍:
二,RabbitMQ介绍:
2.1什么是RabbitMQ?
2.2RabbitMQ组成?
2.3RabbitMQ工作原理
2.4RabbitMQ在企业项目中使用场景:
2.5Docker安装部署RabbitMQ
2.6创建springboot项目嵌套RabbitMQ
传递字符串类型
传递实体类型
访问测试:
一,Message queue介绍:
1.1使用消息队列的优点:
服务之间最常见的通信方式是直接调用彼此来通信,消息从一端发出后立即就可以达到另一端,称为即时消息通讯(同步通信) 消息从某一端发出后,首先进入一个容器进行临时存储,当达到某种条件后,再由这个容器发送给另一端,称为延迟消息通讯(异步通信)
如下:如果我们不使用MQ的话由订单直接调用其他的方法就会有几个问题:
1.过度耦合:如果后面创建订单时,需要触发新的动作,那就得去改代码,在原有的创建订单函数末尾,再追加一行代码
2.缺少缓冲:如果创建订单时,会员系统恰好处于非常忙碌或者宕机的状态,那这时更新会员信息就会失败,我们需要一个地方,来暂时存放无法被消费的消息
解决:需要一个消息中间件,来实现解耦和缓冲的功能.
二,RabbitMQ介绍:
2.1什么是RabbitMQ?
RabbitMQ是一个功能强大的消息队列中间件,被广泛应用于分布式系统、微服务架构和异步任务处理等场景。它提供了丰富的特性和灵活的配置选项,能够满足各种不同的需求。同时也有其他的MQ,RabbitMQ只是消息队列的一种。
2.2RabbitMQ组成?
消息队列:消息队列是一种在应用程序之间进行异步通信的方式。发送方将消息发送到队列,接收方从队列中接收消息并进行处理。这种方式能够解耦发送方和接收方,提高系统的可靠性和可扩展性。
AMQP协议:RabbitMQ使用AMQP(Advanced Message Queuing Protocol)作为消息传递的协议。AMQP是一个标准化的消息传递协议,支持多种编程语言和操作系统。
生产者和消费者:RabbitMQ中的消息发送方称为生产者,消息接收方称为消费者。生产者将消息发送到队列中,而消费者则从队列中接收并处理消息。
队列:队列是RabbitMQ中存储消息的地方。消息会被顺序写入队列,并按照先进先出的原则进行处理。
交换机:交换机是RabbitMQ中消息的路由器,它决定了消息应该发送到哪个队列。根据不同的路由策略,交换机可以将消息发送到一个或多个队列。
绑定:绑定是将交换机和队列关联起来的过程。绑定可以指定特定的路由规则,从而让交换机将消息发送到指定的队列。
路由策略:RabbitMQ支持多种路由策略,包括直接路由、主题路由和扇形路由等。不同的路由策略适用于不同的场景,可以实现灵活的消息路由。
可靠性:RabbitMQ提供了多种机制来确保消息的可靠传递,包括持久化、确认机制和发布者确认等。这些机制可以防止消息丢失或重复消费。
2.3RabbitMQ工作原理
RabbitMQ的工作原理主要基于生产者-消费者模型和消息队列。以下是其基本的工作流程:
生产者:生产者是创建消息的应用程序。它创建消息并发送到RabbitMQ。
队列:队列是RabbitMQ的内部结构,用于存储消息。多个生产者可以发送消息到一个队列,多个消费者可以从一个队列中获取消息。
交换器:生产者发送消息到交换器(Exchange),然后交换器根据一定的规则(路由键)将消息路由到一个或多个队列。RabbitMQ提供了几种类型的交换器,如直接交换器、主题交换器、头交换器和扇出交换器。
消费者:消费者是接收消息的应用程序。消费者连接到RabbitMQ并订阅一个队列,当新的消息到达队列时,RabbitMQ会将消息推送给消费者,或者消费者可以主动从队列中拉取消息。
消息确认:当消费者处理完一个消息后,它需要向RabbitMQ发送一个确认,告诉RabbitMQ这个消息已经被处理,可以从队列中删除。如果消费者处理消息时发生错误,它可以发送一个拒绝,告诉RabbitMQ这个消息没有被正确处理。
持久化:为了防止消息丢失,RabbitMQ提供了消息持久化的功能。生产者在发送消息时可以设置消息为持久化,RabbitMQ会将这些消息存储到磁盘,即使RabbitMQ服务器重启,这些消息也不会丢失。
通过这种方式,RabbitMQ可以在分布式系统中实现消息的可靠传递。
RabbitMQ是一个实现了AMQP(Advanced Message Queuing Protocol)高级消息队列协议的消息队列服务,用Erlang语言.
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绑定起来.
2.4RabbitMQ在企业项目中使用场景:
有一个商城项目,可以使用RabbitMQ来实现以下场景:
异步订单处理:当用户下单后,可以将订单信息封装成消息发送到订单队列中。然后由消费者异步地进行订单处理,例如库存扣减、物流跟踪等。这样可以提高系统的响应速度和可靠性。
库存同步:在商城项目中,库存是一个重要的资源。可以使用RabbitMQ来实现库存同步,例如将库存变更的消息发送到库存队列中,然后由消费者将库存信息同步到数据库中。
商品推荐:在商城项目中,推荐系统是一个重要的组件。可以使用RabbitMQ来实现商品推荐的场景,例如将用户浏览历史封装成消息发送到推荐队列中,然后由推荐引擎进行商品推荐。
优惠券发放:在商城项目中,优惠券是一种常见的促销方式。可以使用RabbitMQ来实现优惠券的发放,例如将优惠券信息封装成消息发送到优惠券队列中,然后由消费者将优惠券发放给符合条件的用户。
日志收集:商城项目通常需要进行大量的日志记录和统计。可以使用RabbitMQ来实现日志收集,例如将日志信息封装成消息发送到日志队列中,然后由消费者对日志进行分类、统计和分析。
2.5Docker安装部署RabbitMQ
下载镜像:
docker pull rabbitmq:management
docker run -d --name my-rabbitmq -p 5672:5672 -p 15672:15672 -v /home/rabbitmq:/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
--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)
-p:这里有两个端口
-e:指定环境变量: RABBITMQ_DEFAULT_VHOST:默认虚拟机名 RABBITMQ_DEFAULT_USER:默认的用户名
RABBITMQ_DEFAULT_PASS:默认用户名的密码
执行流程:用于在Docker中运行RabbitMQ的命令。它会创建一个名为"my-rabbitmq"的容器,并映射5672和15672端口到主机上,分别用于AMQP和管理界面访问。容器的数据存储在主机的"/home/rabbitmq"目录下,RabbitMQ的默认虚拟主机为"my_vhost",默认用户名和密码为"admin"。容器会在Docker启动时自动重启。
查看my-rabbitmq是否在运行:
docker logs my-rabbitmq
2.6创建springboot项目嵌套RabbitMQ
创建两级父子项目,父项目为maven项目mq1,子项目为springboot项目有两个provider,consumer
修改application的配置
consumer.application
server:port: 9999 spring:application:name: xxrabbitmq:host: 192.168.124.131username: springbootpassword: 123456port: 5672virtual-host: my_vhost
provider.application
server:port: 8888 spring:application:name: xxrabbitmq:host: 192.168.124.131username: springbootpassword: 123456port: 5672virtual-host: my_vhost
这是一个创建MQ的方法
@Configuration @SuppressWarnings("all") public class RabbitConfig { @Bean public Queue firstQueue() { return new Queue("firstQueue"); } }
Queue("firstQueue");是内置方法firstQueue是消息队列的名字。
导入指定的包:
AmqpTemplate pom文件中引入了
@Autowiredprivate AmqpTemplate rabbitTemplate;@RequestMapping("/sender")@ResponseBodypublic String sendFirst() {rabbitTemplate.convertAndSend("firstQueue", "Hello World");return "zhu";}
传递字符串类型
访问:localhost:8888/sender
报错:Connection refused: connect
解决添加连接的账号密码:
检查:
继续访问:localhost:8888/sender
成功:
构建消费者 Consumer
传递实体类型
使用了@Autowired注解来自动注入AmqpTemplate和ObjectMapper对象。AmqpTemplate是Spring提供的一个操作RabbitMQ的工具,可以用来发送和接收消息。ObjectMapper是Jackson库提供的一个工具,可以用来将对象转换为JSON字符串,或者将JSON字符串转换为对象。
sender02方法创建了一个User对象,然后使用ObjectMapper将这个对象转换为JSON字符串,然后发送这个JSON字符串到名为secondQueue的队列中。消费者会接收指定的队列消息使用了log.warn
来打印接收到的消息从而消费。
@RequestMapping("/sender2")@ResponseBodypublic String sender2() {com.example.provide.User user = new com.example.provide.User("1", "1");rabbitTemplate.convertAndSend("secondQueue", user);return "zhu2";}
package com.example.consumer;import lombok.extern.slf4j.Slf4j; import org.springframework.amqp.rabbit.annotation.RabbitHandler; import org.springframework.amqp.rabbit.annotation.RabbitListener; import org.springframework.stereotype.Component;@SuppressWarnings("all") @Component @Slf4j @RabbitListener(queues = "firstQueue") public class SecondReceiver {@RabbitHandlerpublic void send(User user) {log.warn("接收到:" + user);}}
这里显示不能够这样传递:
原因是
SimpleMessageConverter 这个类时,接收到了不支持的消息类型。SimpleMessageConverter 只支持 String、byte[] 和 Serializable 类型的消息内容。
根据异常信息,你传递给它的消息内容是 com.example.provide.User 类型,因此引发了这个异常。你需要将消息内容转换为 SimpleMessageConverter 支持的类型。
生产者:
@RequestMapping("/sender2")@ResponseBodypublic String sender2() throws JsonProcessingException {User user = new User("1", "1");// 序列化对象转换为JSON字符串String json = objectMapper.writeValueAsString(user);rabbitTemplate.convertAndSend("secondQueue", json);return "zhu2";}
实体:注意实现Serializable
package com.example.provide;import lombok.AllArgsConstructor; import lombok.Getter; import lombok.Setter; import lombok.NoArgsConstructor;import java.io.Serializable;@SuppressWarnings("all") @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private String username; private String userpwd; }
访问响应:
@RequestMapping("/sender2")@ResponseBodypublic String sender2() throws JsonProcessingException {User user = new User("1", "1");// 序列化对象转换为JSON字符串String json = objectMapper.writeValueAsString(user);rabbitTemplate.convertAndSend("secondQueue", json);return "zhu2";}
消费者:
@Component @Slf4j @RabbitListener(queues = "secondQueue") public class SecondReceiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void send(String json) throws JsonProcessingException {User user = objectMapper.readValue(json, User.class);// 处理user对象log.warn("接收到:" + user.toString());}
实体:注意实现Serializable
package com.example.consumer;import lombok.AllArgsConstructor; import lombok.Getter; import lombok.NoArgsConstructor; import lombok.Setter;import java.io.Serializable;@SuppressWarnings("all") @Getter @Setter @AllArgsConstructor @NoArgsConstructor public class User implements Serializable { private String username; private String userpwd; }
@Component @Slf4j @RabbitListener(queues = "secondQueue") public class SecondReceiver {@Autowiredprivate ObjectMapper objectMapper;@RabbitHandlerpublic void send(String json) throws JsonProcessingException {User user = objectMapper.readValue(json, User.class);// 处理user对象log.warn("接收到:" + user.toString());}
访问测试:
总结:
为什么使用消息队列?
答:1.业务解耦,2实现异步,3.流量削峰填谷(时间换空间)
消息队列:同步与异步差异
同步:
优点:时效性强,立即得到结果
缺点:1.耦合度高(加业务导致改代码困难)
、 2.性能:每次执行调用需要等待上一个进程走完之后才进行
3.cpu资源浪费,等待需要执行后再执行
4.练级失败,一个服务或者进程甭溃,会导致集体阵亡异步:
优点:1.降低耦合度,2.cpu资源运用合理,3.流量削峰填谷(时间换空间)
缺点:效率没有同步高
认真写博客的人,见一个少一个🤩🤩🤩🤩🤩🤩🤩🤩🤩
👍 点赞支持,⭐️ 收藏学习,❤️ 关注不迷路~
💬 如有错漏请不吝指正~平顶山大师-CSDN博客
https://blog.csdn.net/m0_73647713?spm=1011.2266.3001.5343
相关文章:

Message queue 消息队列--RabbitMQ 【基础入门】
🎉🎉欢迎来到我的CSDN主页!🎉🎉 🏅我是平顶山大师,一个在CSDN分享笔记的博主。📚📚 🌟推荐给大家我的博客专栏《Message queue 消息队列--RabbitMQ 【基础入门…...

【汇编】 13.3 对int iret和栈的深入理解
书中示例 assume cs:codecode segment start:mov ax,csmov ds,axmov si,offset lpmov ax,0mov es,axmov di,200hmov cx,offset end0-offset lpcldrep movsb ;lp到end0的指令传送到0:200处mov ax,0mov es,axmov word ptr es:[7ch*4],200hmov word ptr es:[7ch*42],0 ;设置7c表项…...
Git提交大文件报错“remote: Please remove the file from history and try again. ”
如在使用Git过程中不小心将较大的二进制文件加入仓库,那么仓库大小很快就会超过规定的配额,在Push的时候会报下面的错误: remote: Powered by GITEE.COM [GNK-6.4] remote: error: File: c91e5de4f55bedd0669db01036fc131ea8e516ce 130.66 MB…...

接口测试 03 -- 接口自动化思维 Requests库应用
1. 接口自动化思维梳理 1.1接口自动化的优点 接口测试自动化,简单来讲就是功能测试用例脚本化然后执行脚本,产生一份可视化测试报告。不管什么样的测试方式,都是为了验证功能与发现 BUG。那为什么要做接口测试自动化呢?一句话概括…...

SpringBoot:Bean生命周期自定义初始化和销毁
🏡浩泽学编程:个人主页 🔥 推荐专栏:《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 🛸学无止境,不骄不躁,知行合一 文章目录 前言一、Bean注解指…...

Git--基本操作介绍(2)
Git 常用的是以下 6 个命令:git clone、git push、git add 、git commit、git checkout、git pull. 说明: workspace:工作区staging area:暂存区/缓存区local repository:版本库或本地仓库remote repository…...

第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)
文章目录 第08章_面向对象编程(高级)本章专题与脉络1. 关键字:static1.1 类属性、类方法的设计思想1.2 static关键字1.3 静态变量1.3.1 语法格式1.3.2 静态变量的特点1.3.3 举例1.3.4 内存解析 1.4 静态方法1.4.1 语法格式1.4.2 静态方法的特点1.4.3 举例 1.5 练习 …...
Java中Map接口常用的方法
java.util.Map接口中常用的方法: 1.Map和Collection没有继承关系 2.Map集合以key和value的方式存储数据:键值对 key和value都是引用数据类型 key和value都是存储对象的内存地址 key起到主导的地位,value是key的一个附属品 3.Map接口中常用的方…...

Linux软件包管理器yum
文章目录 前言概述Linux下载软件的三种方式源代码安装rpm安装yum安装 关于yum的相关操作查看软件包软件安装卸载软件 yum源问题 前言 在Windows系统中,如果我们要去下载软件,我们可以在该软件的官网中进行下载,或者在微软的额软件商店进行下…...

Linux中NFS服务器的搭建和安装
1.介绍: 网络文件系统即将本地系统放在网络上某一个位置的系统,基于UDP/IP使用nfs能够在不同计算机之间通过网络进行文件共享,能使使用者访问网络上其他计算机中的文件就像在访问自己的计算机一样,也就是说放在一个开发板上&#…...
c递归算法模型
使用递归算法模型可以较为自然地解决许多问题,尤其是对于那些数据结构层次比较清晰的问题,递归算法模型往往能够提供一种简单清晰的解法。 递归算法模型的核心思想是将一个大问题通过递归的方式拆分为若干个较小的问题,并不断递归下去直到问…...

力扣740. 删除并获得点数
动态规划 思路: 选择元素 x,获得其点数,删除 x 1 和 x - 1,则其他的 x 的点数也会被获得;可以将数组转换成一个有序 map,key 为 x, value 为对应所有 x 的和;则问题转换成了不能同…...
spring和springboot的区别
在当今的软件开发领域,Spring和Spring Boot无疑是Java开发者最常用的框架之一。尽管它们都源于Spring项目,但它们在设计和使用上有很大的不同。本文将深入探讨Spring和Spring Boot之间的主要区别,以及为什么有时候选择其中一个而不是另一个是…...

imgaug库图像增强指南(35):【iaa.Fog】——轻松创建自然雾气场景
引言 在深度学习和计算机视觉的世界里,数据是模型训练的基石,其质量与数量直接影响着模型的性能。然而,获取大量高质量的标注数据往往需要耗费大量的时间和资源。正因如此,数据增强技术应运而生,成为了解决这一问题的…...

网络安全--防御保护02
第二天重要的一个点是区域这个概念 防火墙的主要职责在于控制和防护---安全策略---防火墙可以根据安全策略来抓取流量之后做出对应的动作 防火墙的分类: 单一主机防火墙:专门有设备作为防火墙 路由集成:核心设备,可流量转发 分…...

UE5 C++学习笔记 常用宏的再次理解
1.随意创建一个类,他都有UCLASS()。GENERATED_BODY()这样的默认的宏。 UCLASS() 告知虚幻引擎生成类的反射数据。类必须派生自UObject. (告诉引擎我是从远古大帝UObject中,继承而来,我们是一家人,只是我进化了其他功能…...

SpringBoot整合SSE
目录 1.SseController2. SseServiceSseServiceSseServiceImpl 3.SendMessageTask4.将定时任务加入启动类5.参考资料 1.SseController Slf4j RestController RequestMapping("sse") public class SseController {Autowiredprivate SseService sseService;RequestMappi…...

mysql-进阶篇
文章目录 存储引擎MySQL体系结构相关操作 存储引擎特点InnoDBInnoDB 逻辑存储结构 MyISAMMemory三个存储引擎之间的区别存储引擎的选择 索引1. 索引结构B-TreeB-Tree (多路平衡查找树)B-Tree演变过程 BTree与 B-Tree 的区别BTree演变过程 Hash 2.索引分类3.索引语法演示 4.SQL性…...
Js中的构造函数
在JavaScript中,构造函数是一种特殊类型的方法,用于创建并初始化一个新的对象。它通常使用 new 关键字来调用,并且通常以大写字母开头,以与其他非构造函数区分开来。 一个简单的构造函数示例: function Person(name,…...

[小程序]页面事件
一、下拉刷新 1.开启和配置 小程序中开启下拉刷新的方式有两种: ①全局开启下来刷新 在app.json的window节点中,设置enablePullDownRefresh设为ture。 ②局部开启下来刷新 在页面对应的json文件的的window节点中,设置enablePullDownRefresh设…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...

label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
FFmpeg 低延迟同屏方案
引言 在实时互动需求激增的当下,无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作,还是游戏直播的画面实时传输,低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架,凭借其灵活的编解码、数据…...

安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...

零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果 自用
outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size:0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格ÿ…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

GitFlow 工作模式(详解)
今天再学项目的过程中遇到使用gitflow模式管理代码,因此进行学习并且发布关于gitflow的一些思考 Git与GitFlow模式 我们在写代码的时候通常会进行网上保存,无论是github还是gittee,都是一种基于git去保存代码的形式,这样保存代码…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...