电商项目——全文检索-ElasticSearch——第一章——中篇
电商项目——商城业务-商品上架——第二章——中篇
电商项目——商城业务-首页——第三章——中篇
电商项目——性能压测——第四章——中篇
电商项目——缓存——第五章——中篇
电商项目——商城业务-检索服务——第六章——中篇
电商项目——商城业务-异步——第七章——中篇
电商项目——商品详情——第八章——中篇
电商项目——认证服务——第九章——中篇
电商项目——购物车——第十章——中篇
电商项目——消息队列——第十一章——中篇
电商项目——订单服务——第十二章——中篇
电商项目——分布式事务——第十三章——中篇
文章目录
1:RabbitMQ简介
-
概述
我们来讲一下队列和主题中的点对点式和发布订阅式的概念
-
消息代理
-
分布式中的使用场景:
-
异步处理
假设我们注册用户信息到数据库,分为3步,第一步,我们先将注册的信息保存到数据库中花费50ms,第二步,发送邮件告诉注册者注册成功花费50ms,第三步,还有发送通知短信告诉注册者又花费50ms,这是一个同步模式,用户注册完到用户看到注册完的提示信息后,我们花费了150ms(就是第一张图);其实我们可以把发送邮件告诉注册者注册成功和送通知短信告诉注册者启动一个异步任务,这样就可以大大缩短花费时间(第二张图);但是实际上我们连异步都不要,我们可以将在注册到数据库上成功的消息保存在消息队列里面,至此我们直接给用户返回(消息队列的存取速度很快),这样我们实际只要花费55ms,其他服务在去消息队列中取消息
-
应用解耦
我们以下一个订单为例,我们下了一个订单,库存要执行出库操作,比如下订单的方法api传入三个参数,调库存方法存入五个参数,如果我们的库存服务一升级,订单服务就要修改源代码重新部署,我们就可以引入消息队列,我们给订单系统下完订单以后,我们就可以给消息队列中存入消息,库存消息不关系库存的接口是什么样,只需要实时的订阅消息队列里面的内容,只要有内容库存系统就可以实时收到消息,然后就可以得到什么样的消息,减去什么样的订单;我们下完订单以后,库存系统无需再知道订单系统的接口就可以完成操作了,这就是应用解耦;
-
流量监控(流量削峰)
对于一些秒杀商品来说,瞬间流量会非常大,如果一百万个请求同时进入业务代码可呢会导致机器宕机,我们可以将大并发的请求进来存取到消息队列中,后台的业务处理就不着急调用,后台根据它的能力来进行消费
2:RabbitMQ工作流程
RabbitMQ概念
3:RabbitMQ安装
# rabbitmq安装命令
docker run --name rabbitmq \
-p 5671:5671 -p 5672:5672 \
-p 4369:4369 -p 25672:25672 \
-p 15671:15671 \
-p 15672:15672 \
rabbitmq:management
安装完以后,我们就可以使用虚拟机ip+15672(web管理后台端口)来打开rabbitmq的图形化界面
4:Exchange类型
前面我们安装好了rabbitmq,现在我们就来测试rabbitmq的使用,我们来看下Exchanges和Queues是怎么工作的
我们先来看一下RabbitMQ的运行机制
Exchange的四种类型介绍
- 发消息是发给交换机,监听消息是来监听队列
- 我们接下来就可以在整个rabbitmq的图形化界面进行测试
创建一个交换机
创建一个队列
交换机与队列进行绑定
5:Direct-Exchange
我们来创建出上面的三个交换机和四个队列来进行演示
大家可以根据上面三种交换机的介绍自行测试
6:Fanout-Exchange
大家可以根据上面三种交换机的介绍自行测试
7:Topic-Exchange
大家可以根据上面三种交换机的介绍自行测试
8:SpringBoot整合RabbitMQ
SpringBoot整合RabbitMQ三步曲
第一步:在mall-order中导入如下依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
/**
* 使用RabbitMQ
* 1:引入amqp场景:RabbitAutoConfiguration就会自动生效
* 2:RabbitAutoConfiguration就会自动生效给容器中自动配置了
* CachingConnectionFactory RabbitTemplateConfigurer RabbitTemplate RabbitMessagingTemplate amqpAdmin
* // @Bean
public CachingConnectionFactory rabbitConnectionFactory(RabbitProperties properties,
上面代码可以知道我们要去application.yml种进行配置
所有的属性都是在下面的类中绑定
@ConfigurationProperties(prefix = "spring.rabbitmq")
public class RabbitProperties {
3:给配置文件中配置spring.rabbitmq信息
* 4:@EnableRabbit :这种注解用到了非常多开启相关功能
*/
我们接下来就在mall-order中的test下进行测试
第二步:给配置文件中配置spring.rabbitmq信息(我配置在了nacos config)
spring.rabbitmq.host=192.168.56.10
spring.rabbitmq.port=5672
spring.rabbitmq.virtual-host=\
第三步:添加@EnableRabbit :这种注解用到了非常多开启相关功能
@EnableRabbit
@EnableDiscoveryClient
@SpringBootApplication
public class MallOrderApplication {
public static void main(String[] args) {
SpringApplication.run(MallOrderApplication.class, args);
}
}
9:AmqpAdmin使用
创建一个交换机
@Test
void createExchange() {
DirectExchange directExchange = new DirectExchange("hello-java-exchange", true, false);
amqpAdmin.declareExchange(directExchange);
log.info("交换机:hello-java-exchange【】创建成功");
}
交换机:hello-java-exchange【】创建成功
创建一个队列
@Test
void createQueue() {
//true if we are declaring an exclusive queue (the queue will only be used by the declarer's
* connection)
Queue queue = new Queue("hello-java-queue", true, false, false);
amqpAdmin.declareQu