这篇是SpringBoot整合消息队列的第一篇文章,我们详细介绍下消息队列的相关内容。

消息队列简介

1. 什么是消息队列

MQ(Message Quene):通过典型的生产者和消费者模型,生产者不断向消息队列中产生消息,消费者不断的从队列中获取消息。因为生产者和消费者都是异步的,而且生产者只关心消息的发送,消费者只关心消息的接收,没有业务逻辑的侵入,轻松实现业务解耦。

2. 消息队列有什么用

  • 异步处理

场景描述:某商场具有注册功能,注册的时候需要发送短信验证码。

传统的做法是用户提交信息到用户服务,用户服务调用短信服务发送短信,然后给用户返回响应,这种是同步的处理方式,耗时较长。加入消息队列后,用户直接提交信息到用户服务,将信息写入消息队列,直接给用户返回响应,短信服务从消息队列中读取消息进行发送短信。

  • 应用解耦

场景描述:某商场下单流程。

传统做法是用户下单,订单系统去查询库存系统,如果库存系统宕机了,则下单失败,损失订单量。加入消息队列后,用户下单,订单系统记录订单,将订单信息写入消息队列,下单成功,然后库存系统恢复正常后去操作数据库库存(不考虑库存为0的情况)。这样订单系统和库存系统就达到松耦合的目的了

  • 流量削峰

场景描述:秒杀活动。

流量过大肯定会导致响应超时或系统宕机,加入消息队列,用户秒杀请求写入消息队列,设置消息队列的长度等属性,达到消息队列最大长度后,直接返回秒杀失败,然后再去消费消息队列的数据,完成秒杀。

RabbitMQ简介

RabbitMQ是用Erlang语言编写的,实现了高级消息队列协议(AMQP)的消息中间件。

1. AMQP协议概念

AMQPAMQP是一种链接协议,直接定义网络交换的数据格式,这使得实现了AMQPprovider本身就是跨平台的。以下是AMQP协议模型:

  • server - 又称broker,接收客户端的链接,实现amqp实体服务。
  • Connection - 链接,应用程序跟broker的网络链接。
  • channel - 网络信道,几乎所有的操作都是在channel中进行,数据的流转都要在channel上进行。channel是进行消息读写的通道。客户端可以建立多个channel,每个channel代表一个会话任务。
  • message - 消息,服务器与应用程序之间传送的数据。由properties和body组成。properties可以对消息进行修饰,比如消息的升级,延迟等高级特性。body就是消息体的内容。
  • virtual host - 虚拟主机,用于进行逻辑隔离,最上层的消息路由,一个虚拟地址里面可以有多个交换机。exchange和消息队列message quene。
  • exchange - 交换机,接收消息,根据路由器转发消息到绑定的队列。
  • binding - 绑定,交换机和队列之间的虚拟链接,绑定中可以包含routing key。
  • routing key - 一个路由规则,虚拟机可以用它来确定jiekyi如何路由一个特定消息。
  • quene - 消息队列,保存消息并将它们转发给消费者。

2. RabbitMQ的消息模型

1. 简单模型

在上图中:

  • p:生成者
  • C:消费者
  • 红色部分:quene,消息队列

2. 工作模型

在上图中:

  • p:生成者
  • C1、C2:消费者
  • 红色部分:quene,消息队列

当消息处理比较耗时时,就会出现生产消息的速度远远大于消费消息的速度,这样就会出现消息堆积,无法及时处理。这时就可以让多个消费者绑定一个队列,去消费消息,队列中的消息一旦消费就会丢失,因此任务不会重复执行。

3. 广播模型(fanout)

这种模型中生产者发送的消息所有消费者都可以消费。

在上图中:

  • p:生成者
  • X:交换机
  • C1、C2:消费者
  • 红色部分:quene,消息队列

4. 路由模型(routing)

这种模型消费者发送的消息,不同类型的消息可以由不同的消费者去消费。

在上图中:

  • p:生成者
  • X:交换机,接收到生产者的消息后将消息投递给与routing key完全匹配的队列
  • C1、C2:消费者
  • 红色部分:quene,消息队列

5. 订阅模型(topic)

这种模型和direct模型一样,都是可以根据routing key将消息路由到不同的队列,只不过这种模型可以让队列绑定routing key 的时候使用通配符。这种类型的routing key都是由一个或多个单词组成,多个单词之间用.分割。

通配符介绍:

*:只匹配一个单词

#:匹配一个或多个单词

6. RPC模型

这种模式需要通知远程计算机运行功能并等待返回运行结果。这个过程是阻塞的。

当客户端启动时,它创建一个匿名独占回调队列。并提供名字为call的函数,这个call会发送RPC请求并且阻塞直到收到RPC运算的结果。

