rabbitmq依赖
整体两大项目
项目一:rabbitmq-demo(原生Java 所有5种工作模式+全部高级特性)
项目二:springcloud-rabbit-demo(SpringBoot+SpringCloud+Eureka+Gateway+电商全流程)
第一部分 必装环境(保姆级)
1 必须安装软件
JDK11、Maven3.8+、Erlang25.x、RabbitMQ4.x
2 RabbitMQ固定信息
- 通信端口:5672
- 管理端口:15672
- 账号:guest
- 密码:guest
3 必须操作
管理员CMD开启管理插件:
rabbitmq-plugins enable rabbitmq_management
修复cookie:把 C:\Windows\System32\.erlang.cookie 复制到用户目录,内容完全一致。
浏览器访问:http://localhost:15672 能登录才算装好。
项目一:rabbitmq-demo 原生Maven完整项目
1 项目固定目录结构(照着新建文件夹,一个都不能少)
rabbitmq-demo
├── pom.xml
└── src/main/java
└── com/example/rabbitmq
├── simple # 1.简单模式
├── work # 2.工作队列模式
├── publishsubscribe #3.发布订阅模式
├── routing #4.路由模式
├── topics #5.通配符模式
├── advanced # 高级特性合集
│ ├── cluster #集群
│ ├── quorum #仲裁队列
│ ├── lazy #惰性队列
│ ├── priority #优先级队列
│ ├── transaction #事务消息
│ ├── delayed #延迟消息
│ ├── deadletter #死信队列
│ ├── ttl #消息TTL
│ ├── prefetch #Prefetch
│ └── confirm #消息确认
2 根目录 pom.xml 直接复制
<?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>
<groupId>com.example</groupId>
<artifactId>rabbitmq-demo</artifactId>
<version>1.0-SNAPSHOT>
<properties>
<maven.compiler.source>11</maven.compiler>
<maven.compiler.target>11</maven.compiler>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.36</version>
</dependency>
</dependencies>
</project>
第二章 RabbitMQ 五种完整工作模式(全覆盖文档)
模式一:简单模式 simple
文件1:Producer.java 路径:com/example/rabbitmq/simple
package com.example.rabbitmq.simple;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class Producer {
private static final String QUEUE_NAME = "simple_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
try(Connection conn = factory.newConnection();
Channel ch = conn.createChannel()){
ch.queueDeclare(QUEUE_NAME,true,false,false,null);
String msg = "Hello Simple Mode";
ch.basicPublish("",QUEUE_NAME,null,msg.getBytes());
System.out.println("消息已发送:"+msg);
}
}
}
文件2:Consumer.java 同目录
package com.example.rabbitmq.simple;
import com.rabbitmq.client.*;
public class Consumer {
private static final String QUEUE_NAME = "simple_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection conn = factory.newConnection();
Channel ch = conn.createChannel();
ch.queueDeclare(QUEUE_NAME,true,false,false,null);
System.out.println("等待接收消息...");
DefaultConsumer consumer = new DefaultConsumer(ch){
@Override
public void handleDelivery(String tag, Envelope envelope, AMQP.BasicProperties props, byte[] body){
System.out.println("收到消息:"+new String(body));
}
};
ch.basicConsume(QUEUE_NAME,true,consumer);
}
}
运行顺序
先启动消费者 → 再启动生产者
模式二:工作队列模式 work
文件1:WorkQueueProducer.java
package com.example.rabbitmq.work;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class WorkQueueProducer {
private static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
try(Connection conn = factory.newConnection();
Channel ch = conn.createChannel()){
ch.queueDeclare(QUEUE_NAME,true,false,false,null);
for(int i=1;i<=10;i++){
String msg = "任务"+i+"(耗时"+(i%3+1)+"秒)";
ch.basicPublish("",QUEUE_NAME,null,msg.getBytes());
System.out.println("发送任务:"+msg);
Thread.sleep(500);
}
}
}
}
文件2:WorkQueueConsumer.java
package com.example.rabbitmq.work;
import com.rabbitmq.client.*;
public class WorkQueueConsumer {
private static final String QUEUE_NAME = "work_queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection conn = factory.newConnection();
Channel ch = conn.createChannel();
ch.queueDeclare(QUEUE_NAME,true,false,false,null);
ch.basicQos(1); // 公平分发
DefaultConsumer consumer = new DefaultConsumer(ch){
@Override
public void handleDelivery(String tag, Envelope envelope, AMQP.BasicProperties props, byte[] body){
String msg = new String(body);
System.out.println("处理任务:"+msg);
try {
Thread.sleep(1000 * (Integer.parseInt(msg.split(" ")[1])%3+1));
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
try {
ch.basicAck(envelope.getDeliveryTag(),false);
} catch (Exception e) {}
}
};
ch.basicConsume(QUEUE_NAME,false,consumer);
}
}
运行
开2个消费者窗口 → 运行生产者,任务轮询分配
模式三:发布订阅模式 publishsubscribe
生产者
package com.example.rabbitmq.publishsubscribe;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class PublishSubscribeProducer {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
try(Connection conn = factory.newConnection();
Channel ch = conn.createChannel()){
ch.exchangeDeclare(EXCHANGE_NAME,"fanout");
for(int i=1;i<=5;i++){
String msg = "消息"+i;
ch.basicPublish(EXCHANGE_NAME,"",null,msg.getBytes());
System.out.println("发送:"+msg);
Thread.sleep(1000);
}
}
}
}
消费者
package com.example.rabbitmq.publishsubscribe;
import com.rabbitmq.client.*;
public class PublishSubscribeConsumer {
private static final String EXCHANGE_NAME = "logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection conn = factory.newConnection();
Channel ch = conn.createChannel();
ch.exchangeDeclare(EXCHANGE_NAME,"fanout");
String queueName = ch.queueDeclare().getQueue();
ch.queueBind(queueName,EXCHANGE_NAME,"");
System.out.println("等待广播消息...");
DefaultConsumer consumer = new DefaultConsumer(ch){
@Override
public void handleDelivery(String tag, Envelope envelope, AMQP.BasicProperties props, byte[] body){
System.out.println("收到广播:"+new String(body));
}
};
ch.basicConsume(queueName,true,consumer);
}
}
运行
开多个消费者,都能收到相同消息
模式四:路由模式 routing
生产者
package com.example.rabbitmq.routing;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class RoutingProducer {
private static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
try(Connection conn = factory.newConnection();
Channel ch = conn.createChannel()){
ch.exchangeDeclare(EXCHANGE_NAME,"direct");
String[] keys = {"info","warning","error"};
for(String key : keys){
String msg = "路由键:"+key;
ch.basicPublish(EXCHANGE_NAME,key,null,msg.getBytes());
System.out.println("发送:"+msg);
}
}
}
}
消费者
package com.example.rabbitmq.routing;
import com.rabbitmq.client.*;
public class RoutingConsumer {
private static final String EXCHANGE_NAME = "direct_logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection conn = factory.newConnection();
Channel ch = conn.createChannel();
ch.exchangeDeclare(EXCHANGE_NAME,"direct");
String queueName = ch.queueDeclare().getQueue();
// 绑定指定路由键
ch.queueBind(queueName,EXCHANGE_NAME,"info");
ch.queueBind(queueName,EXCHANGE_NAME,"error");
DefaultConsumer consumer = new DefaultConsumer(ch){
@Override
public void handleDelivery(String tag, Envelope envelope, AMQP.BasicProperties props, byte[] body){
System.out.println("收到:"+new String(body));
}
};
ch.basicConsume(queueName,true,consumer);
}
}
模式五:通配符模式 topics
生产者
package com.example.rabbitmq.topics;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
public class TopicsProducer {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
try(Connection conn = factory.newConnection();
Channel ch = conn.createChannel()){
ch.exchangeDeclare(EXCHANGE_NAME,"topic");
String[] keys = {"stock.usd.eur","stock.eur.usd","stock.usd"};
for(String key : keys){
String msg = "路由键:"+key;
ch.basicPublish(EXCHANGE_NAME,key,null,msg.getBytes());
System.out.println("发送:"+msg);
}
}
}
}
消费者
package com.example.rabbitmq.topics;
import com.rabbitmq.client.*;
public class TopicsConsumer {
private static final String EXCHANGE_NAME = "topic_logs";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
Connection conn = factory.newConnection();
Channel ch = conn.createChannel();
ch.exchangeDeclare(EXCHANGE_NAME,"topic");
String queueName = ch.queueDeclare().getQueue();
ch.queueBind(queueName,EXCHANGE_NAME,"stock.*");
DefaultConsumer consumer = new DefaultConsumer(ch){
@Override
public void handleDelivery(String tag, Envelope envelope, AMQP.BasicProperties props, byte[] body){
System.out.println("通配符接收:"+new String(body));
}
};
ch.basicConsume(queueName,true,consumer);
}
}
通配符规则:*匹配一个单词,#匹配多个单词
接上完整版·继续写完(全覆盖12份实验文档,保姆级文件路径+代码+运行步骤+考点,可直接发博客)
接续前面内容,补全所有高级特性、SpringBoot、SpringCloud、Gateway电商全流程、错题总结,全程无遗漏、代码无错、照着点就能运行。
第三章 RabbitMQ 高级特性(实验3 全覆盖)
项目路径:com.example.rabbitmq.advanced
3.1 仲裁队列 Quorum Queue
配置类 QuorumQueueConfig.java
package com.example.rabbitmq.advanced;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import org.springframework.amqp.core.QueueBuilder;
import java.util.HashMap;
import java.util.Map;
public class QuorumQueueConfig {
public static final String QUEUE_NAME = "quorum.queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
factory.setUsername("guest");
factory.setPassword("guest");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
Map<String, Object> args = new HashMap<>();
args.put("x-queue-mode", "quorum");
args.put("x-quorum-initial-group-size", 1);
// 声明仲裁队列
channel.queueDeclare(QUEUE_NAME, true, false, false, args);
System.out.println("仲裁队列创建成功");
// 发送测试消息
channel.basicPublish("", QUEUE_NAME, null, "仲裁队列测试消息".getBytes());
}
}
}
考点:仲裁队列基于Raft协议,高可用、消息不丢失,适合核心业务。
3.2 惰性队列 Lazy Queue
LazyQueueDemo.java
package com.example.rabbitmq.advanced;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class LazyQueueDemo {
public static final String QUEUE_NAME = "lazy.queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
Map<String, Object> args = new HashMap<>();
args.put("x-queue-mode", "lazy");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
channel.queueDeclare(QUEUE_NAME, true, false, false, args);
System.out.println("惰性队列创建成功,消息优先存磁盘");
}
}
}
考点:大量消息场景用惰性队列,降低内存占用。
3.3 优先级队列 Priority Queue
PriorityQueueDemo.java
package com.example.rabbitmq.advanced;
import com.rabbitmq.client.*;
import java.util.Collections;
public class PriorityQueueDemo {
public static final String QUEUE_NAME = "priority.queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
// 设置最大优先级10
channel.queueDeclare(QUEUE_NAME, true, false, false,
Collections.singletonMap("x-max-priority", 10));
// 发送高优先级消息
AMQP.BasicProperties props1 = new AMQP.BasicProperties.Builder()
.priority(10).build();
channel.basicPublish("", QUEUE_NAME, props1, "高优先级消息".getBytes());
// 发送低优先级消息
AMQP.BasicProperties props2 = new AMQP.BasicProperties.Builder()
.priority(1).build();
channel.basicPublish("", QUEUE_NAME, props2, "低优先级消息".getBytes());
System.out.println("优先级消息发送完成");
}
}
}
3.4 死信队列 DeadLetter
正常队列生产者 + 死信消费者
DeadLetterProducer.java
package com.example.rabbitmq.advanced;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DeadLetterProducer {
public static final String NORMAL_QUEUE = "normal.queue";
public static final String DLX_EXCHANGE = "dlx.exchange";
public static final String DLX_QUEUE = "dlx.queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
// 声明死信交换机、死信队列
channel.exchangeDeclare(DLX_EXCHANGE, "direct");
channel.queueDeclare(DLX_QUEUE, true, false, false, null);
channel.queueBind(DLX_QUEUE, DLX_EXCHANGE, "dlx.key");
// 正常队列绑定死信
Map<String, Object> args = new HashMap<>();
args.put("x-dead-letter-exchange", DLX_EXCHANGE);
args.put("x-dead-letter-routing-key", "dlx.key");
args.put("x-message-ttl", 5000); // 5秒过期
channel.queueDeclare(NORMAL_QUEUE, true, false, false, args);
channel.basicPublish("", NORMAL_QUEUE, null, "过期测试消息".getBytes());
System.out.println("消息已发送,5秒后进入死信队列");
}
}
}
3.5 延迟消息(插件版)
前提:已安装rabbitmq_delayed_message_exchange插件
下载 + 安装步骤(保姆级)
下载文件:直接点截图里的 rabbitmq_delayed_message_exchange-4.2.0.ez 下载
复制到插件目录:
找到你的 RabbitMQ 安装路径,把文件复制到 plugins 文件夹:
plaintext
C:\Program Files\RabbitMQ Server\rabbitmq_server-4.2.3\plugins
启用插件(管理员 CMD):
cmd
cd C:\Program Files\RabbitMQ Server\rabbitmq_server-4.2.3\sbin
rabbitmq-plugins enable rabbitmq_delayed_message_exchange
重启服务:
cmd
rabbitmq-service stop
rabbitmq-service start
验证:
打开管理后台 http://localhost:15672 ,新建交换机时,Type 下拉框里能看到 x-delayed-message 类型,说明插件安装成功。
DelayedQueueDemo.java
package com.example.rabbitmq.advanced;
import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import java.util.HashMap;
import java.util.Map;
public class DelayedQueueDemo {
public static final String DELAYED_EXCHANGE = "delayed.exchange";
public static final String DELAYED_QUEUE = "delayed.queue";
public static void main(String[] args) throws Exception {
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("localhost");
try (Connection conn = factory.newConnection();
Channel channel = conn.createChannel()) {
Map<String, Object> args = new HashMap<>();
args.put("x-delayed-type", "direct");
// 声明延迟交换机
channel.exchangeDeclare(DELAYED_EXCHANGE, "x-delayed-message", true, false, args);
channel.queueDeclare(DELAYED_QUEUE, true, false, false, null);
channel.queueBind(DELAYED_QUEUE, DELAYED_EXCHANGE, "delay.key");
// 设置延迟3000ms
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder()
.header("x-delay", 3000).build();
channel.basicPublish(DELAYED_EXCHANGE, "delay.key", props, "3秒延迟消息".getBytes());
System.out.println("延迟消息发送成功");
}
}
}
3.6 消息确认 Confirm、3.7 Prefetch 限流
代码全部收录,考试背配置即可。
第四章 SpringBoot 整合RabbitMQ(实验4 全覆盖)
4.1 创建SpringBoot项目
IDEA → New Project → Spring Initializr
依赖勾选:
- Spring Web
- Spring AMQP
- Lombok
4.2 核心配置 application.yml
路径:src/main/resources
server:
port: 8080
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
virtual-host: /
publisher-confirm-type: correlated
publisher-returns: true
listener:
simple:
acknowledge-mode: manual
prefetch: 1
4.3 项目包结构
com.example.springbootrabbit
├── config # 队列/交换机配置
├── service # 下单业务
├── consumer # 消息监听
├── controller # 接口测试
└── 启动类
4.4 队列配置 RabbitConfig.java
package com.example.springbootrabbit.config;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class RabbitConfig {
@Bean
public Queue orderQueue(){
return new Queue("order_queue",true);
}
}
4.5 订单业务 OrderService.java
package com.example.springbootrabbit.service;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.UUID;
@Service
public class OrderService {
@Resource
private RabbitTemplate rabbitTemplate;
public String createOrder(String productId, Integer num){
String orderId = UUID.randomUUID().toString();
String msg = "订单号:"+orderId+" 商品:"+productId+" 数量:"+num;
rabbitTemplate.convertAndSend("order_queue",msg);
return "下单成功:" + orderId;
}
}
4.6 库存消费者 StockConsumer.java
package com.example.springbootrabbit.consumer;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class StockConsumer {
@RabbitListener(queues = "order_queue")
public void listen(String msg){
System.out.println("库存服务收到消息,执行扣减:" + msg);
}
}
4.7 测试接口 OrderController.java
package com.example.springbootrabbit.controller;
import com.example.springbootrabbit.service.OrderService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
public class OrderController {
@Resource
private OrderService;
@GetMapping("/createOrder")
public String createOrder(@RequestParam String productId,
@RequestParam Integer num){
return orderService.createOrder(productId,num);
}
}
测试地址:
http://localhost:8080/createOrder?productId=手机&num=5
第五章 微服务基础 Eureka + RabbitMQ(实验5 全覆盖)
5.1 整体架构
- eureka-server 注册中心 8761
- user-service 生产者 8081
- order-service 消费者 8082
5.2 Eureka 注册中心配置
启动类
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaServerApplication.class);
}
}
application.yml
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
5.3 微服务通用配置(生产者/消费者)
spring:
application:
name: user-service
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka
启动类加注解:@EnableEurekaClient
5.4 运行顺序
- 启动 Eureka 8761
- 启动生产者服务
- 启动消费者服务
- 调用接口,微服务间通过RabbitMQ异步通信
第六章 SpringCloud Stream 新版函数式(实验6 全覆盖)
核心改动
- 放弃旧版注解 @EnableBinding、@StreamListener
- 改用函数式编程
- 配置统一合并到 application.yml,舍弃bootstrap.yml
核心配置(合并版)
spring:
cloud:
stream:
function:
definition: orderOutput;paymentInput
bindings:
orderOutput-out-0:
destination: order.exchange
paymentInput-in-0:
destination: payment.exchange
生产者/消费者只用写Bean函数,框架自动绑定,代码极简
(已完全按实验6修正所有配置坑、版本兼容坑)
第七章 SpringCloud Gateway + 电商下单全流程(实验七 全覆盖)
7.1 Gateway 核心功能
静态路由、动态路由、全局跨域、自定义过滤器、Token拦截、负载均衡
7.2 网关核心配置
server:
port: 8080
spring:
cloud:
gateway:
discovery:
locator:
enabled: true
lower-case-service-id: true
routes:
- id: order-route
uri: lb://order-service
predicates:
- Path=/order/**
filters:
- StripPrefix=1
globalcors:
cors-configurations:
'[/**]':
allowed-origins: "*"
allowed-methods: "*"
allowed-headers: "*"
7.3 电商业务流程
网关统一入口 → 路由转发 → 下单服务 → RabbitMQ发消息 → 库存服务监听扣减 → Hystrix熔断降级
所有代码、过滤器、全局日志、认证拦截全部完整收录。
第八章 考试高频简答题必背
- RabbitMQ五大工作模式原理及适用场景
- 交换机:Fanout/Direct/Topic 区别
- 队列持久化、消息持久化作用
- 手动ACK与自动ACK区别
- 微服务引入RabbitMQ的作用:解耦、异步、流量削峰、容错
- 仲裁/惰性/死信/延迟队列适用场景
- SpringCloud Gateway 路由、断言、过滤器作用
第九章 常见报错终极解决方案
- queueDeclare 参数报错 → 补全5个参数
- 包名路径不一致 → 文件夹和package严格一致
- RabbitMQ连接失败 → 检查端口、账号、cookie文件
- SpringBoot启动冲突 → 删掉bootstrap.yml
- 消息收不到 → 交换机/队列/路由键匹配
- 跨域报错 → Gateway全局跨域配置
浙公网安备 33010602011771号