消息中间件之RabbitMQ 快速入门

前言

快一年没有更新过博客了,这一年算是颓废的一年吧,时至今日,感觉自己还是一个小菜鸡,最近可能是常受打击,突然又想继续学习了,前面一段时间,想写一些博客,但是无从下手,不知道写什么,最近公司对rabbitmq的讨论多了一些,所以就来写一下rabbitmq吧,大家一起学习.若有写错的部分,麻烦各位大佬说一下.

什么是消息队列?

Message Queue(消息队列)简称MQ,是一种应用程序对应用程序的通信方法;通过消息传递队列发送和接收消息数据,支持应用程序,系统,服务和文件之间的信息交换。

什么是消息中间件?为什么要使用消息中间件?

举一个例子, 客户端向订单系统发送了一个下单的请求,下单成功的时候,库存系统也需要去商品库存数量的,但是我们客户端还在等待订单系统告诉他订单下单是否成功,订单系统是不关心你库存是否处理成功的,因为订单已经成功了(下单过程完成才会调用库存系统)才去更改库存,万一库存系统挂了,客户端就只能收到订单下单失败了….
客户端调用订单服务的时候需要同步的(必须要知道下单是否成功),但是订单系统和库存系统是可以异步的(订单只需要确定订单下单成功,不关系库存是否减掉)

我们先看看以前的流程:
在这里插入图片描述
客户端只需要知道订单的消息,但是这里 客户端等待的是订单服务和库存服务两个服务的消息.
耗时长不说,万一库存挂了还影响下单。

我们再来看一下开线程异步方式调用库存
在这里插入图片描述
现在好多了,时间降低了,客户端也不需要等待库存服务的处理结果了,并且库存服务报错还不影响下单,但是我们又要去管理线程池,代码耦合度严重。

我们看看下面这个如何?
在这里插入图片描述
我们用独立的一个系统来处理他们之间的消息,这样就完美解决哪些问题了。
这个消息服务就是 消息中间件,从上面这些图,也知道我们为什么要使用消息中间件了吧。

RabbitMq介绍&AMQP介绍

上面介绍了什么是消息中间件,那么RabbitMq就是对于消息中间件的一种实现,市面上还有很多很多实现, 比如RabbitMq、ActiveMq、ZeroMq、kafka,以及阿里开源的RocketMQ等等
我们这里主要讲解RabbitMq。

AMQP介绍

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

AMQP其实跟HTTP是一样的,只不过HTTP是针对网络传输,AMQP是基于消息队列的.

AMQP 协议中的基本概念

Broker: 消息队列服务器实体。
Server:接收客户端的连接,实现AMQP实体服务。
Connection:连接,应用程序与Server的网络连接,TCP连接。
Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。
Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
Queue:消息队列,用来保存消息,供消费者消费。

协议模型如下:
在这里插入图片描述
从上图中可以看出,AMQP 协议由三部分组成,生产者,服务端,消费者。

生产者是投递消息的一方,首先连接到Server,建立一个连接,开启一个信道;然后生产者声明交换器和队列,设置相关属性,并通过路由键将交换器和队列进行绑定。同理,消费者也需要进行建立连接,开启信道等操作,便于接收消息。

接着生产者就可以发送消息,发送到服务端中的虚拟主机,虚拟主机中的交换器根据路由键选择路由规则,然后发送到不同的消息队列中,这样订阅了消息队列的消费者就可以获取到消息,进行消费。最后关闭连接。

交换机(Exchange)常用类型

direct:这种类型的交换机的路由规则是根据一个routingKey的标识,交换机通过一个
routingKey与队列绑定 ,在生 产者生产消息的时候 指定一个routingKey 当绑定的队列的routingKey 与生产者发送的一样 那么交换机会吧 这个消息发送给对应的队列。
在这里插入图片描述
fanout:这种类型的交换机路由规则很简单,只要与他绑定了的队列, 他就会吧消息发送给对应队列(与routingKey 没关系)。优点是转发消息最快,性能最好。
在这里插入图片描述
topic:该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。

Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。打个比方 假设 我绑定的routingKey 有队列A和B ,A的 routingKey是:*.user ,B的routingKey是: #.user,那么我生产一条消息routingKey 为: error.user 那么此时 2个队列都能接受到, 如果改为 topic.error.user 那么这时候 只有B能接收到了
在这里插入图片描述
Headers:该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用,基本上没有应用场景,因为上面的三种类型已经能应付了。

RabbitMq介绍

RabbitMq 是一个开源的 基于AMQP协议实现的一个完整的企业级消息中间件,服务端语言由Erlang(面向并发编 程)语言编写 对于高并发的处理有着天然的优势,客户端支持非常多的语言:
Python
Java
Ruby
PHP
C#
JavaScript
Go
Elixir
Objective-C
Swift

在这里插入图片描述
RabbitMQ是基于AMQP协议实现的,其结构如上图所示,和AMQP协议简直就是一模一样。

主流MQ对比

在这里插入图片描述

RabbitMQ安装

我是使用的docker安装,这些也只会记录docker安装过程,其他方式可点击此处
首先下载镜像

docker pull rabbitmq:3-management

在这里插入图片描述
这样就下载成功了

接下来启动

docker run --name rabbimtmq2 -d -e RABBITMQ_DEFAULT_USER=root -e RABBITMQ_DEFAULT_PASS=123456 -p 15675:15672 -p 5675:5672 rabbitmq:3-management

在这里插入图片描述
启动成功了,上面稍微解释一下:
-d 后台启动
–name 指定容器名称
-e RABBITMQ_DEFAULT_USER 指定登陆用户名
-e RABBITMQ_DEFAULT_PASS 指定登陆密码
-p 映射端口 默认15672 我映射出去 15675端口

接着浏览器打开 http://localhost:15675 点击此处.快速传送
用户名 root 密码 123456 (默认用户名和密码是 guest ,此处我是指定了用户名和密码)

登陆成功后如下图:
在这里插入图片描述
页面操作太多,不做过多介绍啦,这里说一点,就是线上环境下一定要吧 guest用户(当然 guest这个用户只能本机才能登陆)删掉并且新加一个用户.

下一篇博客再来介绍一下集群的搭建以及常规使用,这一篇主要是记录一些基础概念,让心中有一个印象,如果觉得这篇文章对你有所帮助,那就用你发财的小手点个赞点个关注呗,万分感谢🙏

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值