Spring Boot整合RabbitMQ

第一步:引入pom依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

第二步:增加RabbitMQ服务配置信息

spring:
rabbitmq:
virtual-host: javatrip
port: 5672
host: 127.0.0.1
username: guest
password: guest

这里我们用广播模型来举例使用,广播模型(fanout)比较好理解,就像公众号一样,我每天推文章后,会推送给每个关注用户,他们都可以看到这条消息。

广播模型注意点:

  1. 可以有多个队列
  2. 每个队列都需要绑定交换机
  3. 每个消费者有自己的队列
  4. 交换机把消息发送给绑定过的所有队列

1. 定义两个队列

@Configuration
public class RabbitConfig { final static String queueNameA = "first-queue";
final static String queueNameB = "second-queue"; /***
* 定义一个队列,设置队列属性
* @return
*/
@Bean("queueA")
public Queue queueA(){ Map<String,Object> map = new HashMap<>();
// 消息过期时长,10秒过期
map.put("x-message-ttl",10000);
// 队列中最大消息条数,10条
map.put("x-max-length",10);
// 第一个参数,队列名称
// 第二个参数,durable:持久化
// 第三个参数,exclusive:排外的,
// 第四个参数,autoDelete:自动删除
Queue queue = new Queue(queueNameA,true,false,false,map);
return queue;
} @Bean("queueB")
public Queue queueB(){ Map<String,Object> map = new HashMap<>();
// 消息过期时长,10秒过期
map.put("x-message-ttl",10000);
// 队列中最大消息条数,10条
map.put("x-max-length",10);
// 第一个参数,队列名称
// 第二个参数,durable:持久化
// 第三个参数,exclusive:排外的,
// 第四个参数,autoDelete:自动删除
Queue queue = new Queue(queueNameB,true,false,false,map);
return queue;
}
}

2. 定义扇形交换机

@Bean
public FanoutExchange fanoutExchange(){ // 第一个参数,交换机名称
// 第二个参数,durable,是否持久化
// 第三个参数,autoDelete,是否自动删除
FanoutExchange fanoutExchange = new FanoutExchange(exchangeName,true,false);
return fanoutExchange;
}

3. 交换机和队列绑定

@Bean
public Binding bindingA(@Qualifier("queueA") Queue queueA, FanoutExchange fanoutExchange){
Binding binding = BindingBuilder.bind(queueA).to(fanoutExchange);
return binding;
} @Bean
public Binding bindingB(@Qualifier("queueB") Queue queueB,FanoutExchange fanoutExchange){
Binding binding = BindingBuilder.bind(queueB).to(fanoutExchange);
return binding;
}

4. 创建两个消费者分别监听两个队列

@RabbitListener(queues = RabbitConfig.queueNameA)
@Component
@Slf4j
public class ConsumerA { @RabbitHandler
public void receive(String message){
log.info("消费者A接收到的消息:"+message);
}
}
@RabbitListener(queues = RabbitConfig.queueNameB)
@Component
@Slf4j
public class ConsumerB { @RabbitHandler
public void receive(String message){
log.info("消费者B接收到的消息:"+message);
}
}

5. 创建生产者生产消息

@RestController
public class provider { @Autowired
private RabbitTemplate rabbitTemplate; @GetMapping("send")
public void sendMessage(){ String message = "你好,我是Java旅途";
rabbitTemplate.convertAndSend(RabbitConfig.exchangeName,null,message);
}
}

这样生产者发送一条消息后,两个消费者就能同时消费到消息了。

此是spring-boot-route系列的第十三篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文已收录至我的github,欢迎各位小伙伴star

githubhttps://github.com/binzh303/spring-boot-route

点关注、不迷路

如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝啬,欢迎留言指出,我会及时核查修改。

如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!

