SpringCloud系列教程:微服务的未来(二十三)SpringAMQP快速入门、Work Queues、Fanout交换机

前言

Spring AMQP是Spring框架中用于与消息中间件(如RabbitMQ)进行交互的一个项目,它简化了消息发送、接收以及消息处理的过程。通过Spring AMQP,开发者可以快速实现基于RabbitMQ的消息传递系统。本文将介绍Spring AMQP的快速入门,重点讲解Work Queues和Fanout交换机的使用方式,帮助开发者快速掌握消息队列的基本操作和工作原理。


SpringAMQP

快速入门

在这里插入图片描述

AMQP
Advanced Message Queuing Protocol,是用于在应用程序之间传递业务消息的开放标准。该协议与语言和平台无关,更符合微服务中独立性的要求。

在这里插入图片描述

Spring AMQP
Spring AMQP是基于AMQP协议定义的一套API规范,提供了板来发送和接收消息。包含两部分,其中spring-amqp是基础抽象,spring-rabbit是底层的默认实现。
SpringAMQP官方文档:https://spring.io/projects/spring-amqp/
需求如下:

  • 利用控制台创建队列simple.queue
  • 在publisher服务中,利用SpringAMQP直接向simple.queue发送消息
  • 在consumer服务中,利用SpringAMQP编写消费者,监听simple.queue队列

在这里插入图片描述
创建队列simple.queue
在这里插入图片描述
(1)引入spring-amqp依赖
在父工程中引入spring-amqp依赖,这样publisher和consumer服务都可以使用:

<!--AMQP依赖,包含RabbitMQ-->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-bot-starter-amgp</artifactId>
</dependency>

(2)配置RabbitMQ服务端信息
在每个微服务中引入MQ服务端信息,这样微服务才能连接到RabbitMQ

spring:rabbitmq:host: 192.168.244.135#主机名port: 5672#端口virtual-host: /hmall # 虚拟主机username: hmall#用户名password: 1234#密码

(3)发送消息
SpringAMQP提供了RabbitTemplate工具类,方便我们发送消息。发送消息代码如下:

