1、服务部署
1.1、Docker快速部署
# 1. 拉取RabbitMQ镜像(带管理界面)
docker pull rabbitmq:3-management
# 2. 启动容器,映射端口(5672:AMQP协议端口;15672:管理界面端口)
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management
# 3. 访问管理界面
打开浏览器,输入 http://服务器IP:15672,默认用户名/密码:guest/guest(生产环境需修改)
(这里我本地虚拟机不能连外网,因此无法演示)
1.2、集群部署
代码如下:
bash
# 1. 安装RabbitMQ(CentOS示例)
yum install -y rabbitmq-server
# 2. 启动服务并设置开机自启
systemctl start rabbitmq-server
systemctl enable rabbitmq-server
# 3. 启用管理插件和监控插件
rabbitmq-plugins enable rabbitmq_management rabbitmq_prometheus
# 4. 创建管理员用户(替换为自己的用户名和密码)
rabbitmqctl add_user admin YourSecurePassword
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p / admin ".*" ".*" ".*"
# 5. 配置集群(多节点步骤,以2个节点为例)
# 节点1执行:
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
# 节点2执行(加入节点1集群,替换为节点1IP)
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbit@节点1IP
rabbitmqctl start_app
# 6. 配置镜像队列策略
rabbitmqctl set_policy ha-all "^" '{"ha-mode":"all","ha-sync-mode":"automatic"}'
注意,上面的命令只同步了队列和队列中的消息,不同步交换机。因为交换机的配置信息会在集群中自动共享,所以通常不需要通过镜像策略来同步。
这里是参考的他人的集群配置教程,我再贴一个自己写的教程:Linux系统,RabbitMQ+HAProxy+KeepAlived集群搭建
2、项目落地
这里在我的个人项目中,实现了一个顾客登录后,异步记录登录日志并提示欢迎语的功能。
日志详情实体类、Mapper类、Service类创建与RabbitMQ无关,略过。
2.1 RabbitMQ的配置类编写
首先写一个RabbitMQConfig,声明交换机、队列、并将交换机和队列绑定:
java
@Configuration
public class RabbitMQConfig {
//声明直连交换机
@Bean
public DirectExchange directExchange() {
return new DirectExchange("coupon.message", true, false);
}
@Bean
public Queue helloQueue() {
return new Queue("hello_queue", true);
}
@Bean
public Binding bindingHelloQueue(Queue helloQue, DirectExchange directExchange) {
return BindingBuilder.bind(helloQue).to(directExchange).with("user.hello");
}
}
2.2、声明消费者
再声明一个消费者,监听刚刚定义的队列:
java
@Component
public class MessageConsumerUtil {
@Autowired
MemberLoginLogService memberLoginLogService;
//监听的队列名称
@RabbitListener(queues = "hello_queue")
public void sayHello(MemberDTO memberDTO) {
System.out.println(memberLoginLogService.updateLoginLog(memberDTO) ? "登录记录写入成功" : "登录记录写入失败");
}
}
2.3、消息发送
发送消息直接在业务层调用消息发送方法即可,需要指定交换机、路由键、消息内容:
java
rabbitTemplate.convertAndSend("coupon.message","user.hello",memberDTO);