Spring Boot 集成 RabbitMQ
在现代分布式系统中,消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RabbitMQ 作为一款广泛使用的开源消息中间件,具有强大的功能和灵活的配置。而 Spring Boot 则是一种流行的 Java 开发框架,能够快速构建应用程序。本文将详细介绍如何在 Spring Boot 项目中集成 RabbitMQ,包括安装和配置 RabbitMQ、在 Spring Boot 中使用 RabbitMQ 的步骤以及实际应用案例。
一、引言
随着软件系统的规模和复杂性不断增加,传统的同步通信方式已经无法满足需求。消息队列作为一种异步通信机制,可以有效地解耦系统之间的依赖关系,提高系统的可扩展性和可靠性。RabbitMQ 以其高可靠性、高吞吐量和灵活的路由机制,成为了许多企业级应用的首选消息中间件。Spring Boot 则提供了一种快速、便捷的方式来构建应用程序,使得开发者可以更加专注于业务逻辑的实现。将 Spring Boot 与 RabbitMQ 集成,可以充分发挥两者的优势,构建出高效、可靠的消息通信系统。
二、RabbitMQ 基础概念
(一)什么是 RabbitMQ
RabbitMQ 是一个开源的消息代理和队列服务器,实现了高级消息队列协议(AMQP)。它提供了可靠的消息传递、灵活的路由机制和高可用性,适用于各种分布式系统和微服务架构。
(二)RabbitMQ 的核心概念
- 消息(Message)
- 消息是 RabbitMQ 中传递的数据单元。它可以包含任何类型的数据,如文本、二进制数据、JSON 等。消息由生产者发送到 RabbitMQ 服务器,并由消费者从服务器中接收和处理。
- 生产者(Producer)
- 生产者是发送消息的应用程序。它将消息发送到 RabbitMQ 服务器中的特定队列或交换器。
- 消费者(Consumer)
- 消费者是接收和处理消息的应用程序。它从 RabbitMQ 服务器中的队列中获取消息,并对其进行处理。
- 队列(Queue)
- 队列是存储消息的容器。生产者将消息发送到队列中,消费者从队列中获取消息进行处理。队列可以有不同的名称和属性,如持久性、排他性等。
- 交换器(Exchange)
- 交换器是用于将消息路由到不同队列的组件。生产者将消息发送到交换器,交换器根据一定的规则将消息路由到一个或多个队列中。
- 绑定(Binding)
- 绑定是将队列与交换器关联起来的操作。通过绑定,交换器可以将消息路由到特定的队列中。
(三)RabbitMQ 的工作原理
- 生产者发送消息
- 生产者将消息发送到 RabbitMQ 服务器中的特定交换器。交换器根据消息的路由键和绑定规则,将消息路由到一个或多个队列中。
- 消费者接收消息
- 消费者从队列中获取消息进行处理。消费者可以通过订阅队列来接收消息,也可以通过主动拉取的方式从队列中获取消息。
- 消息确认
- 消费者在处理完消息后,需要向 RabbitMQ 服务器发送消息确认。如果消费者在处理消息过程中出现异常,或者在一定时间内没有发送消息确认,RabbitMQ 服务器会将消息重新发送给其他消费者进行处理。
三、安装和配置 RabbitMQ
(一)安装 RabbitMQ
- 在 Linux 系统上安装 RabbitMQ
- 可以通过以下步骤在 Linux 系统上安装 RabbitMQ:
- 添加 RabbitMQ 软件源:
- 可以通过以下步骤在 Linux 系统上安装 RabbitMQ:
sudo apt-get install -y software-properties-common
sudo add-apt-repository -y "deb http://www.rabbitmq.com/debian/ testing main"
- 导入 RabbitMQ 公钥:
wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
- 更新软件包列表:
sudo apt-get update
- 安装 RabbitMQ 服务器:
sudo apt-get install -y rabbitmq-server
- 在 Windows 系统上安装 RabbitMQ
- 可以从 RabbitMQ 官方网站下载 Windows 版本的安装程序,然后按照安装向导进行安装。
(二)配置 RabbitMQ
- 启动 RabbitMQ 服务器
- 在 Linux 系统上,可以使用以下命令启动 RabbitMQ 服务器:
sudo service rabbitmq-server start
- 在 Windows 系统上,可以在安装目录中找到 RabbitMQ 服务,然后启动该服务。
- 创建用户和虚拟主机
- 可以使用 RabbitMQ 的管理插件来创建用户和虚拟主机。在浏览器中输入
http://localhost:15672,进入 RabbitMQ 的管理界面。然后,使用默认的用户名和密码(guest/guest)登录。 - 在管理界面中,可以创建新的用户和虚拟主机,并为用户分配相应的权限。
- 可以使用 RabbitMQ 的管理插件来创建用户和虚拟主机。在浏览器中输入
- 配置交换器和队列
- 可以使用 RabbitMQ 的管理界面或者编程方式来配置交换器和队列。交换器和队列的配置取决于具体的应用需求,可以设置不同的名称、类型、属性等。
四、Spring Boot 集成 RabbitMQ 的步骤
(一)添加依赖
在 Spring Boot 项目的pom.xml文件中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
这个依赖将引入 Spring Boot 对 RabbitMQ 的支持。
(二)配置 RabbitMQ
在application.properties或application.yml文件中添加 RabbitMQ 的配置信息:
spring.rabbitmq.host=localhost
spring.rabbitmq.port=5672
spring.rabbitmq.username=your_username
spring.rabbitmq.password=your_password
spring.rabbitmq.virtual-host=your_virtual_host
这些配置信息指定了 RabbitMQ 服务器的地址、端口、用户名、密码和虚拟主机。可以根据实际情况进行修改。
(三)创建生产者
- 创建一个生产者配置类,用于配置生产者的属性:
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQProducerConfig {public static final String QUEUE_NAME = "my_queue";public static final String EXCHANGE_NAME = "my_exchange";public static final String ROUTING_KEY = "my_routing_key";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME, false, false, false);}@Beanpublic TopicExchange exchange() {return new TopicExchange(EXCHANGE_NAME);}@Beanpublic Binding binding() {return BindingBuilder.bind(queue()).to(exchange()).with(ROUTING_KEY);}
}
在这个配置类中,我们创建了一个队列、一个交换器和一个绑定。队列的名称为my_queue,交换器的名称为my_exchange,路由键为my_routing_key。
2. 创建一个生产者服务类,用于发送消息:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;@Service
public class RabbitMQProducerService {@Autowiredprivate RabbitTemplate rabbitTemplate;public void sendMessage(String message) {rabbitTemplate.convertAndSend(RabbitMQProducerConfig.EXCHANGE_NAME, RabbitMQProducerConfig.ROUTING_KEY, message);}
}
这个服务类使用RabbitTemplate来发送消息。可以在其他地方注入这个服务类,并调用sendMessage方法来发送消息。
(四)创建消费者
- 创建一个消费者配置类,用于配置消费者的属性:
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.TopicExchange;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class RabbitMQConsumerConfig {public static final String QUEUE_NAME = "my_queue";public static final String EXCHANGE_NAME = "my_exchange";public static final String ROUTING_KEY = "my_routing_key";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME, false, false, false);}@Beanpublic TopicExchange exchange() {return new TopicExchange(EXCHANGE_NAME);}@Beanpublic Binding binding() {return BindingBuilder.bind(queue()).to(exchange()).with(ROUTING_KEY);}
}
这个配置类与生产者配置类类似,创建了相同的队列、交换器和绑定。
2. 创建一个消费者服务类,用于处理接收到的消息:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Service;@Service
public class RabbitMQConsumerService {@RabbitListener(queues = RabbitMQConsumerConfig.QUEUE_NAME)public void consumeMessage(String message) {System.out.println("Received message: " + message);}
}
这个服务类使用@RabbitListener注解来定义一个消费者方法,该方法将在接收到消息时被调用。可以根据实际需求对消息进行处理。
五、Spring Boot 集成 RabbitMQ 的配置项
(一)生产者配置项
spring.rabbitmq.template.exchange:生产者发送消息时使用的交换器名称。spring.rabbitmq.template.routing-key:生产者发送消息时使用的路由键。spring.rabbitmq.template.mandatory:当消息无法路由到任何队列时,是否返回给生产者。默认值为false。
(二)消费者配置项
spring.rabbitmq.listener.simple.acknowledge-mode:消费者确认消息的方式。可选值有manual(手动确认)和auto(自动确认)。默认值为auto。spring.rabbitmq.listener.simple.prefetch:消费者每次从队列中获取的消息数量。默认值为1。spring.rabbitmq.listener.simple.concurrency:消费者的并发数量。默认值为1。
六、Spring Boot 集成 RabbitMQ 的实际应用案例
(一)异步任务处理
- 场景描述
- 在一个 Web 应用程序中,用户提交了一个耗时的任务,如文件上传、数据处理等。为了提高用户体验,可以将这个任务放入消息队列中,由后台的异步任务处理服务从消息队列中获取任务并进行处理。
- 实现步骤
- 当用户提交任务时,Web 应用程序将任务信息发送到 RabbitMQ 服务器中的特定队列中。
- 创建一个异步任务处理服务,使用 Spring Boot 集成 RabbitMQ 的消费者功能,从队列中获取任务信息并进行处理。处理完成后,可以将结果发送回 Web 应用程序或者存储到数据库中。
(二)系统间通信
- 场景描述
- 在一个分布式系统中,不同的系统之间需要进行通信。可以使用 RabbitMQ 作为消息中间件,实现系统间的异步通信和解耦。
- 实现步骤
- 各个系统将需要发送的消息发送到 RabbitMQ 服务器中的特定队列中。
- 接收消息的系统使用 Spring Boot 集成 RabbitMQ 的消费者功能,从队列中获取消息并进行处理。可以根据消息的类型和内容进行相应的业务处理。
(三)事件驱动架构
- 场景描述
- 在一个事件驱动架构中,系统中的各个组件通过发布和订阅事件来进行通信。可以使用 RabbitMQ 作为事件总线,实现事件的发布和订阅。
- 实现步骤
- 当一个组件发生了一个事件时,它将事件信息发送到 RabbitMQ 服务器中的特定交换器中。交换器根据事件的类型和路由键,将事件路由到一个或多个队列中。
- 订阅了相应事件的组件使用 Spring Boot 集成 RabbitMQ 的消费者功能,从队列中获取事件信息并进行处理。可以根据事件的内容进行相应的业务处理。
七、性能优化和故障排除
(一)性能优化
- 调整 RabbitMQ 服务器配置
- 根据实际情况调整 RabbitMQ 服务器的配置参数,如内存分配、磁盘空间、网络参数等,以提高 RabbitMQ 的性能。
- 优化生产者和消费者代码
- 在生产者和消费者代码中,避免不必要的序列化和反序列化操作,减少网络传输开销。
- 合理设置生产者的重试次数和超时时间,以提高消息发送的成功率和性能。
- 对于消费者,可以根据实际情况调整拉取消息的频率和批量处理的大小,以提高消费效率。
- 使用多个队列和交换器
- 根据业务需求合理划分消息的类型和路由规则,使用多个队列和交换器来提高消息的处理效率和可扩展性。
(二)故障排除
- 消息丢失或重复
- 检查生产者和消费者的配置参数,确保消息的发送和消费过程正确。
- 检查 RabbitMQ 服务器的配置参数,确保消息的持久化和确认机制正常工作。
- 如果出现消息丢失或重复的情况,可以通过调整生产者和消费者的配置参数,或者使用 RabbitMQ 的事务功能来保证消息的一致性。
- 消费延迟
- 检查消费者的拉取频率和批量处理大小,是否设置合理。
- 检查 RabbitMQ 服务器的负载情况,是否存在性能瓶颈。
- 如果消费延迟较高,可以考虑增加消费者的数量,或者调整 RabbitMQ 服务器的配置参数,以提高消费效率。
- 连接问题
- 检查 RabbitMQ 服务器的地址和端口是否正确配置。
- 检查网络连接是否正常,是否存在防火墙等限制。
- 如果出现连接问题,可以通过检查网络配置、调整防火墙规则等方式来解决。
八、总结
本文详细介绍了如何在 Spring Boot 项目中集成 RabbitMQ,包括安装和配置 RabbitMQ、在 Spring Boot 中使用 RabbitMQ 的步骤以及实际应用案例。通过集成 RabbitMQ,我们可以构建出高效、可靠的消息通信系统,实现系统间的异步通信和解耦。在实际应用中,我们还可以根据需要进行性能优化和故障排除,以确保系统的稳定运行。希望本文对大家在 Spring Boot 集成 RabbitMQ 方面有所帮助。
相关文章:
Spring Boot 集成 RabbitMQ
在现代分布式系统中,消息队列扮演着至关重要的角色。它能够实现系统间的异步通信、解耦组件以及提高系统的可扩展性和可靠性。RabbitMQ 作为一款广泛使用的开源消息中间件,具有强大的功能和灵活的配置。而 Spring Boot 则是一种流行的 Java 开发框架&…...
存在sql注入的公网站点
此数据为博主在新手阶段练习sql注入时发现的站点,漏洞可能修复,备注可能错误 url: https://www.uni-1.com.hk/about_en.php?id2 注入点类型:数值 sql报错回显:无 sql语句执行:[order by] [union] 字段数:1…...
linux之网络子系统- 内核发送数据包流程以及相关实际问题
一、相关实际问题 查看内核发送数据消耗的CPU时应该看sy还是si在服务器上查看/proc/softirqs,为什么NET_RX要比NET_TX大得多发送网络数据的时候都涉及那些内存拷贝操作零拷贝到底是怎么回事为什么Kafka的网络性能很突出 二、网络包发送过程总览 调用系统调用send发…...
UDP 实现的 Echo Server 和 Echo Client 回显程序
欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在网络编程中,Echo Server 和 Echo Client 回显是一种经典的示例,用于演示基本的网络通信。Echo Server 接收来自客户端的数据,并将相同的数据发送回客户端。这种模式在测试…...
AUTOSAR CP MCAL微控制器抽象层介绍
AUTOSAR(Automotive Open System Architecture)即汽车开放系统架构,它将汽车电子控制单元(ECU)的软件底层做了一个标准的封装,使得开发者能够共用一套底层软件,并通过修改参数来匹配不同的硬件和…...
SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式
文章目录 SpringBoot应用部署到Docker中MySQL8时间戳相差8小时问题及处理方式1. 检查MySQL服务器的时间区设置2. 在Spring Boot应用程序中设置时间区3. Docker容器中通过Dockerfile设置时区4. 在运行Docker容器时通过命令行传递环境变量5. 启动SpringBoot应用时设置JVM参数来指…...
飞桨首创 FlashMask :加速大模型灵活注意力掩码计算,长序列训练的利器
在 Transformer 类大模型训练任务中,注意力掩码(Attention Mask)一方面带来了大量的冗余计算,另一方面因其 O ( N 2 ) O(N^2) O(N2)巨大的存储占用导致难以实现长序列场景的高效训练(其中 N N N为序列长度)…...
【含文档+源码】基于SpringBoot+Vue的新型吃住玩一体化旅游管理系统的设计与实现
开题报告 本文旨在探讨新型吃住玩一体化旅游管理系统的设计与实现。该系统融合了用户注册与登录、旅游景点管理、旅游攻略发帖、特色旅游路线推荐、附近美食推荐以及酒店客房推荐与预定等多项功能,旨在为游客提供全方位、一体化的旅游服务体验。在系统设计中&#…...
【网络安全】揭示 Web 缓存污染与欺骗漏洞
未经许可,不得转载。 文章目录 前言污染与欺骗Web 缓存污染 DoS1、HTTP 头部超大 (HHO)2、HTTP 元字符 (HMC)3、HTTP 方法覆盖攻击 (HMO)4、未键入端口5、重定向 DoS6、未键入头部7、Host 头部大小写规范化8、路径规范化9、无效头部 CP-DoS10、HTTP 请求拆分Web 缓存污染与有害…...
PHP如何防止防止源代码的暴露
在PHP开发中,防止源代码暴露是确保应用程序安全性的重要一环。源代码暴露可能会让攻击者发现敏感信息,如数据库凭据、业务逻辑漏洞等,从而进行恶意攻击。以下是一些防止PHP源代码暴露的方法: 禁用PHP短标签: 在php.in…...
C++智能指针的实现
本篇文章详细探讨下如何使用裸指针实现智能指针。 补充内容 由于本篇文章主要是探讨怎么实现三种智能指针,但是在编码过程中,博主可能会使用些有些同学不了解的特性,为了保证大家思绪不被打断,博主先把这些小特性介绍出来,大家选择性参考。 1、什么是RAII? RAII(Reso…...
硅谷(12)菜单管理
菜单管理模块 11.1 模块初始界面 11.1.1 API&&type API: import request from /utils/request import type { PermisstionResponseData, MenuParams } from ./type //枚举地址 enum API {//获取全部菜单与按钮的标识数据ALLPERMISSTION_URL /admin/acl/permission…...
定子调压调速系统
定子调压调速系统是一种用于控制三相交流绕线电机的调速系统,它通过改变电动机定子电压和转子电阻来实现对电机转速的控制。以下是关于定子调压调速系统的详细介绍: 工作原理 定子电压调控:在1~3档时,系统通过控制定子…...
从APP小游戏到Web漏洞的发现
一、前因: 在对一次公司的一个麻将游戏APP进行渗透测试的时候发现,抓到HTTP请求的接口,但是反编译APK后发现没有在本身发现任何一个关于接口或者域名相关的关键字,对此感到了好奇。 于是直接解压后everything搜索了一下ÿ…...
设计模式07-结构型模式(装饰模式/外观模式/代理模式/Java)
4.4 装饰模式 4.4.1 装饰模式的定义 1.动机:在不改变一个对象本身功能的基础上给对象增加额外的新行为 2.定义:动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活 4.4.2 装饰模式的结构…...
C# 广播技术——发现局域网设备技术——
一广播技术应用 客户端发现与管理:软件可以通过广播消息来发现网络中的客户端,从而方便对客户端进行集中管理和监控。服务通知:向所有客户端广播重要的通知、更新或警告信息,确保客户端及时了解相关情况。资源共享与分配…...
【QA】windows和linux陷入系统调用后有什么区别?
最近被某面试官的这个问题拷打,当场脸烧起来… 首先讲讲系统调用: 系统调用是操作系统为调用者提供服务的接口,以便程序员聚焦于业务问题。分为文件操作,内存分配,进程管理等等。用户使用系统调用后会触发软中断&…...
Github 2024-11-01 开源项目月报 Top19
根据Github Trendings的统计,本月(2024-11-01统计)共有19个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目9TypeScript项目3JavaScript项目3Svelte项目1Jupyter Notebook项目1Ruby项目1HTML项目1Rust项目1Java项目1C++项目1Go项目1Python中的…...
Python实现深度学习模型预测控制(tensorflow)DL-MPC(Deep Learning Model Predictive Control
链接:深度学习模型预测控制 (如果认为有用,动动小手为我点亮github小星星哦),持续更新中…… 链接:WangXiaoMingo/TensorDL-MPC:DL-MPC(深度学习模型预测控制)是基于 P…...
Anki插件Export deck to html的改造
在Anki中进行复习时,每次只能打开一条笔记。如果积累了很多笔记,有时候会有将它们集中输出成一个pdf进行阅读的想法。Anki插件Export deck to html(安装ID:1897277426)就有这个功能。但是,这个插件目前存在…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
SCAU期末笔记 - 数据分析与数据挖掘题库解析
这门怎么题库答案不全啊日 来简单学一下子来 一、选择题(可多选) 将原始数据进行集成、变换、维度规约、数值规约是在以下哪个步骤的任务?(C) A. 频繁模式挖掘 B.分类和预测 C.数据预处理 D.数据流挖掘 A. 频繁模式挖掘:专注于发现数据中…...
转转集团旗下首家二手多品类循环仓店“超级转转”开业
6月9日,国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解,“超级…...
