文章标题

  • 前言
  • 一: 消息中间件是什么?使用它有什么作用?
  • 二: 常见的消息中间件有哪些?
  • 三: 为什么选择RabbitMQ?
  • 四: RabbitMQ中核心的内容有那些?
  • 五: Spring如何整合rabbitMQ?
  • 六: 如何通过代码操作RabbitMQ?
  • 七:总结

   温馨提示: 本文大约7031字,阅读完大概需要3-6分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,如果觉的文章给你带来一点帮助,可以帮忙点一下赞和关注,谢谢!!

前言

  “开局五道题,文章看不看全由你”

  如果下面的题目你觉你已经完全懂了,那么看到这里可以退出了,如果你觉的对一些问题还有点困惑,那么请继续看下去,文章多少会给你一些启示(本文讲解内容: 消息队列中间件):

  注: 因为本篇文章到此处已经是比较长了,考虑到大家的阅读时间,所以RabbitMQ的操作的具体参数会另起一片文章做详细的讲解,需要了解操作参数的详细含义的,可以【关注】一下我发表的文章,谢谢理解。

1、消息中间件是什么?
2、常见的消息中间件有哪些?
3、使用它有什么作用?
4、RabbitMQ中核心的内容有那些,如何使用它们?
5、Spring如何整合RabbitMQ?
6、如何通过代码操作RabbitMQ?

一: 消息中间件是什么?使用它有什么作用?

(一) 先来看下百度百科对它的定义:

消息中间件是基于队列与消息传递技术,在网络环境中为应用系统提供同步或异步、可靠的消息传输的支撑性软件系统


看完我的心情也跟图片一样,一脸懵逼,还是通过比较通俗的语言表达更好,想要知道消息中间件是什么,我们可以拆开这个词来理解: 消息中间件 = 消息 + 中间件

消息: 简单的说就是软件之间通讯时传递的数据,它可以是很简单的数字、字母,也可以是很复杂的嵌套对象数据。

中间件: 最简单的理解是第三者,本来软件A和软件B间的通讯两者直接传递消息就可以了,但是,此时中间件作为第三者,非要先让软件A通讯的消息先发给它,再由它发给软件B(感觉就是中间商一样),下面通过图来更好的理解它们。

消息队列: 是消息中间件的一种实现方式。

总结:消息中间件则是将软件与软件之间的交互方式进行存储和管理的一种技术,也可以看做是一种容器。



此时此刻,你肯定会有疑问,软件间可以直接通讯,还要个"第三者"干嘛?“存在即合理”,下面我们就来看看消息中间件到底有什么作用!

(二) 消息中间件的作用:

  1、异步处理,提高响应速度: 比如我们最常见的短信验证码功能,当我们在界面点击“获取验证码”后,我们还可以同时进行其他的操作,如输入更新的密码等,此时,我们不需要一直等到手机收到短信了才进行下一步的操作,这就是异步处理,提高了用户体验。

  2、应用解耦: 如常见的订单系统,当有订单下单时,我们需要减去库存,但如果订单、库存的逻辑都放在一个系统中,不止处理事件需要很长,系统的耦合性比较高,此时,使用消息中间件,可以实现将订单业务和库存业务抽出来做不同的系统,每次下单的时候可以将下单信息放入消息中间间中,然后库存系统去订阅它,只有有订单数据就进行减去库存操作,这样就将应用解耦了

  3、流量削峰: 如常见的秒杀系统,如果有5万个商品可以秒杀,没有消息中间件的话,所有的请求都一次性到后台,此时系统很容易卡死,引入消息中间件如消息队列,此时可以在队列中设置好可以存储数据的数量,这样每次用户请求会先但消息队列中,消息队列就减去1,当消息队列中存储长度为0时,直接返回秒杀失败,这样就避免了所有用户请求可能在同一时间到达系统后台,达到流量削峰的作用

二: 常见的消息中间件有哪些?

   消息队列: 是消息中间件的一种实现方式。

   常见的消息队列中间件: ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。

三: 为什么选择RabbitMQ?

