尚品汇-项目目前存在问题、引入MQ(四十二)

目录:

(1)目前存在的问题

(2)消息队列解决什么问题

(3)消息队列工具 RabbitMQ

(4)搭建mq测试环境service-mq

下面我们先做的是前面后台管理系统商品上下架的没完成的功能,解耦操作,我们前面只做了添加上下架商品只是,写了往ES中添加数据的接口,并没有跟后台管理连接起来,下面完成链接,就用到MQ

(1)目前存在的问题

一:搜索与商品服务的问题

我们思考一下,是否存在问题?

- 商品的原始数据保存在数据库中,增删改查都在数据库中完成。

- 搜索服务数据来源是索引库,如果数据库商品发生变化,索引库数据不能及时更新。

如果我们在后台修改了商品的价格,搜索页面依然是旧的价格,这样显然不对。该如何解决?

这里有两种解决方案:

- 方案1:每当后台对商品做增删改操作,同时要修改索引库数据

- 方案2:搜索服务对外提供操作接口,后台在商品增删改后,调用接口

以上两种方式都有同一个严重问题:就是代码耦合,后台服务中需要嵌入搜索和商品页面服务,违背了微服务的独立原则。

所以,我们会通过另外一种方式来解决这个问题:消息队列

二:订单服务取消订单问题

用户下单后,如果2个小时未支付,我们该如何取消订单

- 方案1:定时任务,定时扫描未支付订单,超过2小时自动关闭

- 方案2:使用延迟队列关闭订单

三:分布式事务问题

如:用户支付订单,我们如何保证更新订单状态与扣减库存 ,三个服务数据最终一致!

(2)消息队列解决什么问题

消息队列都解决了什么问题?

异步

解耦

并行

排队 (流量削峰)

(3)消息队列工具 RabbitMQ

常见MQ产品

- ActiveMQ:基于JMS协议,java语言,jdk

- RabbitMQ:基于AMQP协议,erlang语言开发,稳定性好

- RocketMQ:基于JMS,阿里巴巴产品,目前交由Apache基金会

- Kafka:分布式消息系统,高吞吐量

RabbitMQ基础概念

Broker:简单来说就是消息队列服务器实体

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列

Queue:消息队列载体,每个消息都会被投入到一个或多个队列

Binding:绑定,它的作用就是把 exchange和 queue按照路由规则绑定起来

Routing Key:路由关键字, exchange根据这个关键字进行消息投递

vhost:虚拟主机,一个 broker里可以开设多个 vhost,用作不同用户的权限分离

producer:消息生产者,就是投递消息的程序

consumer:消息消费者,就是接受消息的程序

channel:消息通道,在客户端的每个连接里,可建立多个 channel,每个 channel代表一个会话任务

五种消息模型

RabbitMQ提供了6种消息模型,但是第6种其实是RPC,并不是MQ,因此不予学习。那么也就剩下5种。

但是其实3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。

基本消息模型:生产者–>队列–>消费者

work消息模型:生产者–>队列–>多个消费者共同消费

订阅模型-Fanout:广播模式,将消息交给所有绑定到交换机的队列,每个消费者都会收到同一条消息

订阅模型-Direct:定向,把消息交给符合指定 rotingKey 的队列

订阅模型-Topic 主题模式:通配符,把消息交给符合routing pattern(路由模式) 的队列

我们项目使用的是第四种!

(4)搭建mq测试环境service-mq

搭建service-mq服务

在service目录下搭建

修改配置pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <parent>
      <groupId>com.atguigu.gmall</groupId>
      <artifactId>service</artifactId>
      <version>1.0</version>
   </parent>

   <artifactId>service-mq</artifactId>
   <version>1.0</version>

   <packaging>jar</packaging>
   <name>service-mq</name>
   <description>service-mq</description>

   <build>
      <finalName>service-mq</finalName>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>

</project>

说明:引入依赖 ,后面会进行引入

 添加配置文件

说明:rabbitmq默认端口5672,注意更改正确

bootstrap.properties

spring.application.name=service-mq
spring.profiles.active=dev
spring.cloud.nacos.discovery.server-addr=192.168.200.129:8848
spring.cloud.nacos.config.server-addr=192.168.200.129:8848
spring.cloud.nacos.config.prefix=${spring.application.name}
spring.cloud.nacos.config.file-extension=yaml
spring.cloud.nacos.config.shared-configs[0].data-id=common.yaml

 

启动类

package com.atguigu.gmall.mq;


@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)//取消数据源自动配置
@ComponentScan({"com.atguigu.gmall"})
@EnableDiscoveryClient
public class ServiceMqApplication {

   public static void main(String[] args) {
      SpringApplication.run(ServiceMqApplication.class, args);
   }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值