文章目录
- 前言
- 一、RabbitMQ的封装
-
- [1.1 为什么封装RabbitMQ?](#1.1 为什么封装RabbitMQ?)
- [1.2 在 common 工程下创建 common-rabbitmq 子工程](#1.2 在 common 工程下创建 common-rabbitmq 子工程)
- [1.3 引入依赖](#1.3 引入依赖)
- [1.4 创建包目录及 config 包](#1.4 创建包目录及 config 包)
- [1.5 在 config 包下创建 RabbitMQConfig 类](#1.5 在 config 包下创建 RabbitMQConfig 类)
- [1.6 在 resources 下创建自动配置](#1.6 在 resources 下创建自动配置)
- [二、配置 nacos](#二、配置 nacos)
- 三、验证
-
- [3.1 建立生产者(Producer)和消费者(Consumer)](#3.1 建立生产者(Producer)和消费者(Consumer))
- [3.2 创建 TestRabbitController](#3.2 创建 TestRabbitController)
- [3.3 使用 apifox 验证](#3.3 使用 apifox 验证)
-
- [3.3.1 关闭消费者](#3.3.1 关闭消费者)
- [3.3.2 继续测试](#3.3.2 继续测试)
- [3.3.3 打开 RabbitMq 的管理化界面](#3.3.3 打开 RabbitMq 的管理化界面)
- [3.3.4 打开消费者](#3.3.4 打开消费者)
- [3.3.5 重启服务](#3.3.5 重启服务)
- END
鸡汤:
● 咬牙扛过的深夜,反复修改的方案,汗水浸透的衣衫......这些不是负担,是你正在变强大的证据。
● 微光吸引微光,努力照亮努力。你认真生活的模样,本就是照亮世界的光。
前言
封装完 redis 和 二级缓存中间件后,继续封装下一个中间件
一、RabbitMQ的封装
1.1 为什么封装RabbitMQ?
● 系统解耦:服务间通过消息通信,无需直接调用(如 HTTP/RPC)。例如:订单服务发消息后,库存、通知、积分服务各自消费,互不影响。新增/下线服务无需修改生产者代码。
● 异步处理 & 提升响应速度:耗时操作(发邮件、生成报表)转为异步:用户请求秒级返回,后台慢慢处理,用户体验和系统吞吐量双提升。
● 流量削峰:高并发场景(秒杀、促销)中,瞬时流量先存入队列,消费者按能力匀速处理,避免数据库/服务被压垮。
● 扩展性与负载均衡:横向增加消费者实例,RabbitMQ 自动分发消息,轻松应对业务增长。
1.2 在 common 工程下创建 common-rabbitmq 子工程

1.3 引入依赖
pom.xml:
java
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.my</groupId>
<artifactId>common</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.my</groupId>
<artifactId>common-rabbitmq</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
</dependencies>
</project>
1.4 创建包目录及 config 包

1.5 在 config 包下创建 RabbitMQConfig 类
需要配置RabbitMQ的消息转换器,不然 RabbitMQ 的默认消息转换器会将数据转为二进制存储,占用的体积很大,还依赖 Serializable 接口,对象也不能自动转换。

RabbitMQConfig :
java
package com.my.commonrabbitmq.config;
import org.springframework.amqp.core.Queue;
import org.springframework.amqp.core.QueueBuilder;
import org.springframework.amqp.support.converter.Jackson2JsonMessageConverter;
import org.springframework.amqp.support.converter.MessageConverter;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitMQConfig {
@Bean("testQueue")
public Queue queue() {
return QueueBuilder.durable("testQueue").build();
}
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
}
1.6 在 resources 下创建自动配置
最后写一遍
自动配置目录 : META.spring.org.springframework.boot.autoconfigure.AutoConfiguration.imports

二、配置 nacos
跟 redis 一样,想要使用 RabbitMQ 的服务需要配置 RabbitMQ 地址啥的,这里就放在 nacos 里管理了。


三、验证
模板服务引入我们的 common-rabbitmq 依赖
3.1 建立生产者(Producer)和消费者(Consumer)
Producer:
java
package com.my.mstemplateservice.rabbit;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class Producer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage(Object message) {
rabbitTemplate.convertAndSend("testQueue",message);
}
}
Consumer:
java
package com.my.mstemplateservice.rabbit;
import com.my.mstemplateservice.domain.MessageDTO;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@RabbitListener(queues = "testQueue")
public class Consumer {
@RabbitHandler
public void handleMessage(MessageDTO messageDTO) {
System.out.println("收到消息为: " + messageDTO);
System.out.println(MessageDTO.class);
}
}
3.2 创建 TestRabbitController
TestRabbitController:
java
package com.my.mstemplateservice.test;
import com.my.commondomain.domain.vo.R;
import com.my.mstemplateservice.domain.MessageDTO;
import com.my.mstemplateservice.rabbit.Producer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@Slf4j
@RequestMapping("/test/rabbitmq")
public class TestRabbitController {
@Autowired
private Producer producer;
@PostMapping("/send")
public R<Void> send () {
MessageDTO messageDTO = new MessageDTO();
messageDTO.setMessage("Hello World");
messageDTO.setType("study");
producer.sendMessage(messageDTO);
return R.success();
}
}
3.3 使用 apifox 验证


显示收到消息,验证正确,也可以关闭消费者,看 RabbitMq 的界面化管理工具
3.3.1 关闭消费者

3.3.2 继续测试

3.3.3 打开 RabbitMq 的管理化界面
浏览器打开 http://自己的云服务器外网ip/虚拟机内网ip:15672/
密码:admin 密码:bite@123

存在一条没有消费的消息,说明发送功能正常
3.3.4 打开消费者

3.3.5 重启服务


消息被消费,消费功能也正常
END
封装了 redis、两级缓存(redis + caffeine)、RabbitMQ 常用中间件
常用中间件的封装告一段落!