一**.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>引入依赖
java
<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。相比直接开放端口,这种方式能有效避免被恶意扫描和攻击,安全性更高!
java
spring:
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest
<3>生产者代码编写,例如:
java
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>消费者代码编写:
java
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消息处理失败方法
及时复盘,继续努力,加油!