@Autowired
private RabbitTemplate rabbitTemplate;@Test
public void testsimpleQueue(){// 队列名称String queueName ="simple.queue";// 消息String message = "hello, spring amqp!";// 发送消息rabbitTemplate.convertAndSend(queueName,message);

在这里插入图片描述
测试代码:

@SpringBootTest
public class SpringAmqpTest {@Autowiredprivate RabbitTemplate rabbitTemplate;@Testpublic void TestSimpleQueue(){//1.队列名String queueName = "simple.queue";//2.消息String message = "Hello Spring Amqp!";//3.发送消息rabbitTemplate.convertAndSend(queueName, message);}
}

控制台中查看信息:
在这里插入图片描述
(4)接收消息
SpringAMQP提供声明式的消息监听,我们只需要通过注解在方法上声明要监听的队列名称,将来SpringAMOP就会把消息传递给当前方法:

@slf4j
@Component
public class SpringRabbitListener {@RabbitListener(queues="simple.queue")public void listenSimpleQueueMessage(String msg)throws InterruptedException {log.info("spring 消费者接收到消息:["+msg+"]");
}

测试代码如下:

package com.itheima.consumer.mq;import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Slf4j
@Component
public class SpringRabbitListener {@RabbitListener(queues = "simple.queue")public void listenSimpleQueue(String message) {log.info("监听到simple.queue的消息,["+message+"]");}
}

运行项目启动类后,运行结果如下:
在这里插入图片描述
SpringAmpq收发消息步骤:

  • 引入spring-boot-starter-amqp依赖
  • 配置rabbitmq服务端信息
  • 利用RabbitTemplate发送消息
  • 利用@RabbitListener注解声明要监听的队列,监听消息

Work Queues

Work queues,任务模型。简单来说就是让多个消费者绑定到一个队列,共同消费队列中的消息。
在这里插入图片描述
模拟WorkQueue,实现一个队列绑定多个消费者
基本思路如下:
1.在RabbitMQ的控制台创建一个队列,名为wprk.queue
2.在publisher服务中定义测试方法,发送50条消息到work.queue
3.在consumer服务中定义两个消息监听者,都监听work.queue队列

创建新的队列work.queue
在这里插入图片描述
测试代码

 @Testpublic void TestWorkQueue(){//1.队列名String queueName = "work.queue";for (int i = 1; i <= 50; i++) {//2.消息String message = "Hello Spring Amqp_"+i;//3.发送消息rabbitTemplate.convertAndSend(queueName, message);}}

定义两个消息监听者,都监听work.queue队列

@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String message) {System.out.println("消费者1接收到消息:"+message+","+ LocalTime.now());}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String message) {System.out.println("消费者2.......:"+message+","+ LocalTime.now());}

运行结果如下:
在这里插入图片描述
通过观察发现,两个消费者最终接收到的消息各占一半。
增加一个需求:消费者1每秒处理40个消息,消费者2每秒处理5条消息
消费者代码修改如下:

	@RabbitListener(queues = "work.queue")public void listenWorkQueue1(String message) throws Exception {System.out.println("消费者1接收到消息:"+message+","+ LocalTime.now());Thread.sleep(25);}@RabbitListener(queues = "work.queue")public void listenWorkQueue2(String message)throws Exception {System.out.println("消费者2.......:"+message+","+ LocalTime.now());Thread.sleep(200);}

运行结果如下:
在这里插入图片描述

消费者消息推送限制

默认情况下,RabbitMQ的会将消息依次轮询投递给绑定在队列上的每一个消费者。但这并没有考虑到消费者是否已经处理完消息,可能出现消息堆积。
因此我们需要修改application.yml,设置preFetch值为1,确保同一时刻最多投递给消费者1条消息:

spring:rabbitmg:listener:simple:prefetch: 1#每次只能获取一条消息,处理完成才能获取下一个消息

在这里插入图片描述
在这里插入图片描述
由于消费者1处理速度较快,所以处理了更多的消息;消费者2处理速度较慢,只处理了6条消息。而最终的执行耗时也在1秒左右,速度大大提升。
Work模型的使用:

  • 多个消费者绑定到一个队列,可以加快消息处理速度际
  • 同一条消息只会被一个消费者处理
  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条再处理下一条,实现能者多劳

Fanout交换机

在这里插入图片描述
交换机的作用主要是接收发送者发送的消息,并将消息路由到与其绑定的队列。
常见交换机的类型有以下三种:

  • Fanout:广播
  • Direct:定向
  • Topic:话题

Fanout Exchange 会将接收到的消息路由到每一个跟其绑定的queue,所以也叫广播模式.
在这里插入图片描述
利用SpringAMQP演示FanoutExchange的使用
实现思路如下:
1.在RabbitMQ控制台中,声明队列fanout.queue1和fanout.queue2
2.在RabbitMQ控制台中,声明交换机hmall.fanout,将两个队列与其绑定
3.在consumer服务中,编写两个消费者方法,分别监听fanout.queue1和fanout.queue2在publisher中编写测试方法,向hmall.fanout发送消息A.

创建队列fanout.queue1和fanout.queue2
在这里插入图片描述
在这里插入图片描述
创建交换机hmall.fanout(需指定类型Type)
在这里插入图片描述
将交换机hmall.fanout绑定队列fanout.queue1和fanout.queue2
在这里插入图片描述
在这里插入图片描述
消费者代码分别监听fanout.queue1和fanout.queue2

 	@RabbitListener(queues = "fanout.queue1")public void listenFanoutQueue1(String message)  {log.info("消费者1监听到fanout.queue1的消息,["+message+"]");}@RabbitListener(queues = "fanout.queue2")public void listenFanoutQueue2(String message)throws Exception {log.info("消费者2监听到fanout.queue2的消息,["+message+"]");}

测试方法代码如下:

	@Testpublic void TestFanoutQueue(){//1.交换机名String exchangeName = "hmall.fanout";//2.消息String message = "Hello everyOne!";//3.发送消息rabbitTemplate.convertAndSend(exchangeName,null, message);}

运行结果如下:
在这里插入图片描述

交换机的作用:

  • 接收publisher发送的消息
  • 将消息按照规则路由到与之绑定的队列
  • FanoutExchange的会将消息路由到每个绑定的队列

发送消息到交换机的API:

在这里插入图片描述


总结

通过本文的学习,我们深入了解了Spring AMQP的快速入门,并探讨了如何使用Work Queues和Fanout交换机来实现高效的消息传递系统。Spring AMQP提供的简化功能让开发者能够专注于业务逻辑的实现,而不必关心底层的消息传递细节。掌握这些基本概念和技术,能大大提升我们在分布式系统中使用消息队列的能力。

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

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

相关文章

单片机简介

一、单片机简介 电脑和单片机性能对比 二、单片机发展历程 三、CISC VS RISC

Java中面向对象的三大特性 -- 有关多态

学习目标 理解多态掌握instanceof了解抽象类&#xff0c;抽象方法 1.多态(向上转型) ● 现在我们已经学会了继承&#xff08;类与类之间的&#xff09;关系&#xff0c;并且能够在子类继承父类的基础上进一步对子类的数据及操作进行扩展&#xff0c;增加新的成员变量和方法或…

在本地校验密码或弱口令 (windows)

# 0x00 背景 需求是验证服务器的弱口令&#xff0c;如果通过网络侧校验可能会造成账户锁定风险。在本地校验不会有锁定风险或频率限制。 # 0x01 实践 ## 1 使用 net use 命令 可以通过命令行使用 net use 命令来验证本地账户的密码。打开命令提示符&#xff08;CMD&#xff0…

蓝桥杯嵌入式备赛(四)—— 中断 + UART

目录 一、STM32 NVIC中断系统1、NVIC介绍2、Cortex-M4优先级设置 二、UART介绍1、原理图介绍2、原理图介绍及编程步骤&#xff08;1&#xff09;CubeMX设置&#xff08;2&#xff09;UART 发送&#xff08;3&#xff09;UART 接收 一、STM32 NVIC中断系统 1、NVIC介绍 STM32G4…

AI前端开发的学习成本与回报——效率革命的曙光

近年来&#xff0c;人工智能技术飞速发展&#xff0c;深刻地改变着各行各业。在软件开发领域&#xff0c;AI写代码工具的出现更是掀起了一场效率革命。AI前端开发&#xff0c;作为人工智能技术与前端开发技术的完美结合&#xff0c;正展现出巨大的发展潜力&#xff0c;为开发者…

AI前端开发的持续学习策略:拥抱变化,精进技艺

在飞速发展的科技浪潮中&#xff0c;AI前端开发领域正经历着日新月异的变化。作为一名AI前端开发者&#xff0c;你是否感到技术更新迭代之快&#xff0c;对自身持续学习能力提出了更高的要求&#xff1f; 想要在竞争激烈的行业中保持领先地位&#xff0c;持续学习不再是一种选择…

sql盲注脚本

在sqli-labs中的第8题无回显可以尝试盲注的手法获取数据 发现页面加载了3秒左右可以进行盲注 布尔盲注数据库名 import requestsdef inject_database(url):datanamefor i in range(1,15):low 32high 128mid (low high) // 2while low < high:path "id1 and asci…

DeepSeekR1 苹果macbook M1本地可视化运行!

过年了&#xff0c;就带了一台 macbook air 8g&#xff0c;DeepSeekR1的消息还是铺天盖地的来&#xff0c;我就想着在这台电脑上也装一个吧。 经过简单的配置&#xff0c;最终也运行起来了&#xff0c;速度还可以。 我这是首款M系列笔记本&#xff0c;也是现在最低配的 M 系列…

centos 10 离线安装dnf 和 设置dnf镜像源

离线安装dnf可用kimi搜索, centos 使用curl 下载dnf 的rpm包 mkdir ~/dnf_packages cd ~/dnf_packages# CentOS 7 示例 curl -O http://springdale.math.ias.edu/data/puias/unsupported/7/x86_64/dnf-0.6.4-2.sdl7.noarch.rpm curl -O http://springdale.math.ias.edu/data/pu…

Vivado生成edif网表及其使用

介绍如何在Vivado中将模块设为顶层&#xff0c;并生成相应的网表文件&#xff08;Verilog文件和edif文件&#xff09;&#xff0c;该过程适用于需要将一个模块作为顶层设计进行综合&#xff0c;并生成用于其他工程中的网表文件的情况。 例如要将fpga_top模块制作成网表给其它工…

【Python网络爬虫】爬取网站图片实战

【Python网络爬虫】爬取网站图片实战 Scrapying Images on Website in Action By Jackson@ML *声明:本文简要介绍如何利用Python爬取网站数据图片,仅供学习交流。如涉及敏感图片或者违禁事项,请注意规避;笔者不承担相关责任。 1. 创建Python项目 1) 获取和安装最新版…

Python从0到100(八十八):LSTM网络详细介绍及实战指南

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

window patch按块分割矩阵

文章目录 1. excel 示意2. pytorch代码3. window mhsa 1. excel 示意 将一个三维矩阵按照window的大小进行拆分成多块2x2窗口矩阵&#xff0c;具体如下图所示 2. pytorch代码 pytorch源码 import torch import torch.nn as nn import torch.nn.functional as Ftorch.set_p…

python013-基于Python的智能停车系统的设计与实现(源码+数据库+论文+部署讲解等)

&#x1f495;&#x1f495;作者&#xff1a; 爱笑学姐 &#x1f495;&#x1f495;个人简介&#xff1a;十年Java&#xff0c;Python美女程序员一枚&#xff0c;精通计算机专业前后端各类框架。 &#x1f495;&#x1f495;各类成品Java毕设 。javaweb&#xff0c;ssm&#xf…

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录&#xff0c;所以我们要找到原先的密码 解决方式&#xff1a; [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…

无线4G多联机分户计费集中控制系统

拓森无线4G多联机集中控制系统应用于宝龙广场多联机计费集中控制节能改造项目&#xff0c;包括多联机集中控制&#xff0c;分户计费&#xff0c;空调监控管理、告警管理、节能管控、统计报表、能效分析、空调远程开关机等功能。项目的成功实施&#xff0c;不仅提升了维护管理效…

oracle多次密码错误登录,用户锁住或失效

多次输入错误账号查询状态&#xff1a; select username,account_status from dba_users; TEST EXPIRED(GRACE) 密码错误延迟登录&#xff0c;延迟登录还能登录 或者 TEST LOCKED(TIMED) 密码错误锁 TEST EXPIRED(GR…

连通两台VMware虚拟机

连通两台VMware虚拟机 Fairing Winds and Following Seas VMware各模式的区别 在尝试连接之前&#xff0c;我们要搞清楚各模式的区别 简单来说就是&#xff0c;只有桥接模式和NAT模式是可以实现虚拟机联通的&#xff0c;而桥接模式和NAT模式分别对应了 V M w a r e VMware VM…

C++ 容器适配器

文章目录 1. 适配器2. stack和queue2.1 deque2.1.1 deque的底层结构2.1.2 deque如何实现头插和随机访问 2.2 用deque实现栈和队列2.3 deque的优缺点 3. priority_queue 1. 适配器 适配器是什么&#xff1f; 适配器是一种设计模式&#xff0c;实质上就是一种复用&#xff0c;即…

DeepSeek R1本地部署解决,DeepSeek服务繁忙

DeepSeek 本地部署是指将DeepSeek模型下载到本地电脑上&#xff0c;利用电脑的显卡进行数据处理和推理&#xff0c;可以减少网络延迟&#xff0c;提高数据处理和响应速度&#xff0c;从而避免将数据传输到云端&#xff0c;增强了数据的主权和控制&#xff0c;减少了因网络连接可…