文章目录
前言
本文将介绍JDK21的SpringBoot集成RabbitMQ的 最小可行的最精简步骤,并使用Direct路由模式演示生产者和消费者之间的消息传递。
一、RabbitMQ是什么?
RabbitMQ是一个开源的消息代理和队列服务器,用于通过轻量级和可靠的消息传递,在服务器之间进行通信。
RabbitMQ主要支持以下几种模式:
- 简单模式(Simple):这是最简单的模式,一个生产者发送消息到一个队列,一个消费者从队列中接收消息。这种模式是一对一的关系。
- 工作队列模式(Work Queue):一个生产者发送消息到队列,多个消费者从队列中接收消息。这种模式是一对多的关系,主要用于处理大量并发任务,提高系统处理能力。
- 发布/订阅模式(Publish/Subscribe):也称为扇形(fanout)交换模式。一个生产者发送消息到交换机,交换机将消息发送到所有与之绑定的队列,每个队列中的消息都会被其对应的消费者接收。这种模式实现了消息的广播。
- 路由模式(Direct-Routing):一个生产者发送带有路由键的消息到交换机,交换机根据路由键将消息发送到对应的队列,消费者从队列中接收消息。这种模式可以根据路由键实现消息的定向发送。
- 主题模式(Topics):一种更灵活的路由模式。生产者发送带有路由键的消息到交换机,交换机根据路由键的模式匹配规则将消息发送到对应的队列。这种模式可以实现更复杂的消息路由需求。
- RPC模式:即远程过程调用,客户端发送请求消息到队列,服务器监听队列并接收请求消息,处理完成后将结果消息发送到另一个队列,客户端从结果队列中接收结果消息。这种模式实现了跨服务器的方法调用。
- header模式:较少使用
二、使用步骤
1.实现要素
- 正在运行的RabbitMQ
可使用docker快速安装部署
- 消费者微服务
用于配置Exchange和Queue的绑定关系
PS:有了此配置后,当消费者微服务启动时,会 自动 在rabbitmq中创建对应的exchange交换机和queue队列,就不会因为没有提前创建好exchange和queue而使系统启动不了。(也可在生产端 或 其他公共服务 或 rabbitmq的管理后台 配置)
用于监听Queue是否有新的消息,以便实时消费
- 生产者微服务
用于发送消息到消息队列
2.创建SpringBoot项目
2-1 项目结构
MQ_RABBIT_TEST1 内部包含两个子模块,分别是:
RABBIT_CONSUMER(消费端)
RABBIT_PRODUCER(生产端)
2-2 RABBIT_CONSUMER(消费端)的实现:
2-2-1 pom.xml中引入关键包
spring-boot-starter-amqp用于springboot与rabbitmq集成(必须)
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
2-2-2 编写消息队列的配置,自动创建Exchange和Queue
使用@Configuration的纯java方式
import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QueueConfig {
private final String EXCHANGE_NAME = "direct_exchange";
private final String ROUTING_KEY = "direct_queue_key";
private final String QUEUE_NAME = "direct_queue";
@Bean
public Queue queue() {
/*
name (QUEUE_NAME):
这个字符串参数指定了队列的名称
durable (true):
如果设置为true,表示创建的是持久化的队列。
如果设置为false,非持久化队列在消息代理重启后将会消失,其中的消息也会丢失。
exclusive (false):
当设置为true时,队列将是排他的,即只允许一个消费者连接并消耗队列中的消息。
对于本例中设置为false的情况,这意味着多个消费者可以同时订阅并从队列中接收消息,遵循先入先出(FIFO)的原则。
autoDelete (false):
若设为true,当所有消费者断开与队列的连接,并且不再有新的消费者订阅该队列时,消息代理会自动删除这个队列。
而在本例中由于设置为false,即使没有消费者连接,队列也不会自动删除,除非显式地由应用程序或管理员手动删除。*/
return new Queue(QUEUE_NAME, true, false, false);
}
@Bean
public DirectExchange directExchange() {
return new DirectExchange(EXCHANGE_NAME, true, false);
}
@Bean
public Binding binding(Queue queue, DirectExchange exchange) {
/*将exchange和queue绑定,并且指定了routingKey为:direct_queue_key*/
return BindingBuilder.bind(queue).to(exchange).with(ROUTING_KEY);
}
}
2-2-3 编写队列监听器,实时监听是否有新消息
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class DirectQueueListener {
@RabbitListener(queues = "direct_queue")
public void receive(String message) {
System.err.println("direct_queue接收到消息:" + message);
}
}
2-2-4 配置RabbitMQ的连接信息
注意:RabbitMQ存在两个端口,分别是15672和5672。
15672是浏览器登录管理后台的端口,5672才是要配置到yml文件中的端口。
如果是使用Docker部署的RabbitMQ(比如:docker run -p 5673:5672 …),则此时应该配置5673这个宿主机的端口,docker才能通过5673映射到5672
server:
port: 8080
spring:
rabbitmq:
host: localhost
port: 5673
username: guest
password: guest
virtual-host: /
消费端的构建要素都已经实现完毕,可正常启动,并到RabbitMQ管理平台查看是否正常创建exchange和queue。
2-3 RABBIT_PRODUCER(生产端)的实现
2-3-1 pom.xml中引入关键包
spring-boot-starter-amqp用于springboot与rabbitmq集成(必须)
spring-boot-starter-web用于编写controller供外部调用(可不用)
<dependencies>
<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>
</dependencies>
2-3-2 配置RabbitMQ的连接信息
server:
port: 8081
spring:
rabbitmq:
host: localhost
port: 5673
username: guest
password: guest
virtual-host: /
2-3-3 使用RabbitTemplate发送消息
import jakarta.annotation.Resource;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MessageController {
@Resource
private RabbitTemplate rabbitTemplate;
@GetMapping("/send")
public void send(){
rabbitTemplate.convertAndSend("direct_exchange","direct_queue_key","hello rabbitmq");
}
}
生产端的构建要素也配置完毕。
3.启动生产和消费两个微服务,实现消息发送
效果如下:
进入8081生产端的controller运行界面,点击运行
8080消费端顺利拿到消息进行处理。
总结
以上就是今天要讲的内容,本文主要介绍了SpringBoot和RabbitMQ集成的最小步骤,演示了RabbitMQ的Direct路由模式。其他模式与其类似,就不一一演示,仅此记录并分享。