Java教程:RabbitMq讲解与SpringBoot项目如何对接RabbitMq实现生产者与消费者

在往期文章中,我们讲了如何在Windows与Linux环境下安装RabbitMq服务,并访问Web管理端。

在这里插入图片描述
有很多同学其实并不知道RabbitMq是用来干嘛的,它起到一个什么作用,并且如何在常见的SpringBoot项目中集成mq并实现消息收发,本章就来给大家讲解一下什么是RabbitMq,并对接Java项目实现生产者与消费者。


–分割线–


为什么要使用RabbitMq?

在这里插入图片描述

通常我们服务与服务直接调用时通过Http接口或者Rpc远程调用的方式进行,但是这种方式对服务直接耦合性和依赖性比较高,在使用时,两个服务必须同时在线,否则将无法使用,所以为解决此问题,我们引入了RabbitMq消息中间件,发送者可以直接将数据载体发送至云端上,接收者随时都可以主动在云端读取想要的数据,相互之间不牵制,不影响,降低耦合性。

什么是RabbitMq,能干什么?

RabbitMQ是一个开源的消息代理软件,实现了高级消息队列协议(AMQP)。它是一个面向消息的中间件,用于在分布式系统中存储和转发消息。RabbitMQ的主要组件包括生产者、消费者和代理,其中代理负责将消息路由到相应的消费者。这种模型允许应用程序在不直接依赖彼此的情况下进行通信,从而实现异步和解耦。

RabbitMQ支持多种客户端,如Python、Java、PHP等,并且可以在不同平台上运行,包括嵌入式系统、多核心集群以及基于云端的服务器。它具有高可用性、灵活的路由扩展性和易用性等特点,适用于大型软件系统的模块之间高效通信,支持高并发和可扩展性。

什么是消息队列?

通常说的消息队列,简称MQ(Message Queue),指的就是消息中间件。简单理解为一个使用队列来通信的组件,本质上就是个转发器,包含发消息,存消息,消费消息的过程。
在这里插入图片描述

此时生产者将消息发送到队列中,由消费者依次进行消费,是一种先进先出的模式,并且所有消息为串行,每次只有一条消息被递出。

在RabbitMq中也是这样的队列,不同的是,RabbitMq中消息既可以直接推送到队列,也可以将消息推送到交换机,由交换机经过一些列策略再推送到队列中。

RabbitMq的组成结构?

1. 服务器(broker)

RabbitMQ 服务器是 RabbitMQ 的核心组件,负责管理所有的交换器和队列。一个 RabbitMQ 实例可以包含多个服务器,每个服务器负责一部分交换器和队列。服务器之间通过 HTTP 协议通信,可以使用多种方式进行部署,如单机、集群、云服务等。

2. 交换器(exchange)

交换器是 RabbitMQ 中的消息传递核心,负责接收、路由、传递消息。RabbitMQ 支持多种交换器类型,如 fanout、direct、topic 等,每种类型的交换器都有不同的消息传递方式和应用场景。

3. 队列(queue)

队列是 RabbitMQ 中的消息存储容器,用于存储消息。RabbitMQ 支持多种队列类型,如持久化、非持久化、排他访问等,每种类型的队列都有不同的存储方式和应用场景。

4. 用户(admin)

管理用户,与用户权限,所属的host,比如系统默认的guest用户只能在本地服务使用,如果想要其他同事也使用rabbitmq服务就需要新建一个用户,并设置host,与权限。

5. 虚拟主机(virtual Hosts)

将所有交换机与队列等进行虚拟隔离,不同的host之间相互独立,无法互通,类似于docker中的容器概念。

6. 生产者(producer)

实际产生消息的地方,将消息投递至队列或交换机的发送者。

7. 消费者(consumer)

接收队列中消息的地方,消费消息,读取消息并消耗掉。

到这里我们想把消息发送到Mq上还不够,还需要了解它的工作模式,才能更好的使用它。

RabbitMq的工作模式有哪些?

官方网站中给出了7种模式:

地址:https://www.rabbitmq.com/tutorials
在这里插入图片描述

1、简单模式

在这里插入图片描述

