微服务 02-rabbitmq在springboot中如何使用(上篇)

目录

前言: 上文传送

-> 安装rabbitmq传送门:

-> rabbitmq使用出现问题解决传送门:

1. rabbitmq的六大模式: 

1.1 简单模式: (一对一)

-> 业务场景: 

1.2 工作模式: (一对多)

-> 业务场景: 

1.3 发布与订阅模式: (广播)

1.4 路由模式: 

 -> 业务场景

1.5 主题模式: (路由升级版)

-> 业务场景

1.6 RPC异步调用模式

-> 业务场景

2. RabbitMQ 的工作机制主要包括:

3. springboot整合rabbitMq准备工作

ps: 有两种写法 rabbitTemplate和AmqpTemplate

3.1 创建俩springboot工程(正常创建 不用加依赖)

3.2 添加依赖

3.3 修改application.yml

 3.4 启动测试 

 启动失败解决方案

4. 六大模式实际操作

4.0 调用模拟(定时调度任务)

-> 4.0.1 生产者启动类

->4.0.2 消费者启动类

4.1 简单模式

-> 4.1.1 生产者代码

-> 4.1.2 消费者代码

4.2 工作模式

-> 4.2.1 生产者代码

-> 4.2.2 消费者代码

4.3 消息和订阅模式(广播)

-> 4.3.0 消费者中声明fanout交换机

-> 4.3.1 消费者代码

-> 4.3.2 生产者代码

本篇总结及下篇传送门

->  下一篇: 03-rabbitmq在springboot中如何使用(下篇)


前言: 上文传送

-> 安装rabbitmq传送门:

 01-rabbitmq的应用场景及安装(docker)

-> rabbitmq使用出现问题解决传送门:

  00-rabbitmq出现的异常以及解决方案

1. rabbitmq的六大模式: 

1.1 简单模式: (一对一)

发送者向队列发送消息,接收者从队列接收消息。

-> 业务场景: 

订单创建, 邮件发送 等一切消费者不关心过程的操作

1.2 工作模式: (一对多)

多个工作者同时从同一个队列中接收消息,并处理这些消息,每个消息只被一个工作者处理。

-> 业务场景: 

 多个消费者一起抗压, 共同接收, 与一类似

1.3 发布与订阅模式: (广播)

一个发送者将消息发送到交换机,交换机将消息分发到多个队列中,每个队列都有一个接收者。

1.4 路由模式: 

与发布/订阅模式类似,不同之处在于消息通过“路由键”(Routing Key)匹配到队列中的接收者。

 -> 业务场景

用于日志收集, 不同订单处理等 能用路由模式就不要用主题模式

1.5 主题模式: (路由升级版)

使用了更加灵活的通配符匹配规则。

-> 业务场景

电商平台可以使用主题模式将商品销售信息发送到不同的队列

1.6 RPC异步调用模式

需要一个唯一的标识符,在客户端发送请求时带上该标识符,服务端在处理完请求后将标识符带上响应一起发送回客户端,这样客户端就能正确地匹配请求和响应。

-> 业务场景

例如,电商平台可以使用异步调用模式实现库存管理系统与订单系统的交互,当有订单创建时,订单系统会调用库存管理系统减少商品库存,库存管理系统处理完毕后将结果发送到回调队列,订单系统从回调队列中获取处理结果并进行相应的流程处理。

2. RabbitMQ 的工作机制主要包括:

  1. 消息生产者(Publisher):向 RabbitMQ 中发送消息的应用程序;

  2. 消息队列(Queue):用于存放消息的缓冲区,可以根据需要设置队列的属性,如队列最大长度、队列消息的过期时间等;

  3. 交换机(Exchange):用于接收生产者发送的消息,并将消息路由到相应的队列中,交换机的类型包括直接模式、主题模式、扇形模式和头部模式;

  4. 绑定(Binding):将交换机和队列通过指定的路由键(Routing Key)进行绑定,绑定关系可以是多对多的;

  5. 消息消费者(Consumer):从队列中取出消息,并进行处理的应用程序;

  6. 虚拟主机(Virtual Host):RabbitMQ 允许通过虚拟主机实现逻辑上的消息隔离,不同的虚拟主机之间互相独立,可以拥有自己独立的交换机、队列、权限等。

