RabbitMQ-黑马商城为例

title: RabbitMQ-黑马商城为例
date: 2024-06-22 20:37:17
tags: RabbitMQ

1.启动RabbitMQ

基于Docker来安装RabbitMQ,命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
docker run 
-e RABBITMQ_DEFAULT_USER=itheima #设置默认用户名
-e RABBITMQ_DEFAULT_PASS=123456 #设置默认密码
-v mq-plugins:/plugins #将本地主机上的mq-plugins目录挂载到容器内部的/plugins目录,可以存放插件
--name mq #指定容器名
--hostname mq #指定容器的主机名
-p 15672:15672 #RabbitMQ管理页面登录的端口号 [浏览器输入http://localhost:15672/即可进入]
-p 5672:5672 #RabbitMQ用于AMQP协议通信 [SpringAMQP配置时候用]
--network heima #将容器连接到名字为heima的网络中 [如果没有就使用命令创建hmall网络 docker network create heima]
-d #在后台运行容器
rabbitmq:3.8-management #使用RabbitMQ 3.8版本带有管理界面的镜像来创建容器


精简版 --直接在虚拟机上启动docker然后docker run
docker run \
-e RABBITMQ_DEFAULT_USER=itheima \
-e RABBITMQ_DEFAULT_PASS=123456 \
-v mq-plugins:/plugins \
--name mq \
--hostname mq \
-p 15672:15672 \
-p 5672:5672 \
--network heima\
-d \
rabbitmq:3.8-management

可以看到在安装命令中有两个映射的端口:

  • 15672:RabbitMQ提供的管理控制台的端口
  • 5672:RabbitMQ的消息发送处理接口

通过访问 http://localhost:15672或者http://192.168.92.129:15672即可看到本地/服务器上的管理控制台。首次访问登录,需要配置文件中设定的用户名和密码

image-20240319192803935

创建hmall用户,并且配置一个hmall2虚拟空间

image-20240623002616496

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的异步通知

image-20240622222844704

说明:目前没有通知服务和积分服务,因此我们只关注交易服务,步骤如下:

  • 定义direct类型交换机,命名为pay.direct
  • 定义消息队列,命名为trade.pay.success.queue
  • trade.pay.success.queuepay.direct绑定,BindingKeypay.success
  • 支付成功时不再调用交易服务更新订单状态的接口,而是发送一条消息到pay.direct,发送消息的RoutingKeypay.success,消息内容是订单id
  • 交易服务监听trade.pay.success.queue队列,接收到消息后更新订单状态为已支付

分析:

  • 生产者:支付服务pay-service

  • 消费者:交易服务trade-service

3.1 pom.xml导入依赖

在生产者和消费者的pom.xml文件中配置:

1
2
3
4
5
<!--消息发送-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

3.2 yml配置RabbitMQ信息

3.2.1 简单配置

在生产者和消费者的application.yml文件中配置:

1
2
3
4
5
6
7
8
9
spring:
rabbitmq:
host: 192.168.92.129 # 你的虚拟机IP
port: 5672 # 端口
virtual-host: /hmall2 # 虚拟主机
username: hmall # 用户名
password: 123456 # 密码

//消费者和生产者会在对应位置添加配置 【例如:生产者消费者的确认机制,重试机制等】

3.2.2 nacos统一配置管理

  • 将rabbitmq配置放在nacos平台:【如果使用统一配置管理,记得导入对应nacos统一配置的config依赖和读取bootstrap.yml文件依赖】

image-20240623002711143

  • bootstrap.yml添加读取nacos配置
image-20240622224211688

3.3 支付服务–发送消息

3.3.1 修改原来业务

image-20240622230216876

3.3.2 配置Jackson消息转换器

  • 导入依赖:

image-20240622232241693

  • 直接配置到hm-common微服务下:
image-20240622231633000
  • 因为要考虑trade-service和pay-service调用时候springboot扫描问题:
image-20240622232005648
  • 然后在生产者和消费者启动类添加bean注入:
image-20240623124959823

3.4 交易服务–接受消息

在trade-service服务中定义一个消息监听类,方法外用注解标注队列,交换机和路由key,方法内写之前调用的方法:

image-20240622233402122

3.5 测试

3.5.1 重启两个服务

可以通过hmall用户的hmall虚拟主机看到队列:

image-20240623003731861

可以通过hmall用户的hmall虚拟主机看到交换机:

image-20240623003857226

3.5.2 前端下单

前端下单然后支付成功之后,查看数据库信息变化了,并且有一条消息进入到mq之中。

image-20240623004203477

4.更改清除购物车需求

==这个需求参考3步骤做的,以下只介绍生产者和消费者部分代码修改==

4.1 订单服务–发送消息

image-20240623135513712

4.2 购物车服务–接收消息

image-20240623135542378

5.改造代码总结

原来的设计:我在方法位置直接调用tradeClient的方法
现在的设计:①生产者只需要传递原来的参数和声明交换机名和key路由;②消费者需要声明交换机名,key路由和队列名,在方法里面直接调用底层方法(serviceimpl层方法),就不用像openFeign方式。

image-20240623125707127

×

纯属好玩

扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

文章目录
  1. 1. 1.启动RabbitMQ
  2. 2. 2.操作步骤
  3. 3. 3.更改余额支付需求
    1. 3.1. 3.1 pom.xml导入依赖
    2. 3.2. 3.2 yml配置RabbitMQ信息
      1. 3.2.1. 3.2.1 简单配置
      2. 3.2.2. 3.2.2 nacos统一配置管理
    3. 3.3. 3.3 支付服务–发送消息
      1. 3.3.1. 3.3.1 修改原来业务
      2. 3.3.2. 3.3.2 配置Jackson消息转换器
    4. 3.4. 3.4 交易服务–接受消息
    5. 3.5. 3.5 测试
      1. 3.5.1. 3.5.1 重启两个服务
      2. 3.5.2. 3.5.2 前端下单
  4. 4. 4.更改清除购物车需求
    1. 4.1. 4.1 订单服务–发送消息
    2. 4.2. 4.2 购物车服务–接收消息
  5. 5. 5.改造代码总结
,