一、MQ的简介
1. 什么是MQ(概念简述)
2. MQ的主要应用场景
应用场景 | 说明 |
解耦系统组件 | 允许不同组件之间解耦,降低了组件之间的依赖性。 |
提高系统可靠性 | 如果某个组件暂时不可用,消息队列可以存储消息,待组件恢复正常后再处理这些消息。 |
异步通信 | 允许系统中的组件进行异步通信,提高了系统的响应性。 |
削峰填谷 | 在流量波动较大的场景中,消息队列可以用来平滑流量,防止系统峰值负载。 |
分布式系统协调 | 在分布式系统中,消息队列可以用来协调各个节点的工作。 |
3. MQ的常见实现方式
3.1 RabbitMQ
1. 特点
2. 适用场景
3.2 Apache Kafka
1. 特点
2. 适用场景
3.3 ActiveMQ
1. 特点
2. 适用场景
3.4 Apache RocketMQ接口
1. 特点
2. 适用场景
3.5 Amazon Simple Queue Service (SQS)
1. 特点
2. 适用场景
3.6 Redis 发布/订阅
1. 特点
2. 适用场景
这些是一些常见的MQ实现方式,选择合适的MQ取决于应用的具体需求,包括对性能、可靠性、消息传递模式的要求等。
图解说明
4. MQ作用说明(含图解)
createOrder(...) {
// 完成订单服务
doCreateOrder(...);
// 调用其他服务接口
sendMsg(...);
updateUserInterestedGoods(...);
updateMemberCreditInfo(...);
}
二、 RabbitMQ
1. 组成部分
图解
三、Docker安装部署RabbitMQ
1. 拉取RabbitMQ镜像文件
2. 安装部署RabbitMq容器
docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management
3. 配置RabbitMq
四、springboot连接配置RabbitMQ
1. 创建项目
2. 修改配置文件
publisher/application.yml
server:
port: 9999
spring:
rabbitmq:
# 安装rabbitMq容器的虚拟机的ip地址
host: 192.168.52.130
# Rabbitmq的用户账号
username: yxspring
# Rabbitmq的用户密码
password: 123456
# Rabbitmq的容器的端口号
port: 5672
# RabbitMq的主机
virtual-host: my_vhost
consumer/application.yml
server:
port: 8888
spring:
rabbitmq:
# 安装rabbitMq容器的虚拟机的ip地址
host: 192.168.52.130
# Rabbitmq的用户账号
username: yxspring
# Rabbitmq的用户密码
password: 123456
# Rabbitmq的容器的端口号
port: 5672
# RabbitMq的主机
virtual-host: my_vhost
3. 案例演示
发布者
RabbitConfig.java
package com.yx.publisher;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
public Queue firstQueue() {
return new Queue("firstQueue");
}
}
TestController.java
package com.yx.publisher;
import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* com.yx.publisher
*
* @author 君易--鑨
* @site www.yangxin.com
* @company 木易
* @create 2024/1/19
*/
@RestController
public class TestController {
// 注入AmqpTemplate
@Autowired
private AmqpTemplate amqpTemplate;
// 编写一个请求方法
@RequestMapping("/send1")
public String send1(){
// 向交换机发送消息
amqpTemplate.convertAndSend("firstQueue","木易");
return "木易";
}
}
消费者
Receiver.java
package com.yx.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue") //接收的队列
public class Receiver {
@RabbitHandler
public void process(String msg) {
log.warn("接收到:" + msg);
}
}
实例讲解
User.java
package com.yx.publisher;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private String username;
private String userpwd;
}
PojoReceiver.java
package com.yx.consumer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue") //接收的队列
public class PojoReceiver {
@RabbitHandler
public void process(User user) {
log.warn("接收到:" + user);
}
}