Spring Boot 整合 RabbitMQ:从入门到实践

devtools/2024/12/23 5:26:36/

在现代微服务架构中,消息队列(Message Queue)是实现服务之间异步通信的重要组件。RabbitMQ 作为一个功能强大的消息代理,提供了可靠的消息传递机制,广泛应用于分布式系统中。Spring Boot 作为 Java 生态中的主流框架,提供了与 RabbitMQ 的无缝集成,使得开发者能够快速构建基于消息队列的应用。

本文将详细介绍如何在 Spring Boot 项目中整合 RabbitMQ,并通过实际代码示例帮助你快速上手。

1. RabbitMQ 简介

1.1 什么是 RabbitMQ?

RabbitMQ 是一个开源的消息代理软件(Message Broker),它实现了高级消息队列协议(AMQP),并提供了多种消息传递模式,如点对点、发布/订阅等。RabbitMQ 支持多种编程语言,并且具有高可用性、可扩展性和可靠性。

1.2 RabbitMQ 的核心概念

  • Producer(生产者):发送消息的应用程序。
  • Consumer(消费者):接收消息的应用程序。
  • Queue(队列):存储消息的缓冲区,消息在队列中等待被消费。
  • Exchange(交换机):接收生产者发送的消息,并根据路由规则将消息分发到相应的队列。
  • Binding(绑定):定义了交换机和队列之间的关系,决定了消息如何路由到队列。
  • Routing Key(路由键):生产者发送消息时指定的键,用于交换机根据路由规则将消息分发到队列。

2. Spring Boot 整合 RabbitMQ

2.1 环境准备

在开始之前,请确保你已经安装了以下环境:

  • Java 8 或更高版本
  • Maven 或 Gradle
  • RabbitMQ 服务器(可以通过 Docker 快速启动)

你可以通过以下命令使用 Docker 启动 RabbitMQ 服务器:

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

启动后,可以通过 http://localhost:15672 访问 RabbitMQ 的管理界面,默认用户名和密码为 guest/guest

2.2 创建 Spring Boot 项目

你可以通过 Spring Initializr 快速创建一个 Spring Boot 项目。选择以下依赖:

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

生成项目后,导入到你的 IDE 中。

2.3 配置 RabbitMQ

application.properties 文件中添加 RabbitMQ 的配置:

spring.rabbitmq.host=192.168.200.142
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=/test
spring.rabbitmq.username=test
spring.rabbitmq.password=test

2.4 定义消息队列和交换机

在 Spring Boot 中,我们可以通过 @Bean 注解来定义 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 RabbitMQConfig {public static final String QUEUE_NAME = "spring-boot-queue";public static final String EXCHANGE_NAME = "spring-boot-exchange";public static final String ROUTING_KEY = "spring-boot-routing-key";@Beanpublic Queue queue() {return new Queue(QUEUE_NAME, false);}@Beanpublic TopicExchange exchange() {return new TopicExchange(EXCHANGE_NAME);}@Beanpublic Binding binding(Queue queue, TopicExchange exchange) {return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);}
}

2.5 发送消息

在 Spring Boot 中,我们可以通过 RabbitTemplate 来发送消息。

import com.allen.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;@RestController
public class MessageController {@Autowiredprivate RabbitTemplate rabbitTemplate;@GetMapping("/send")public String sendMessage(@RequestParam String message) {rabbitTemplate.convertAndSend(RabbitMQConfig.EXCHANGE_NAME, RabbitMQConfig.ROUTING_KEY, message);return "Message sent: " + message;}
}

2.6 接收消息

通过 @RabbitListener 注解,我们可以监听指定的队列并处理接收到的消息。

import com.allen.config.RabbitMQConfig;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;@Component
public class MessageListener {@RabbitListener(queues = RabbitMQConfig.QUEUE_NAME)public void receiveMessage(String message) {System.out.println("Received message: " + message);}
}