在整个工作机制中,生产者将消息发送到指定的交换机中,交换机根据路由键将消息分发到相应的队列中,消费者从队列中取出消息进行处理。RabbitMQ 还可以进行消息的持久化、消息的优先级设置、消息的事务处理等操作,具备较高的可靠性和可用性。


3. springboot整合rabbitMq准备工作

ps: 有两种写法 rabbitTemplate和AmqpTemplate

这俩可以理解成俩公司封装的两套功能 实现了一种效果  都可以实现 选择其一即可 

准备工作

3.1 创建俩springboot工程(正常创建 不用加依赖)

rabbitmq-provider 生产者

rabbitmq-consumer 消费者

模拟微服务俩工程 不需要注册中心

3.2 添加依赖

        <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><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId></dependency>

3.3 修改application.yml

spring:rabbitmq:host: *username: pzypassword: *virtual-host: pingzhuyanlistener:simple:prefetch: 1 #设置每次预抓取的数量是1,处理完之前不收下一条 默认250
server:port: 9501
spring:rabbitmq:host: *username: pzypassword: *virtual-host: pingzhuyanlistener:simple:prefetch: 1 #设置每次预抓取的数量是1,处理完之前不收下一条 默认250
server:port: 9502

 3.4 启动测试 

 启动失败解决方案

1. 端口号冲突: 换端口

2. bean冲突: 清缓存重启

3. 删除后pom,xml变成灰色 鼠标右键 点击添加maven project即可

其他百度, rabbitmq连接不上的 看看服务起没起

4. 六大模式实际操作

4.0 调用模拟(定时调度任务)

异步线程池看其他文章 这里不做介绍

-> 4.0.1 生产者启动类

package cn.pingzhuyan.rabbitmq;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;@EnableAsync
@EnableScheduling
@SpringBootApplication
public class RabbitProviderApp {public static void main(String[] args) {SpringApplication.run(RabbitProviderApp.class, args);}}

->4.0.2 消费者启动类

package cn.pingzhuyan.rabbitmq;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class RabbitConsumerApp {public static void main(String[] args) {SpringApplication.run(RabbitConsumerApp.class, args);}}

4.1 简单模式

