springboot 2.0 教程-10-集成消息中间件

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_31922571/article/details/84873405

阅读原文:https://blog.bywind.cn/articles/2018/11/28/1543373589258.html
视频教程:https://www.bilibili.com/video/av35595465
课程源码:https://github.com/ibywind/springboot-learn
关注公众号 查看更多技术干货
还可加群 , 众多好基友在等你
mpjpg

springboot 书籍 PDF 下载

扫描关注上方公众号
回复关键字 boot
就可以下载这本书了
书籍的排版很好的,我自己也在看.大家可以一起交流哦
1_png

写在前面

hello 大家好

欢迎大家收看御风大世界

本次课是

springboot 系列教程第10课

我将为大家演示

springboot中如何集成消息中间件

本节课视频演示比图文描述更清晰

如果要学习的朋友, 直接转视频哦

B站视频更清晰

Mq的好处

接口 VS Mq

看到张图了吗?

中间多了个物件 (中间件)

我们 之间不再 需要 你依赖我 我依赖你了

而是 交给一个 中间人

各取所需啊。

以前 我要告诉你 我OK了 , 然后 你 回复 好的 我知道了

然后 我接收到 你说 你知道了

我才能 真的 OK了

而且 重试 的话 还需要 依赖定时任务 或者 缓存状态

现在 可靠投递、广播、流量控制、最终一致性

这些 都可以交给 Mq 了

好爽啊 !!!

再给你来几个 Mq 的优势吧 (面试能用上)

1、 异步通信

有些业务不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

2、 解耦

降低工程间的强依赖程度,针对异构系统进行适配。在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。通过消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,当应用发生变化时,可以独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。

3、 冗余

有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。

4、扩展性

因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。便于分布式扩容。

5、过载保护

在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量无法提取预知;如果以为了能处理这类瞬间峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。

6、可恢复性

系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。

7、顺序保证

在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。

8、缓冲

在任何重要的系统中,都会有需要不同的处理时间的元素。消息队列通过一个缓冲层来帮助任务最高效率的执行,该缓冲有助于控制和优化数据流经过系统的速度。以调节系统响应时间。

9、数据流处理

分布式系统产生的海量数据流,如:业务日志、监控数据、用户行为等,针对这些数据流进行实时或批量采集汇总,然后进行大数据分析是当前互联网的必备技术,通过消息队列完成此类数据收集是最好的选择。

RabbitMq为什么牛逼?

AMQP协议

介绍RabbitMQ就必须先介绍AMQP协议,因为RabbitMQ是它的一种实现而已。

AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/中间件不同产品,不同的开发语言等条件的限制。

AMQP模型

1.Server(broker): 接受客户端连接,实现AMQP消息队列和路由功能的进程,可以理解为邮局。

2.Virtual Host:其实是一个虚拟概念,类似于权限控制组,一个Virtual Host里面可以有若干个Exchange和Queue,当多个不同的用户使用同一个RabbitMQ server提供的服务时,可以划分出多个vhost,每个用户在自己的vhost创建exchange/queue等,就好比于tomcat中webapps目录下可以部署多个web项目。

3.Exchange:接受生产者发送的消息,并根据Binding规则将消息路由给服务器中的队列,就好比邮递员。

4.Message Queue:消息队列,用于存储还未被消费者消费的消息,就好比于邮箱。

5.Message: 由Header和Body组成,Header是由生产者添加的各种属性的集合,包括Message是否被持久化、由哪个Message Queue接受、优先级是多少等,就好比于邮箱里面的信件。而Body是真正需要传输的APP数据,就像信件里面的信纸。

6.Binding:Binding联系了Exchange与Message Queue。Exchange在与多个Message Queue发生Binding后会生成一张路由表,路由表中存储着Message Queue所需消息的限制条件即Binding Key。当Exchange收到Message时会解析其Header得到Routing Key,Exchange根据Routing Key与Exchange Type将Message路由到Message Queue。Binding Key由Consumer在Binding Exchange与Message Queue时指定,而Routing Key由Producer发送Message时指定,两者的匹配方式由Exchange Type决定,就好比于邮件上面的地址。

7.Connection:连接,对于RabbitMQ而言,其实就是一个位于客户端和Broker之间的TCP连接。

8.Channel:信道,仅仅创建了客户端到Broker之间的连接后,客户端还是不能发送消息的。需要为每一个Connection创建Channel,AMQP协议规定只有通过Channel才能执行AMQP的命令。一个Connection可以包含多个Channel。之所以需要Channel,是因为TCP连接的建立和释放都是十分昂贵的,如果一个客户端每一个线程都需要与Broker交互,如果每一个线程都建立一个TCP连接,暂且不考虑TCP连接是否浪费,就算操作系统也无法承受每秒建立如此多的TCP连接,可以简单的理解为线程池中的一个个线程。

下图是简单的对比图:

如果大家对于 各个主流Mq的 对比想要做深入研究

可以去这个地址看下

springboot集成RabbitMq

如果你像我一样没有 rabbitMq 环境的话

可以在这个网站下载

http://www.erlang.org/downloads

或者是 我为大家准备的百度云盘

因为 rabbitmq 需要依赖 erlang 环境

所以你安装完了以后 还需要 配置ERLANG_HOME环境变量

然后你就需要去下载RabbitMq了

下载地址

安装完成以后 我们来到这个目录

然后 我们安装一个 管理界面插件

命令如下 :rabbitmq-plugins enable rabbitmq_management

然后你就可以访问这个 界面了

初始用户名、密码 :guest/guest

我们新建一个用户 admin | 123456 用于我们程序演示代码

springboot 官方就已经支持了 RabbitMq

我们需要用上的话

要引入pom依赖

测试Mq 需要有 消息产出 消息消费

因此我们需要新建立两个项目

mq-producer

mq-consumer

使用集成工具构建

总的一个结构是这样的

在你新建多个 springboot项目的时候

IDEA会提示你 使用 spring dashboard

你点击确认显示

这样就比较好统一管理了

然后就是在 各自的 application.properties 中配置相关参数了

spring.application.name=mq-producer
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=admin
spring.rabbitmq.password=123456

接着我们就开始写我们的程序

这块我建议大家看我的视频

https://www.bilibili.com/video/av35595465/

给你截图 看下运行结果吧

结束语

如果大家对于这里比较感兴趣的话

可以去B站查看我的视频讲解

https://www.bilibili.com/video/av35595465/

或者是在 github下载源码

https://github.com/ibywind/springboot-learn

猜你喜欢

转载自blog.csdn.net/qq_31922571/article/details/84873405
今日推荐