2.7 测试

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class TestSpringbootRabbitmqApplication {public static void main(String[] args) {SpringApplication.run(TestSpringbootRabbitmqApplication.class, args);System.out.println("系统已启动!");}
}

点击TestSpringbootRabbitmqApplication文件并启动 Spring Boot 应用,访问 http://localhost:8080/send?message=HelloRabbitMQ,你将在控制台看到如下输出:

Received message: HelloRabbitMQ

在这里插入图片描述

3. 总结

本文详细介绍了如何在 Spring Boot 项目中整合 RabbitMQ,并通过实际代码示例展示了如何发送和接收消息。通过 RabbitMQ,我们可以轻松实现服务之间的异步通信,提升系统的可扩展性和可靠性。


http://www.ppmy.cn/devtools/144595.html

相关文章

TiddlyWiki如何设创建目录页和按照章节组织条目

起因&#xff1a;之前虽然安装了Tiddlywiki&#xff0c;但是我仅仅是把它当作临时信息、日程的记录工具。时间长了&#xff0c;记录条目太多&#xff0c;想要分类&#xff0c;创建目录&#xff0c;所以就有了本文。目前通过搜索引擎查到的关于tiddlywiki的目录的编辑和创建&…

代码随想录day21 | leetcode 669.修剪二叉搜索树 108.将有序数组转换为二叉搜索树 538.把二叉搜索树转换为累加树 二叉树总结篇

669.修剪二叉搜索树 调用递归实现剪枝 class Solution {public TreeNode trimBST(TreeNode root, int low, int high) {if(root null) return null;if(root.val < low) return trimBST(root.right, low, high); //如果当前节点的值小于low&#xff0c;意味着当前节点及其…

相机内外参知识

已知相机的内外参数矩阵&#xff0c;可以求得相机在世界坐标系下的原点坐标。这里需要理解几个概念&#xff1a; 内参数矩阵&#xff08;Intrinsic Matrix&#xff09;: 描述相机本身的属性&#xff0c;比如焦距、主点位置等。外参数矩阵&#xff08;Extrinsic Matrix&#xf…

跟着问题学18——transformer模型详解及代码实战(3)Encode编码器

跟着问题学18——transformer模型详解及代码实战&#xff08;1&#xff09; 跟着问题学18——transformer详解(2)多头自注意力机制-CSDN博客 2.3 残差连接 通过自注意力层我们挖掘提取了原始数据的特征&#xff0c;但编码层中会有多个编码器&#xff0c;这会导致网络层数的加…

火山引擎FORCE:智算能力全面升级

火山引擎智算专场 &#xff1a; 有幸参加 2024年 12月18日 在 上海国际博览中心 15&#xff1a;00~17&#xff1a;00的 智算专场。 这里 火山引擎智算专场图片 &#xff1a; 火山引擎智算专场内容 &#xff1a; 火山引擎图片 智算专场&#xff1a;乘云之势&#xff0c;智启未…

Java中ArrayList和LinkedList的区别?

在 Java 中&#xff0c;ArrayList和LinkedList都是实现了List接口的集合类&#xff0c;用于存储和操作有序的元素集合。它们在内部实现和性能特性上存在一些显著的区别&#xff0c;以下是对这两者的详细比较&#xff1a; 底层数据结构 ArrayList&#xff1a;基于数组实现&…

android studio更改应用图片,和应用名字。

更改应用图标&#xff0c;和名字 先打开AndroidManifest.xml文件。 更改图片文件名字&#xff08; 右键-->构建-->重命名&#xff08;R&#xff09;&#xff09;

html 中 表格和表单的关系与区别

在 HTML 中&#xff0c;表格 (<table>) 和表单 (<form>) 是两种常用于展示数据和收集用户输入的元素。它们具有不同的功能和结构。以下是关于这两者的详细介绍&#xff1a; 1. HTML 表格&#xff08;<table>&#xff09; 表格用于展示结构化的数据&#xf…