一个生产者一个队列一个消费者,生产者直接将消息发送至队列并由消费者消费。

2、工作模式

在这里插入图片描述

一个生产者一个队列多个消费者,此时队列里的消息会随机分配给其中一个消费者,即一个消息只能被一个消费者消费,分工合作。

3、发布/订阅模式(广播模式)

在这里插入图片描述

一个生产者一个交换机多个队列多个消费者,交换机类型为:fanout,此时生产者将消息发送至交换机,由交换机广播至所绑定的队列中,每一个队列都有相同的消息,再由消费者进行消费。

4、路由模式

在这里插入图片描述

一个生产者一个交换机多个队列多个消费者,交换机类型为:direct、此时生产者发送消息时,会携带一个关键字,专业名词叫(routing key),再由交换机与队列之间的绑定匹配策略进行分发,由消费者进行消费。

5、主题模式

在这里插入图片描述

此模式与4中模式一致,交换机类型为:topic、在携带关键字的基础上增加了通配符,如:*#等。

第6第7中主要是介绍消息传递机制,可简单理解为消息发布确认与消息消费确认。

SpringBoot如何对接RabbitMq?

好!接下来我们就来具体实现一下在SpringBoot项目中,如何对接RabbitMq并实现消息发送与接收。

第一步:导入Pom

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

第二步、在Yml文件中Spring下增加配置

spring:# rabbitmqrabbitmq:host: 127.0.0.1port: 5672username: guestpassword: guestvirtual-host: /
我们暂且先使用guest账号,host使用默认。

第三步、创建RabbitMq的配置类

本次我们采用最常用的路由模式,符合大多数业务。
/*** rabbitmq配置类* @author wfeil211@foxmail.com*/
@Configuration
public class RabbitConfig {// Direct交换机@BeanDirectExchange routingExchange() {return new DirectExchange("routingExchange", true, false);}// queue@Beanpublic Queue routingQueueOne() {return new Queue("routingQueueOne", true);}// 绑定@BeanBinding bindingAsDirectOne() {return BindingBuilder.bind(routingQueueOne()).to(routingExchange()).with("routingKey");}// queue@Beanpublic Queue routingQueueTwo() {return new Queue("routingQueueTwo", true);}// 绑定@BeanBinding bindingAsDirectTwo() {return BindingBuilder.bind(routingQueueTwo()).to(routingExchange()).with("routingKey");}
}
这里创建了一个交换机,两个队列,并使用"routingKey"将队列与交换机进行绑定上。

第四步、创建一个生产者类

/*** 生产者* @author wfeil211@foxmail.com*/
@Slf4j
@Service
public class RabbitMqProducer {@Autowiredprivate RabbitTemplate rabbitTemplate;/*** 发送消息*/public void sendMessage() {rabbitTemplate.convertAndSend("routingExchange", "routingKey", "这是生产者发来的消息!!!");}}

第五步、创建两个消费者