spring-boot-route(十三)整合RabbitMQ的更多相关文章

  1. RabbitMQ入门:在Spring Boot 应用中整合RabbitMQ

    在上一篇随笔中我们认识并安装了RabbitMQ,接下来我们来看下怎么在Spring Boot 应用中整合RabbitMQ. 先给出最终目录结构: 搭建步骤如下: 新建maven工程amqp 修改pom ...

  2. Spring Boot(十三)RabbitMQ安装与集成

    一.前言 RabbitMQ是一个开源的消息代理软件(面向消息的中间件),它的核心作用就是创建消息队列,异步接收和发送消息,MQ的全程是:Message Queue中文的意思是消息队列. 1.1 使用场 ...

  3. spring boot / cloud (九) 使用rabbitmq消息中间件

    spring boot / cloud (九) 使用rabbitmq消息中间件 前言 rabbitmq介绍: RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.它可以用于大型软件系统 ...

  4. Spring Boot 2.x整合Redis

    最近在学习Spring Boot 2.x整合Redis,在这里和大家分享一下,希望对大家有帮助. Redis是什么 Redis 是开源免费高性能的key-value数据库.有以下的优势(源于Redis ...

  5. spring boot 2.0 整合 elasticsearch6.5.3,spring boot 2.0 整合 elasticsearch NoNodeAvailableException

    原文地址:spring boot 2.0 整合 elasticsearch NoNodeAvailableException 原文说的有点问题,下面贴出我的配置: 原码云项目地址:https://gi ...

  6. Spring Boot入门 and Spring Boot与ActiveMQ整合

    1.Spring Boot入门 1.1什么是Spring Boot Spring 诞生时是 Java 企业版(Java Enterprise Edition,JEE,也称 J2EE)的轻量级代替品.无 ...

  7. Spring Boot和Dubbo整合

    provider端 POM依赖 <dependencies> <dependency> <groupId>org.springframework.boot</ ...

  8. 转-Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合

    Hive/Phoenix + Druid + JdbcTemplate 在 Spring Boot 下的整合 http://blog.csdn.net/balabalayi/article/detai ...

  9. Spring Boot与ActiveMQ整合

    Spring Boot与ActiveMQ整合 1使用内嵌服务 (1)在pom.xml中引入ActiveMQ起步依赖 <dependency> <groupId>org.spri ...

  10. Spring Boot 2.X整合Spring-cache,让你的网站速度飞起来

    计算机领域有人说过一句名言:“计算机科学领域的任何问题都可以通过增加一个中间层来解决”,今天我们就用Spring-cache给网站添加一层缓存,让你的网站速度飞起来. 本文目录 一.Spring Ca ...

随机推荐

  1. 题解 洛谷P3799 【妖梦拼木棒】

    一道水题 (还是做了一个小时,我太菜了 基本思路: 题里面说,4根棍子拼成一个正三角形(等边三角形) 若设这四根棍子长度为\(a,b,c,d\)且\(a≥b>c≥d\) 那很容易得到 (真的很容 ...

  2. DIY申请达姆施塔特工业大学计算机专业(Informatik)硕士(Master)【附个人简历和动机信】

    1.个人概况 双非院校本科毕业两年,已来德国一年. APS绩点2.5,均分80.17. 2020.6月考出5443德福成绩,7月中下旬递交材料,9月初获得Zulassung(录取) PS:后来考出54 ...

  3. 转贴:110个Oracle 函数

    转载地址:https://bbs.csdn.net/topics/310021870 1. ASCII返回与指定的字符对应的十进制数;SQL> select ascii(A) A,ascii(a ...

  4. fake_useragent.errors.FakeUserAgentError: Maximum amount of retries reached解决方法!

    UserAgent 就是用户代理,又叫报头,是一串字符串,相当于浏览器的身份证号,在利用爬虫爬取网站数据时,频繁更换它可以避免触发相应的反爬机制. fake-useragent对频繁更换UserAge ...

  5. leetcode刷题-75颜色分类

    题目 给定一个包含红色.白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色.白色.蓝色顺序排列. 此题中,我们使用整数 0. 1 和 2 分别表示红色.白色和蓝 ...

  6. 使用fiddler和安卓模拟器抓取安卓客户端数据包

    安卓模拟器要选可以桥接网络的,本文中用的是雷电模拟器. 软件的安装都很简单,在此不再赘述. fiddler中的设置 首先,打开fiddler,点击Tools选项卡下的Options. 切换到https ...

  7. Kubernetes探针踩坑记

    1. 荒腔走板 最近一两个月生产K8s集群频繁出现短时503 Service Temporarily Unavailable,还不能主动复现,相当郁闷,压力山大. HTTP 5xx响应状态码用于定义服 ...

  8. JAVA热部署,通过agent进行代码增量热替换!!!

    在前说明:好久没有更新博客了,这一年在公司做了好多事情,包括代码分析和热部署替换等黑科技,一直没有时间来进行落地写出一些一文章来,甚是可惜,趁着中午睡觉的时间补一篇介绍性的文章吧. 首先热部署的场景是 ...

  9. xmake v2.3.7 发布, 新增 tinyc 和 emscripten 工具链支持

    xmake 是一个基于 Lua 的轻量级跨平台构建工具,使用 xmake.lua 维护项目构建,相比 makefile/CMakeLists.txt,配置语法更加简洁直观,对新手非常友好,短时间内就能 ...

  10. 测试软件—禅道BUG管理工具

    入禅 目录 入禅 1.禅道的基本使用 1.禅道的基本使用 admin(管理员) 部门:创建部门(需求部门,开发部门,测试部门,项目部门,产品部门) 组织:创建用户(产品经理,项目经理,开发人员,测试人 ...