最近也是沉迷了一下MQ中间件的知识,决定整理一下并结合所学知识`整理到项目中去
不足之处欢迎留言交流
RabbitMQ介绍
RabbitMQ 作为目前应用相当广泛的消息中间件,在企业级应用、微服务应用中充当着重要的角色。特别是在一些典型的应用场景以及业务模块中具有重要的作用,比如业务服务模块解耦、异步通信、高并发限流、超时业务、数据延迟处理等。
特点
RabbitMQ除了像兔子一样跑的很快以外,还有这些特点:
- 开源、性能优秀,稳定性保障
- 提供可靠性消息投递模式、返回模式
- 与Spring AMQP完美整合,API丰富
- 集群模式丰富,表达式配置,HA模式,镜像队列模型
- 保证数据不丢失的前提做到高可靠性、可用性
MQ典型应用场景:
- 异步处理。把消息放入消息中间件中,等到需要的时候再去处理。
- 流量削峰。例如秒杀活动,在短时间内访问量急剧增加,使用消息队列,当消息队列满了就拒绝响应,跳转到错误页面,这样就可以使得系统不会因为超负载而崩溃。
- 日志处理
- 应用解耦。假设某个服务A需要给许多个服务(B、C、D)发送消息,当某个服务(例如B)不需要发 - 送消息了,服务A需要改代码再次部署;当新加入一个服务(服务E)需要服务A的消息的时候,也需要改代码重新部署;另外服务A也要考虑其他服务挂掉,没有收到消息怎么办?要不要重新发送呢?是不是很麻烦,使用MQ发布订阅模式,服务A只生产消息发送到MQ,B、C、D从MQ中读取消息,需要A的消息就订阅,不需要了就取消订阅,服务A不再操心其他的事情,使用这种方式可以降低服务或者系统之间的耦合。
AMQP协议和RabbitMQ
提到RabbitMQ,就不得不提AMQP协议。AMQP协议是具有现代特征的二进制协议。是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
先了解一下AMQP协议中间的几个重要概念:
-
Connection:连接,应用程序与Server的网络连接,TCP连接。
-
Channel:信道,消息读写等操作在信道中进行。客户端可以建立多个信道,每个信道代表一个会话任务。
-
Message:消息,应用程序和服务器之间传送的数据,消息可以非常简单,也可以很复杂。有Properties和Body组成。Properties为外包装,可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。
-
Virtual Host:虚拟主机,用于逻辑隔离。一个虚拟主机里面可以有若干个Exchange和Queue,同一个虚拟主机里面不能有相同名称的Exchange或Queue。
-
Exchange:交换器,接收消息,按照路由规则将消息路由到一个或者多个队列。如果路由不到,或者返回给生产者,或者直接丢弃。RabbitMQ常用的交换器常用类型有direct、topic、fanout、headers四种,后面详细介绍。
-
Binding:绑定,交换器和消息队列之间的虚拟连接,绑定中可以包含一个或者多个RoutingKey。
-
RoutingKey:路由键,生产者将消息发送给交换器的时候,会发送一个RoutingKey,用来指定路由规则,这样交换器就知道把消息发送到哪个队列。路由键通常为一个“.”分割的字符串,例如“com.rabbitmq”。
-
Queue:消息队列,用来保存消息,供消费者消费。
-
ExchangeType 交换机的种类
RabbitMQ消息模型的核心理念是
发布者(producer)不会直接发送任何消息给队列。事实上,发布者(producer)甚至不知道消息是否已经被投递到队列。
发布者(producer)只需要把消息发送给一个交换机(exchange)。交换机非常简单,它一边从发布者方接收消息,一边把消息推送到队列。交换机必须知道如何处理它接收到的消息,是应该推送到指定的队列还是是多个队列,或者是直接忽略消息。这些规则是通过交换机类型(exchange type)来定义的
1. 直接式交换器类型(Direct)
该类型的交换器将所有发送到该交换器的消息被转发到RoutingKey指定的队列中,也就是说路由到BindingKey和RoutingKey完全匹配的队列中。
2. 主题式交换金类型(Topic)
Topic Exchange:主题式交换器。通过消息的路由关键字和绑定关键字的模式匹配,将消息路由到被绑定的队列中。该类型的交换器将所有发送到Topic Exchange的消息被转发到所有RoutingKey中指定的Topic的队列上面。Exchange将RoutingKey和某Topic进行模糊匹配,其中“”用来匹配一个词,“#”用于匹配一个或者多个词。例如“com.#”能匹配到“com.rabbitmq.oa”和“com.rabbitmq”;而"com."只能匹配到“com.rabbitmq”。
3. 广播式交换机类型(Fanout)
Fanout Exchange:广播式路由键。该类型不处理路由键,会把所有发送到交换器的消息路由到所有绑定的队列中。优点是转发消息最快,性能最好。
4.Headers Exchange
该类型的交换器不依赖路由规则来路由消息,而是根据消息内容中的headers属性进行匹配。headers类型交换器性能差,在实际中并不常用。
理论知识了解后就是实战的整合
Linux下安装RabbitMQ
官方文档 :https://www.rabbitmq.com/install-rpm.html
RabbitMQ的安装需要Erlang的基础环境,必须按照RabbitMQ Erlang版本要求进行安装。
版本要求参照官网:https://www.rabbitmq.com/which-erlang.html
Erlang的版本下载地址:https://www.erlangsolutions.com/resources/download.html
下载下来后上传到对应的linux文件内 执行安装命令 :
rpm -ivh esl-erlang_19.3-1_centos_7_amd64.rpm --nodeps --force
安装
想要验证是否安装成功可以输入 erl -version
erl -version
会展示对应的版本号
接着可以安装rabbitmq
软件库:https://dl.bintray.com/rabbitmq/all/rabbitmq-server/
下载后上传 执行命令:
rpm -ivh rabbitmq-server-3.7.6-1.el6.noarch.rpm --nodeps --force
没有 --nodeps --force
的话 可能会有问题 加上后执行就好了
出现这种问题:
是mq和erlang版本没对应上
想要验证是否安装成功可以输入:rabbitmq-server
到此基本上rabbitmq的安装结束~
$ chkconfig rabbitmq-server on # 添加开机启动RabbitMQ服务
$ service rabbitmq-server start # 启动服务
$ service rabbitmq-server status # 查看服务状态
$ service rabbitmq-server stop # 停止服务
$ service rabbitmq-server restart # 重启服务
注意:rabbitmq从3.3.0开始禁止使用guest/guest权限通过除localhost外的访问。我们想要远程连接 需要修改配置 让他支持远程访问
# vi /etc/rabbitmq/rabbitmq.config
{loopback_users, []} 找到loopback_users进行处理
如果rabbitmq.config没找到
可以找到rpm安装的目录文件下的rabbit.app 对其做上面修改
开启web端管理访问 安装管理插件
$ rabbitmq-plugins enable rabbitmq_management
安装好后直接 访问虚拟机:http://port:15672/#/
guest/guest即可登录
我们也可以设置自己的用户:
相应的命令:
[root@VM_0_3_centos eureka]# rabbitmqctl add_user root 123456 //该命令创建一个用户
Adding user "root" ...
[root@VM_0_3_centos eureka]# rabbitmqctl set_user_tags root administrator //将用户添加为 administrator角色
Setting tags for user "root" to [administrator] ...
[root@VM_0_3_centos eureka]# service rabbitmq-server restart //重启 mq
Restarting rabbitmq-server (via systemctl): [ OK ]
[root@VM_0_3_centos eureka]# rabbitmqctl list_users //查看用户列表
Listing users ...
guest [administrator]
root [administrator]
[root@VM_0_3_centos eureka]# rabbitmqctl list_permissions -p / //查看vhost(/)允许哪些用户访问
Listing permissions for vhost "/" ...
root .* .* .*
guest .* .* .*
到此一个MQ的安装部署基本完成
由衷感谢这些文章参考
https://www.cnblogs.com/sgh1023/p/11217017.html
https://blog.csdn.net/bbwangj/article/details/82954097