package cn.pingzhuyan.rabbitmq.config;import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** @author pzy* @version 0.1.0* @description: TODO*/
@Configuration
public class RabbitConfig {/*** 声明一个简单队列* @return*/@Beanpublic Queue helloQueue(){
//        return new Queue("PZY",true,false,false);return new Queue("PZY");}}

-> 4.1.1 生产者代码

package cn.pingzhuyan.rabbitmq.singleM1;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 简单模式生产者* @author pzy* @version 0.1.0* @description: TODO*/@Component
public class SingleM1Provider {@Autowiredprivate AmqpTemplate amqpTemplate;@Scheduled(cron = "*/1 * * * * ?" )public void singleSend01() {System.out.println("生产者: <简单队列>定时(1次/s)发送 -> 今天天气真好!");amqpTemplate.convertAndSend("PZY", "今天天气真好!");}}

-> 4.1.2 消费者代码

package cn.pingzhuyan.rabbitmq.singleM1;import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** @author pzy* @version 0.1.0* @description: TODO*/
//@Component
public class RabbitConsumerM1 {@RabbitListener(queues = "PZY")public void singleReceive1(String msg) {System.out.printf("消费者接收到: %s\n", msg);}}

4.2 工作模式

-> 4.2.1 生产者代码

package cn.pingzhuyan.rabbitmq.workM2;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 简单模式生产者* @author pzy* @version 0.1.0* @description: TODO*/@Component
public class WorkM2Provider {@Autowiredprivate AmqpTemplate amqpTemplate;@Async@Scheduled(cron = "*/1 * * * * ?" )public void workSend01() {System.out.println("生产者1: <工作模式>定时(1次/s)发送 -> 今天天气真好!");amqpTemplate.convertAndSend("PZY", "今天天气真好!");}@Async@Scheduled(cron = "*/1 * * * * ?" )public void workSend02() {System.out.println("生产者2: <工作模式>定时(1次/s)发送 -> 今天天气真好!");amqpTemplate.convertAndSend("PZY", "今天天气真好!");}}

-> 4.2.2 消费者代码

package cn.pingzhuyan.rabbitmq.workM2;import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** @author pzy* @version 0.1.0* @description: TODO*/
@Component
public class RabbitConsumerM2 {@RabbitListener(queues = "PZY")public void workReceiveM2One(String msg) {System.out.printf("消费者1 接收到: %s\n", msg);}@RabbitListener(queues = "PZY")public void workReceiveM2Two(String msg) {System.out.printf("消费者2 接收到: %s\n", msg);}}

4.3 消息和订阅模式(广播)

-> 4.3.0 消费者中声明fanout交换机

package cn.pingzhuyan.rabbitmq.config;import org.springframework.amqp.core.FanoutExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;/*** rabbitmq的默认手动确认模式* @author pzy* @version 0.1.0* @description: TODO*/
@Configuration
public class RabbitConfig {/*** 创建(声明)一个简单队列* @return*/@Beanpublic Queue helloQueue(){
//        return new Queue("PZY",true,false,false);return new Queue("PZY");}/*** 创建radioFanout交换机* 消费者需要绑定此交换机* @return*/@Beanpublic FanoutExchange radioFanout(){return new FanoutExchange("PZY_RADIO",false,false);}}

-> 4.3.1 消费者代码

package cn.pingzhuyan.rabbitmq.faoutM3;import org.springframework.amqp.rabbit.annotation.Exchange;
import org.springframework.amqp.rabbit.annotation.Queue;
import org.springframework.amqp.rabbit.annotation.QueueBinding;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;/*** 发布与订阅模式的消费者** @author pzy* @version 0.1.0* @description: TODO*/
@Component
public class FanoutF3Consumer {@RabbitListener(bindings = @QueueBinding(value = @Queue,  //不写就是随机队列, false true trueexchange = @Exchange(name = "PZY_RADIO", declare = "false")//交换机(PZY_RADIO, 不创建并使用已经存在的交换机)))public void radioFanoutMessage1(String msg) {System.out.printf("消费者1接收到: %s\n", msg);}@RabbitListener(bindings = @QueueBinding(value = @Queue,exchange = @Exchange(name = "PZY_RADIO", declare = "false")//队列绑定交换机))public void radioFanoutMessage2(String msg) {System.out.printf("消费者2接收到: %s\n", msg);}}

-> 4.3.2 生产者代码

package cn.pingzhuyan.rabbitmq.fanoutM3;import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 发布和订阅模式生产者** @author pzy* @version 0.1.0* @description: TODO*/@Component
public class FanoutF3Provider {@Autowiredprivate AmqpTemplate amqpTemplate;/*** 注意一下:* 下面发送的时候 一定要绑定交换机 不要绑定路由键(没有意义 全是默认)*  amqpTemplate.convertAndSend("PZY_RADIO", str);//错误写法*/@Async@Scheduled(cron = "*/1 * * * * ?")public void fanoutSend01() {String str = Math.random() * 1000 + "" + Math.random() * 1000;System.out.println("生产者1: <发布和订阅模式>定时(1次/s)发送 -> " + str);amqpTemplate.convertAndSend("PZY_RADIO","", str);}}

本篇总结及下篇传送门

前三种最常见的本篇已经写完了

rabbitTemplate写法与这个很相似, 实现效果完全相同

->  下一篇: 03-rabbitmq在springboot中如何使用(下篇)

 介绍后3种模式

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

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

相关文章

OpenCV 入门教程:图像读取和显示

OpenCV 入门教程&#xff1a;图像读取和显示 导语一、图像读取1.1、导入 OpenCV 库1.2、读取图像文件1.3、图像读取的返回值 二、图像显示2.1、创建窗口2.2、图像显示2.3、等待按键2.4、关闭窗口 三、示例应用总结 导语 在计算机视觉和图像处理领域&#xff0c;读取和显示图像…

《零基础学PIC单片机》目录

《零基础学PIC单片机》目录 1.《零基础学PIC单片机》&#xff0c;作者&#xff1a;赵化启 1.1芯片架构和指令 芯片架构和指令需要较多时间消化。 PIC单片机系统结构&#xff0c;讲解各模块的结构和功能&#xff1b;PIC汇编指令 1.2具有参考价值的内容 第3章&#xff1a;电…

Docker开启远程端口访问2375

开启方法&#xff1a; 1、修改/etc/default/docker下的配置 cat >> /etc/default/docker <<EOF DOCKER_OPTS"-H tcp://0.0.0.0:2375" EOF systemctl restart docker 2、修改/usr/lib/systemd/system/docker.service配置 cat >> /usr/lib/systemd/s…

尚硅谷React学习笔记(上)

目录 一、React入门 1.1、React简介 为什么要学&#xff1f; React的特点 1.2、React的基本使用 Hello React案例 创建虚拟DOM的两种方式 虚拟DOM与真实DOM 1.3、React JSX 语法规则 JSX小练习 1.4、模块与组件化的理解 模块 组件 模块化 组件化 二、React面向…

写作技巧:如何让你的文章充满生命力?

在写作中&#xff0c;让文章充满生命力是很重要的一点。如果一篇文章缺乏生命力&#xff0c;那么读者很难被吸引&#xff0c;也很难从中获得任何收获。那么&#xff0c;如何让你的文章充满生命力呢&#xff1f; 以下是几个建议&#xff1a; 1.真实感情&#xff1a;写作的时候要…

Minio在Windows的部署并使用Python来操作桶

什么是Minio? MinIO 是一个开源的对象存储服务器&#xff0c;具有高可用性、高性能和可伸缩性。它兼容 Amazon S3 API&#xff0c;因此可以无缝地替代 Amazon S3 作为对象存储的解决方案。 MinIO 可以让你在自己的基础设施中搭建一个对象存储服务&#xff0c;使你能够存储和…

闪烁灯光门铃电路设计

闪烁灯光门铃不仅具有门铃的声音还可以通过家里的门灯发出闪烁的灯光&#xff0c;适合用于室内嘈杂环境时使用&#xff0c;也适用于有聋哑人的家庭。 一、电路工作原理 电路原理如图 30 所示。 由基本的门铃电路和灯光、声音延迟控制电路两部分组成。按下门铃按钮 SB&#x…

ROS学习笔记(实践三)--常见相机问题整理

目录 1.普通的usb摄像头使用 1.普通的usb摄像头使用 安装ros功能包 sudo apt-get install ros-kinetic-usb-cam //注意ros版本 //启动roslaunch usb_cam usb_cam-test.launch启动后弹出如下窗口&#xff1a; 需要修相机驱动时&#xff0c;可以使用源码安装&#xff0c;源码…

【动手学习深度学习--逐行代码解析合集】11实战Kaggle比赛:预测房价

【动手学习深度学习】逐行代码解析合集 11实战Kaggle比赛&#xff1a;预测房价 视频链接&#xff1a;动手学习深度学习–实战Kaggle比赛&#xff1a;预测房价 课程主页&#xff1a;https://courses.d2l.ai/zh-v2/ 教材&#xff1a;https://zh-v2.d2l.ai/ 1、下载和缓存数据集 …

Lua快速入门笔记

文章目录 Lua快速入门笔记前言1、Lua概述2、Lua环境安装3、快速体验Lua编程4、数据类型5、变量6、循环7、流程控制8、函数9、运算符10、字符串11、数组12、迭代器13、表14、模块与包15、元表16、协同程序 Lua快速入门笔记 前言 本文是笔者参考菜鸟教程对Lua的一个快速入门学习&…

基于stm32单片机的智能门禁系统设计

一.硬件方案 基于stm32单片机的智能门禁系统设计的整体电路主要由采用STM32F103单片机&#xff0c;4*4矩阵按键电路&#xff0c;电子锁继电器驱动电路&#xff0c;开锁LED指示灯&#xff0c;LCD1602显示屏电路&#xff0c;蜂鸣器报警电路&#xff0c;RFID感应电路&#xff0c;…

附录7-用户列表案例,element-ui

目录 1 效果 1.1 查询所有用户 1.2 添加新用户 1.3 删除用户 1.4 用户详情 2 后端 2.1 查询所有 2.2 添加 2.3 删除 2.4 查询单个 3 前端 3.1 环境 3.2 main.js 3.3 userList.vue 3.4 userInfo.vue 1 效果 1.1 查询所有用户 1.2 添加新用户 …