/*** 消费者-1* @author wfeil211@foxmail.com*/
@Slf4j
@Component
public class ConsumerOne {/*** 监听队列*/@RabbitListener(queues = "routingQueueOne")public void listenMessage(Message message) {log.info("消费者-1收到mq消费请求,message:{}", new String(message.getBody()));try {// 业务处理String content = new String(message.getBody());} catch (Exception e) {log.error("mq消费异常,原因:{}", e.toString());}}
}
/*** 消费者-2* @author wfeil211@foxmail.com*/
@Slf4j
@Component
public class ConsumerTwo {/*** 监听队列*/@RabbitListener(queues = "routingQueueTwo")public void listenMessage(Message message) {log.info("消费者-2收到mq消费请求,message:{}", new String(message.getBody()));try {// 业务处理String content = new String(message.getBody());} catch (Exception e) {log.error("mq消费异常,原因:{}", e.toString());}}
}

第六步、启动服务

当我们启动好服务后,在我们的RabbitMq-Web管理端就可以看到创建的交换机与队列。

在这里插入图片描述
在这里插入图片描述

此时的两个队列已经绑定到交换机中

第七步、发布消息与消费消息

1、编写调用代码
/*** 接口调用* @author wfeil211@foxmail.com*/
@RestController
@RequestMapping("/rabbitPath")
public class RabbitMqProducerController {@Autowiredprivate RabbitMqProducer rabbitMqProducer;@PostMapping("/send")public void send() {rabbitMqProducer.sendMessage();}
}
2、先将消费者代码注释掉,启动服务,使用PostMan接口功能进行发起调用,消息成功发送到RabbitMq服务上。

在这里插入图片描述
在这里插入图片描述

3、放开消费者代码,启动服务,消息成功被消费。

在这里插入图片描述

教程到这里就结束了,是不是非常简单,上面提到发布确认与消费确认,我们下期文章再详细讲解。

本次教程到这里就结束了,希望大家多多关注支持(首席摸鱼师 微信同号),持续跟踪最新文章吧~

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

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

相关文章

Nginx实现高并发

注&#xff1a;文章是4年前在自己网站上写的&#xff0c;迁移过来了。现在看我之前写的这篇文章&#xff0c;描述得不是特别详细&#xff0c;但描述了Nginx的整体架构思想。如果对Nginx玩得透得或者想了解深入的&#xff0c;可以在网上找找其他的文章。 ......................…

day17_订单(结算,提交订单,支付页,立即购买,我的订单)

文章目录 订单模块1 结算1.1 需求说明1.2 获取用户地址1.2.1 UserAddress1.2.2 UserAddressController1.2.3 UserAddressService1.2.4 UserAddressMapper1.2.5 UserAddressMapper.xml 1.3 获取购物项数据1.3.1 CartController1.3.2 CartService1.3.3 openFeign接口定义 1.4 环境…

NIFI从Oracle11G同步数据到Mysql_亲测可用_解决数据重复_数据跟源表不一致的问题---大数据之Nifi工作笔记0065

首先来看一下整体的流程: 可以看到了用到了上面的这些处理器,然后我们主要看看,这里之前 同步的时候,总是出现重复的数据,奇怪. 比如源表中只有166条数据,但是同步过去以后变成了11万条数据了. ${db.table.name:equals(table1):or(${db.table.name:equals(table2)})} 可以看…

【精选好刊】JCR2区SCI仅17天上线见刊,最后10篇版面!

录用案例 JCR2区地质环境类SCI&EI (进展顺) 【期刊简介】IF&#xff1a;3.0-4.0&#xff0c;JCR2区&#xff0c;中科院3/4区&#xff1b; 【检索情况】SCI&EI双检&#xff1b; 【征稿领域】地球观测、环境监测和管理相关或结合研究均可&#xff1b; 【案例分享】重…

前端面试练习24.3.8

防抖和节流 防抖&#xff08;Debouncing&#xff09;&#xff1a; 防抖是指在短时间内连续触发同一事件时&#xff0c;只执行最后一次触发的事件处理函数。 在实际应用中&#xff0c;常常用于处理用户输入的搜索框或者滚动事件。例如&#xff0c;当用户连续输入搜索关键词时&am…

业务代码中如何使用装饰器模式?

装饰器模式&#xff08;Decorator Pattern&#xff09;介绍 装饰器模式&#xff08;Decorator Pattern&#xff09;是一种结构型设计模式&#xff0c;我们可以动态地给一个对象添加额外的职责。而不是通过继承增加子类的方式来扩展对象的功能&#xff0c;装饰器模式使用组合的…

[N1CTF 2018]eating_cms 不会编程的崽

题倒是不难&#xff0c;但是实在是恶心到了。 上来就是登录框&#xff0c;页面源代码也没什么特别的。寻思抓包看一下&#xff0c;数据包直接返回了sql查询语句。到以为是sql注入的题目&#xff0c;直到我看到了单引号被转义。。。挺抽象&#xff0c;似乎sql语句过滤很严格。又…

Java基础知识点之思维导图

一、走进Java编程世界 二、变量常量和运算符 三、if选择结构 四、switch选择结构 五、while循环结构 六、for循环结构 七、数组 八、类与对象 九、深入循环结构 十、类的无参方法 十一、类的带参方法 十二、字符串

读已提交隔离级别下竟然有间隙锁

业务背景 广告主痛点的为进行一次全媒体联合投放&#xff0c;若投放10个媒体&#xff0c;需要制作和上传10个创意、50张不同尺寸和出血区要求的图片和视频素材、近100个元素&#xff0c;投放成本极高。这也是制约部分用户使用新产品投放的原因。 因此进行升级。以三个创意为例…

Prometheus添加nginx节点显示不支持stub_status 解决办法

1、我们在使用Prometheus监控添加nginx节点监控的时候&#xff0c;在被监控节点的nginx配置文件中添加下面的模块 server { listen 80; server_name localhost; location /stub_status { stub_status on; access_log off; …

微服务技术栈SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式(四):消息队列MQ

文章目录 一、消息队列MQ二、RabbitMQ2.1 单机部署2.2 消息模型 三、SpringAMAP3.1 简单消息队列3.2 工作消息队列3.3 发布-订阅模型&#xff1a;FanoutExchange 广播交换机3.4 发布-订阅模型&#xff1a;DirectExchange 路由交换机3.5 发布-订阅模型&#xff1a;TopicExchange…

Day29:安全开发-JS应用DOM树加密编码库断点调试逆向分析元素属性操作

目录 JS原生开发-DOM树-用户交互 JS导入库开发-编码加密-逆向调试 思维导图 JS知识点&#xff1a; 功能&#xff1a;登录验证&#xff0c;文件操作&#xff0c;SQL操作&#xff0c;云应用接入&#xff0c;框架开发&#xff0c;打包器使用等 技术&#xff1a;原生开发&#x…

推房子游戏c++

这段代码是一个推箱子游戏的实现。游戏中有一个地图&#xff0c;地图上有墙壁、人、箱子和目标位置。玩家通过键盘输入WASD或方向键来控制人物的移动&#xff0c;目标是将所有的箱子推到相应的目标位置上。 代码中的dt数组表示地图&#xff0c;每个位置上的字符表示对应的元素…

c语言在线聊天室

c语言基于tcp和多线程的在线聊天室(c语言通讯系统)功能需求 1.实现多线程 2.构建socke套接字实现一对一通信 3.实现多个电脑的通信 4.数据传输加密和解密 5.多人实时聊天 6.具备群聊和私聊的功能 实现原理: 服务端公网Ip暴露,客户端端口随机分配,通过服务端公网IP连接,服务端…

【开源】SpringBoot框架开发免税店商城管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、系统设计2.1 功能模块设计2.2 研究方法 三、系统展示四、核心代码4.1 查询免税种类4.2 查询物品档案4.3 新增顾客4.4 新增消费记录4.5 审核免税 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的免税店商城管理系…

【文本编辑】Typora v1.8.6 绿色版

下载地址 Typora v1.8.6 绿色版 简介 Typora 是一款简洁、直观的跨平台 Markdown 编辑器&#xff0c;旨在提供优雅的写作体验。与传统的 Markdown 编辑器不同&#xff0c;Typora 提供所见即所得的编辑界面&#xff0c;使用户可以即时预览 Markdown 文档的渲染效果&#xff0…

prometheus 原理(架构,promql表达式,描点原理)

大家好&#xff0c;我是蓝胖子&#xff0c;提到监控指标&#xff0c;不得不说prometheus&#xff0c;今天这篇文章我会对prometheus 的架构设计&#xff0c;promql表达式原理和监控图表的绘图原理进行详细的解释。来让大家对prometheus的理解更加深刻。 架构设计 先来看看&am…

性能测试干2年,还不会这个技术点?

nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具&#xff0c;记录的信息比较全面&#xff0c;结合nmon_analyzer工具产生数据文件与图形化结果。 nmon可监控的数据类型 内存使用情况、磁盘适配器、文件系统中的可用空间、CPU使用率等等数据信息 特点 ①占用…

Java零基础-数组的访问和遍历

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

使用CSS制作动态的环形图/饼图

使用纯 CSS Animation conic-gradient 实现一个环形图。 饼图的实现思路和环形图一样&#xff0c;去掉中间的圆形遮盖 after 伪类元素即可。 一、构建基础样式 构建圆形节点和中间的遮盖元素。 <style>body {background-color: rgb(130, 226, 255);}.circle {top: 16…