想要知道为什么选择RabbitMQ,就需要先了解一些关于消息队列的专业知识:

   (一) 消息服务规范

  1、JMS(java message service) java消息服务: 基于jvm消息代理的规范,如ActiveMQ,HornetMQ就是JMS实现。

  2、AMQP(Advanced Message Queuing Protocol)高级消息队列协议: 是一个消息代理的规范,兼容JMS,RabbtisMQ是AMQP的实现。

   (二) 两者的区别:

  1、AMQP是跨语言,跨平台,JMS不是,只能用于Java平台

  2、JMS只提供了两种消息模型即: 点对点,发布订阅,AMQP提供了五种消息模型

  3、JMS支持多种消息类型,AMQP支持字节数组类型

  总结: 考虑到现在流行的微服务开发,不同微服务可能使用的是不同的语言开发,综合考虑选择RabbitMQ消息队列,因为它是AMQP规范的一个实现,可以达到跨平台、跨语言。

四: RabbitMQ中核心的内容有那些?

   (一) 消息服务的两个概念

  1、消息代理(message broker): 负责接受消息生产者发送的消息

  2、目的地(destination):消息最终被消费的地方

  3、两者的关系: 当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定的目的地。

   (二) 从消息代理到目的地的方式

  1、队列: 点对点的通信(point - to - point): 消息发送者发送消息,消息代理将其放入到一个队列中,消息接收者从队列中获取消息内容,消息读取后被移除出队列。

  2、主题: 发布publish/订阅subscribe 消息通信: 发布者发送消息到主题,多个接收者(订阅者)订阅这个主题,那么就会在消息到达时同时收到消息

   (三) RabbitMQ的核心概念

  1、Message(消息): 不具名,由消息头和消息体租出,消息体是不透明的。消息头是由一系列的可选属性组成如,routing-key路由键,priority-相对其他消息的优先权,delivery-mode-指出该消息是否需要永久存储等。

  2、Publicsher(消息的生产者): 是向交换器发布消息的客户端应用程序。

  3、Exchange(交换器): 用来接受消息并且消息路由给服务器中的队列,有四种类型,即决定消息发布到那个队列,具体有以下的类型:

    (1)、Direct:消息中的路由键(routingkey),如果和Binding中的binding key 一致,那么就将消息发到对应的队列中。

    (2)、Fanout类型: 即广播模式,每个发送到fanout类型的交换器消息,交换器会将消息发送到它绑定的所有队列中,它转发消息是最快的。

    (3)、Topic:主题,可以设置模糊匹配,会识别"#“和”*"号,#表示匹配0个或者多个单词,*匹配一个单词,单词之间使用:逗号隔开。

    (4)、headers:实现发布订阅模型(基本不使用了)。

  4、Queue(消息队列): 消息的容器,一个消息可以放在一个或者多个队列中。

  5、Binding(绑定): 用于消息队列和交换器之间的关联,一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,交换器跟队列的绑定可以是多对多的关系

  6、Connection(网络连接): 如一个Tcp连接。

  7、Channel(信道): 多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟通道,AMQP命令都是通过信道发出去的,不管是发布消息,订阅队列,还是接收消息,都是通过信道完成,因为对于操作系统来说创建和销毁一个TCP连接都是很昂贵的开销,所以使用信道以实现复用一条TCP连接。

  8、Consumer(消费者): 接受和消费消息。

  9、Virtaul Hos(虚拟主机): 即小型的RabbitMQ服务器,它表示一批交换器,消息队列和相关对象,连接时必须指定,默认是:/(以路径区分)。

  10、Broker: 消息队列服务器实体。

五: Spring如何整合rabbitMQ?

  (一) 添加依赖

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

  (二) 设置配置信息

spring:application:name: RabbitMQ-Test # 应用名称rabbitmq:host: localhost #rabbitServer的地址port: 5672 # 端口username: guest # 用户名称password: guest # 连接密码virtual-host: /server: port: 9090

  (三) 启动类添加EnableRabbit注解

@SpringBootApplication
@EnableRabbit
public class RabbitMqTestApplication {public static void main(String [] args){SpringApplication.run(RabbitMqTestApplication.class,args);}
}

六: 如何通过代码操作RabbitMQ?

  注: 因为本篇文章到此处已经是比较长了,考虑到大家的阅读时间,所以RabbitMQ的操作的具体参数会另起一片文章做详细的讲解,需要了解操作参数的详细含义的,可以点击文章末尾的连接跳转,谢谢理解。

  (一) Spring提供操作RabbitMQ的工具类

  1、RabbitTemplate: 是Spring集成RabbitMQ而提供的一个工具类,跟JdbcTemplate一样,可以通过它进行消息的发送和接收。

  2、RabbitAdmin : 主要用于管理交换机和队列的信息。

  (二) 测试的公共执行代码

