title: RabbitMQ-黑马商城为例
date: 2024-06-22 20:37:17
tags: RabbitMQ
1.启动RabbitMQ
基于Docker来安装RabbitMQ,命令如下:
1 | docker run |
可以看到在安装命令中有两个映射的端口:
- 15672:RabbitMQ提供的管理控制台的端口
- 5672:RabbitMQ的消息发送处理接口
通过访问 http://localhost:15672或者http://192.168.92.129:15672即可看到本地/服务器上的管理控制台。首次访问登录,需要配置文件中设定的用户名和密码
创建hmall用户,并且配置一个hmall2虚拟空间
2.操作步骤
1.pom.xml中引入AMQP依赖:消费者和生产者项目
2.yml文件中配置RabbitMQ信息:
- 2.1消费者项目【基础配置,消费者重试机制,消费者确认机制】
- 2.2生产者项目【基础配置,生产者重试机制,生产者确认机制】
3.发送消息:生产者利用RabbitTemplate.convertAndSend(exchange交换机, routingKey路由key,message消息【传递的字段】(.setDelay设置延迟时间),confirm消息确认机制信息);
- 3.1 message默认是JDK序列化有一堆问题 –>引入Jackson序列化【①引入依赖,②生产者和消费者的启动类添加@Bean注入】
4.接收消息:消费者在方法上添加@RabbitListener注解
具体就是@RabbitListener(bindings=@QueueBinding(
value=@Queue(name=队列名,durable=true持久化,惰性队列arguments = @Argument(name=”x-queue-mode”,value = “lazy”)),
exchange=@Exchange(name=交换机名,type = ExchangeTypes.TOPIC,delayed=”true”延迟属性),
key={“绑定条件1”,”绑定条件2”}
))
方法(原来传递的字段){
//里面写的就是之前直接调用的那个方法(serviceimpl层代码)
}
3.更改余额支付需求
改造余额支付功能,将支付成功后基于OpenFeign的交易服务的更新订单状态接口的同步调用—–>基于RabbitMQ的异步通知
说明:目前没有通知服务和积分服务,因此我们只关注交易服务,步骤如下:
- 定义
direct
类型交换机,命名为pay.direct
- 定义消息队列,命名为
trade.pay.success.queue
- 将
trade.pay.success.queue
与pay.direct
绑定,BindingKey
为pay.success
- 支付成功时不再调用交易服务更新订单状态的接口,而是发送一条消息到
pay.direct
,发送消息的RoutingKey
为pay.success
,消息内容是订单id - 交易服务监听
trade.pay.success.queue
队列,接收到消息后更新订单状态为已支付
分析:
生产者:支付服务pay-service
消费者:交易服务trade-service
3.1 pom.xml导入依赖
在生产者和消费者的pom.xml文件中配置:
1 | <!--消息发送--> |
3.2 yml配置RabbitMQ信息
3.2.1 简单配置
在生产者和消费者的application.yml文件中配置:
1 | spring: |
3.2.2 nacos统一配置管理
- 将rabbitmq配置放在nacos平台:【如果使用统一配置管理,记得导入对应nacos统一配置的config依赖和读取bootstrap.yml文件依赖】
- bootstrap.yml添加读取nacos配置
3.3 支付服务–发送消息
3.3.1 修改原来业务
3.3.2 配置Jackson消息转换器
- 导入依赖:
- 直接配置到hm-common微服务下:
- 因为要考虑trade-service和pay-service调用时候springboot扫描问题:
- 然后在生产者和消费者启动类添加bean注入:
3.4 交易服务–接受消息
在trade-service服务中定义一个消息监听类,方法外用注解标注队列,交换机和路由key,方法内写之前调用的方法:
3.5 测试
3.5.1 重启两个服务
可以通过hmall用户的hmall虚拟主机看到队列:
可以通过hmall用户的hmall虚拟主机看到交换机:
3.5.2 前端下单
前端下单然后支付成功之后,查看数据库信息变化了,并且有一条消息进入到mq之中。
4.更改清除购物车需求
==这个需求参考3步骤做的,以下只介绍生产者和消费者部分代码修改==
4.1 订单服务–发送消息
4.2 购物车服务–接收消息
5.改造代码总结
原来的设计:我在方法位置直接调用tradeClient的方法
现在的设计:①生产者只需要传递原来的参数和声明交换机名和key路由;②消费者需要声明交换机名,key路由和队列名,在方法里面直接调用底层方法(serviceimpl层方法),就不用像openFeign方式。