一.MQ介绍
1.MQ概念:MQ是对不同类型的消息队列的统称
不同类型的消息队列常见的有:
①:RabbitMQ
②:RocketMQ
③:Kafka …等
2.用途:MQ常用于系统通信(数据传输),可分两类
①:同步通信: 系统A—接口调用—>系统B
②:异步通信: 系统A—消息传递—>|消息队列|—消息传递—>系统B

3.MQ作用:MQ 基础作用是接收、存储、转发消息,并借此实现异步、解耦、削峰等核心作用.
可借MQ实现以下操作:
①:异步解耦
②:流量削峰
③:消息分发
④:延迟通知
⑤:异步通信
4.AMQP:
是什么:AMQP是一种高级消息队列协议
5.RabbitMQ快速入门(以下代码均采用 SpringBoot + RabbitMQ)
<1>引入依赖
<dependencies>
<!– https://mvnrepository.com/artifact/com.rabbitmq/amqp-client –>
<dependency>
<groupId>com.rabbitmq</groupId>
<artifactId>amqp-client</artifactId>
<version>5.20.0</version>
</dependency>
</dependencies>
<2>配置(根据自己设置的账号密码,以及交换机进行配置)
建议:不直接将服务器上的 5672、15672 等端口暴露在公网,可通过设置 SSH 隧道,在本地使用自定义端口访问服务器上的 RabbitMQ。相比直接开放端口,这种方式能有效避免被恶意扫描和攻击,安全性更高!
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
<3>生产者代码编写,例如:
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RequestMapping("/mq") // 类上统一前缀
@RestController
public class ProducerController {
// RabbitTemplate 是 Spring 提供的发消息工具
@Autowired
private RabbitTemplate rabbitTemplate;
// 浏览器访问这个接口就发消息
@GetMapping("/send")
public String sendMsg() {
String message = "这是一条测试消息";
// 发送到队列 test_queue
rabbitTemplate.convertAndSend("test_queue", message);
return "消息发送成功:" + message;
}
}
<4>消费者代码编写:
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
public class ConsumerListener {
// 和生产者发的队列名一致:test_queue
@RabbitListener(queues = "test_queue")
public void receive(String message) {
System.out.println("消费者收到消息:" + message);
}
}
二.RabbitMQ的应用:
1.工作模式的介绍:
<1>简单模式:
producer—>|Queue|—>consumer

<2>工作队列模式:
producer—>|Queue| —>consumer1
—>consumer2

<3>发布订阅模式(交换机类型为Fanout广播模式):
producer—>|Exchange| —>|Queue1|—>consumer1
—>|Queue2|—>consumer2

Exchange交换机介绍:
RabbitMQ支持的交换机类型有4种:
①:Fanout:广播交换机,将消息交给所有与交换机绑定的队列
②:Direct: 定向交换机,把消息交给符合指定routingKey的队列(精确匹配)
③:Topic: 通配符交换机,把消息交给符合routing pattern的队列(模糊匹配)
④:Headers:头部交换机,生产环境中不常用,这里仅了解
介绍一下RoutingKey和BindingKey:
tips:本质上,它们就是同一个东西,在代码里全都叫 routingKey!
二者为同一个字符串,只是场景不同,名字不一样!为了好区分

<4>路由模式(交换机类型为Direct定向模式):
producer—>|Exchange| ①:–a–>|Queue1|—>consumer1
②:–a–>|Queue2|—>consumer2
–b–>|Queue2|—>consumer2
–c–>|Queue2|—>consumer2

<5>通配符模式:
producer—>|Exchange| —> ①:–*.a.*–>|Queue1|—>consumer1
②:–*.*.b–>|Queue2|—>consumer2
–c.#–>|Queue2|—>consumer2

扩展:
*与#的区别:①*:一个段,如: a.* —> a.b/a.c
②#:0~多个段,如a.#—>a/a.b/a.b.c
<6>RPC模式(RPC通信,了解为主)
Client—request—>|RPC|—>|Service|—>Reply—reply—>Client

<7>发布确认模式:(等价于发送方确认特性)是RabbitMQ消息可靠性保证的机制之一
producer—>|Queue|—>consumer—ACK—>producer
三种实现方式(效率有高到低):
①:异步确认
②:批量确认
③:单独确认

共7中工作模式.
2.介绍@RabbitListener
1.是什么:@RabbitListener是Spring框架中消费者用于监听RabbitMQ队列的注解,用它可自定义一个方法,消费者可以用它从RabbitMQ队列中接收消息 .
2.常用参数类型:
①:String:返回消息的内容
②:Message:返回原始的消息体及属性
③:Channel:RabbitMQ通道对象,可用于进行跟高级的操作,如手动确认消息.
注:默认为自动确认,若要改成手动确认,步骤如下:
1`配置(yml,properties)改成manual
2`@RabbitListener方法参数加Channel channel
3`配套写basicAck手动确认方法和basicNack消息处理失败方法