// 测试前加载RabbitAdminprivate static AmqpAdmin amqpAdmin;private static ConnectionFactory connectionFactory;@BeforeClasspublic static void loadNeedBean(){com.rabbitmq.client.ConnectionFactory connFactory = new com.rabbitmq.client.ConnectionFactory();connFactory.setHost("47.91.198.211");connFactory.setPort(5672);connFactory.setUsername("guest");connFactory.setPassword("guest");connFactory.setVirtualHost("/");connectionFactory = new CachingConnectionFactory(connFactory);// RabbitAdmin 主要用于管理交换机和队列的信息amqpAdmin = new RabbitAdmin(connectionFactory);}

  (三) 操作交换机(Exchange)

    // 交换机操作@Testpublic void rabbitExchangeTest() throws Exception{// 创建交换机// 参数分别是: 交换机名称,是否持久化,是否自动删除Exchange exchange = new DirectExchange("direct_test",true,false);amqpAdmin.declareExchange(exchange);// 删除交换机amqpAdmin.deleteExchange("direct_test");}

  (四) 操作队列(Queue)

    // 操作队列@Testpublic void rabbitExchangeAndQueueTest() throws Exception{// 创建队列Queue queue = new Queue("queue_test111");amqpAdmin.declareQueue(queue);// 删除队列amqpAdmin.deleteQueue("queue_test111");}

  (五) 交换机和队列的绑定

 // 队列和交换机操作@Testpublic void rabbitQueueTest(){// 创建交换机Exchange exchange = new DirectExchange("direct_test2",true,false);amqpAdmin.declareExchange(exchange);// 创建队列Queue queue = new Queue("queue_test",true);amqpAdmin.declareQueue(queue);// 绑定交换机交换机//Binding binding = new Binding("direct_test2", Binding.DestinationType.EXCHANGE,"direct_test2","rount-key",null);// 队列绑定到交换机Binding binding = new Binding("queue_test", Binding.DestinationType.QUEUE,"direct_test2","rount-key",null);amqpAdmin.declareBinding(binding);}

  (六) 消息生产者发送消息到消息队列中

    @Testpublic void messageProductTest(){// 消息操作模板RabbitTemplate rest = new RabbitTemplate(connectionFactory);MessageProperties messageProperties = new MessageProperties();messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);// 发送消息方式一String msg = "hello world";Message message = new Message(msg.getBytes(),messageProperties);// 发送消息方式二HashMap map = new HashMap();map.put("key","value");rest.convertAndSend("direct_test2","rount-key",map);}

  (七) 消息消费者从队列中消费(手动执行的方式)

    // 消息的消费者@Testpublic void messageConsumerTest() throws  Exception{RabbitTemplate rest = new RabbitTemplate(connectionFactory);// 从名为queue_test的队列中获取消息Message queue_test = rest.receive("queue_test");System.out.println(new String(queue_test.getBody(),"UTF-8"));}

  (八) 消息消费者从队列中消费(自动监听,使用注解的方式)

@RestController
public class RabbitController {// 指定需要监听的队列名称,可以是多个@RabbitListener(queues = "queue_test")public void messageListener(Message data){System.out.println("收到数据:----------");System.out.println(data);}}

七:总结

   看到此处,你应该对RabbitMQ有了更深入的认识,但是、关于RabbitMQ的知识远远不止这一篇文章描述的,因为篇幅有限,后面会更新更多关于RabbitMQ相关的知识。如果你看完本文觉得有疑问或者本文有错误的地方,欢迎私信或者在下方留言指出。

   码字不易、如果你觉得本文对你有一点点帮助,可以点赞和关注!

关注公众号【是秘密呀joy】一个让你提高技术知识的秘密基地!

RabbitMQ最全使用教程-小白也能看懂相关推荐

  1. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 3)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第三讲 这是小白都能看懂的实战教程 手把手教你Python Web全栈开发 的 ...

  2. 小白也能看懂:最全无线渗透测试与攻防+Fluxison钓鱼教程+路由器安全设置指南 2021.3.31

    小白也能看懂:最全无线渗透测试与攻防+Fluxison钓鱼教程+路由器安全设置指南 2021.3.31 一. 无线AP的加密方式 WEP加密 WPA-PSK/WPA2-PSK加密 WPS加密 二. 无 ...

  3. 小白都能看懂的实战教程 手把手教你Python Web全栈开发(DAY 1)

    小白都能看懂的实战教程 手把手教你Python Web全栈开发 Flask(Python Web)实战系列之在线论坛系统 第一讲 博主博客文章内容导航(实时更新) 更多优质文章推荐: 收藏!最详细的P ...

  4. (转载)最全各种浏览器网页星号点号密码查看最简方法(技术小白也能看懂使用)

    https://blog.csdn.net/superit401/article/details/77892480 最全各种浏览器网页星号点号密码查看最简方法(技术小白也能看懂使用)加粗样式

  5. armbian清理_小孩子才做选择,OMV、HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南...

    小孩子才做选择,OMV.HomeAssistant我全都要,小白也能看懂的N1盒子纯净刷机指南 2020-04-10 22:46:04 63点赞 609收藏 52评论 创作立场声明:今天我是一个可爱的 ...

  6. 小白也能看懂的网络基础 | 01 什么是网络?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

  7. 小白也能看懂的网络基础 | 02 什么是连接设备?

    公众号关注 「奇妙的 Linux 世界」 设为「星标」,每天带你玩转 Linux ! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网络的基础知识.如果你完 ...

  8. 小白也能看懂的网络基础 | 44 张图搞定什么是连接设备?

    公众号关注"程序IT圈", 选择"星标",重磅干货,第一时间送达! 引言 欢迎来到网络世界,<小白也能看懂的网络基础>系列文章会从零开始帮助你构建网 ...

  9. python进阶(小白也能看懂)——装饰器浅谈(一)

    python进阶(小白也能看懂)--装饰器(一) 第四篇 文章目录 python进阶(小白也能看懂)--装饰器(一) 1.函数基础知识 例子1.1 例子1.2 例子1.3 例子1.4 2.不带参数的装 ...

最新文章

  1. 重磅丨国资委下发通知,加快推进国有企业数字化转型
  2. 洞悉2020年数据团队建设,我们和清华、领英一起搞了个大事情,你也可以参与!...
  3. 《通往奴役之路》读书笔记及读后感作文4800字
  4. PLSQL Developer 插入中文 乱码问题,如图 这个是由于oracle服务器端字符编码 和 Oracle 客户端 字符编码不一致引起的。 检查Oracle服务器端字符编码,用 sel
  5. C++11 新特性之std::thread
  6. 删除归档日志_ORA-00257:archiver error.Connect internal only, until freed的问题
  7. 串口通信模块5:串口操作自定义类(3)
  8. 一站式 Java Web 框架 firefly-2.0_07发布
  9. android webview js 失效,Android WebView注入JQuery、JS脚本及执行无效的问题解决
  10. Codeforces Round #592 (Div. 2) G. Running in Pairs 构造(水)
  11. JavaScript 打印结果时多出一个undefined/出现undefined
  12. python 强制结束线程_在python中实现强制关闭线程的示例
  13. i2c总线注意事项和在linux下使用实战
  14. http请求状态码表示的意义
  15. mysql如何实现透视表功能_SQL 实现数据透视表功能
  16. Redis中SDS简单动态字符串
  17. 微博上面好看的跳舞美女蛮多的,【Python爬虫】采集微博视频数据(附代完整代码)
  18. 精美的wordpress企业主题模板
  19. 面试题27-二叉树的镜像
  20. 万字详解大数据平台异地多机房架构实践

热门文章

  1. C++ lambda 表达式深剖
  2. linux 查看进程路径
  3. VC++的C运行库源代码位置
  4. 虚拟专用网络VPN连接配置
  5. python图像处理实例_python 图像处理(示例代码)
  6. 手机CAD看图上有哪些编辑功能呢?应该如何操作呢?
  7. vue项目全局引入jquery
  8. MySQL主流高可用解决方案有_高可用MySQL解决方案概述
  9. el-table 表格 业务标配模板;
  10. js图片加载不出来时隐藏图片