消息队列专题(进阶篇):RabbitMQ 介绍与环境搭建
Posted 盛夏温暖流年
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列专题(进阶篇):RabbitMQ 介绍与环境搭建相关的知识,希望对你有一定的参考价值。
之前写过一篇博客简单介绍了消息队列的基础知识,当时立下了 Flag,说好下次会专门介绍 RabbitMQ,说到做到,前来填坑。
消息队列入门基础篇博客链接如下:
https://blog.csdn.net/j1231230/article/details/119180550
什么是 RabbitMQ
RabbitMQ 是实现了高级消息队列协议(AMQP)的面向消息的中间件。RabbitMQ 服务器使用 Erlang 语言编写,是一种应用程序之间的通信方法,在分布式系统开发中应用非常广泛。
上面提到了高级消息队列协议(AMQP),它的介绍如下:
AMQP 是一个具有现代特征的二进制协议,也是一个提供统一消息服务的应用层标准高层消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
AMQP 和 JMS
MQ 作为消息通信的模型,目前有两种主流实现方式:AMQP 和 JMS。
两者间的区别和联系:
-
JMS 是通过定义统一的接口来对消息进行统一操作;AMQP是通过规定协议来统一数据交互的格式;
-
JMS 限定了必须使用 Java 语言;AMQP 只是协议,不规定实现方式,因此是跨语言的;
-
JMS 规定了两种消息模型;而 AMQP 的消息模型更加丰富;
通过比较可以发现,AMQP 的统一数据交互格式更加优雅,支持跨语言,同时还支持更丰富的消息模型,所以 RabbitMQ 采用 AMQP 的实现方式也是很合理的。
RabbitMQ 的优势(为什么选择 RabbitMQ)
发展前景角度:
- 有商业化的运营,不会轻易死掉;
- 遵循 AMQP 协议,不会被绑架;
- 强大的社区支持,为技术进步提供动力;
- 大量成功的应用案例,例如阿里、网易等互联网巨头都有使用;
技术角度:
- Erlang 开发,是 AMQP 的最佳搭档,在支持持久化的消息队列中性能相对优秀;
- 支持消息持久化、消息确认机制、灵活的任务分发机制等,功能丰富;
- 可靠性高;
- 集群扩展容易,并且可以通过增加节点实现成倍的性能提升;
RabbitMQ 的工作原理
RabbitMQ 的基本结构如下所示:
组成部分介绍:
Broker:消息队列的服务进程,包括两个部分:Exchange 和 Queue;
Exchange:消息队列交换机,按一定的规则将消息路由转发到某个队列;
Queue:消息队列,用来存储消息;
Producer:消息生产者,即生产方客户端,负责发送消息;
Consumer:消息消费者,即消费方客户端,负责接收 MQ 转发的消息;
其中,比较重要的组成部分是 Exchange,它主要分为 4 个类型,下图中列出了常用的 3 个:
直接(Direct):直接交换机通过消息上的路由键直接对消息进行分发。
扇出(Fanout):一个扇出交换机会将消息发送到所有和它进行绑定的队列上。
主题(Topic):这个交换机会将路由键和绑定上的模式进行通配符匹配。
消息头(Headers):消息头交换机使用消息头的属性进行消息路由,这一种类型官方 demo 没有过多解释。
还有两个重要的概念需要我们了解:
Binding:绑定,是队列和交换机的一个关联连接;
Routing Key:路由键,交换机通过路由键来决定分发消息到哪个队列,可以看作是消息的目的地址;
协同工作流程:
- 消息生产者 Producer 连接 RabbitMQ 的 Broker,创建 connection,开启 channel 通道;
- 生产者 Consumer 通过通道声明 Exchange 交换机的类型、名称等;
- 生产者 Consumer 发送消息,并指定消息是否持久化等属性和 Routing Key;
- Exchange 交换机收到消息后,根据 Routing Key 路由到和当前交换机绑定的匹配队列里;
- 消费者监听接收到消息后,发送 ACK 进行消息确认,进行业务处理;
RabbitMQ 的环境搭建
1.查看 RabbitMQ 对应的 Erlang 安装包版本并下载
RabbitMQ 依赖于 Erlang 环境,所以需要先安装 Erlang,要注意二者之间的版本依赖,先选择需要的 RabbitMQ 版本,再去下载 RabbitMQ 依赖的对应版本的 Erlang。
RabbitMQ 下载链接:
https://github.com/rabbitmq/rabbitmq-server/releases
比如选择 RabbitMQ 3.8.4 的话,可以下载 Erlang 22.3 版本,如下图所示。
2.下载与配置指定版本的 Erlang
我们这里需要下载 Erlang 22.3 版本,链接如下:
https://www.erlang.org/downloads
从官方网站下载是常规流程,但是真正实践的时候发现下载速度超级慢,建议从网上直接找资源下载,以下是我找到的 Erlang 下载路径:
otp_src_22.3.tar.gz
网盘链接:https://pan.baidu.com/s/1Q74OmyTujDSp-7QYpl1Ajg
提取码 :2460
将下载好的 Erlang ,上传到 Linux 服务器上,建议上传到 /usr/local 路径下。
安装步骤如下:
# 解压 erlang 文件
tar -zxvf otp_src_22.3.tar.gz
# 安装 erlang 依赖工具
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel
# 在当前文件 /usr/local 下,新建 erlang 文件夹
mkdir erlang
# 进入到 otp_src_22.3 里
cd otp_src_22.3
# 执行安装环境, 注意 --prefix=是你需要安装在那个文件夹里,一定是自己创建的空文件夹
./configure --prefix=/usr/local/erlang --without-javac
# 执行完后预安装,安装到上面配置的 --prefix=文件夹内
make && make install
# 测试是否安装成功
./bin/erl
输入后,出现如下内容:
我们可以执行命令,查看是否有效:
io:format("hello world~n", []).
显示如下结果,表示 erlang 安装成功:
配置环境变量:
vim /etc/profile
配置内容:
export ERLANG=/usr/local/erlang
export PATH=$PATH:$ERLANG/bin
刷新配置并验证:
# 刷新环境配置
source /etc/profile
# 直接输入 erl
[root@hua otp_src_24.0]# erl
若是可以进入以下效果,表示环境变量配置成功:
3.下载与配置 RabbitMQ 3.8.4
如果是 Linux 操作系统,就选择这个版本进行下载:
将下载好的 RabbitMQ 3.8.4 上传到 Linux 服务器上,建议上传到 /usr/local 路径下。
安装步骤:
# 解压安装 xz
xz -d rabbitmq-server-generic-unix-3.8.4.tar.xz
# 解压安装 tar
tar -xvf rabbitmq-server-generic-unix-3.8.4.tar
# 重命名 rabbitmq
mv rabbitmq_server-3.8.4/ rabbitmq
# 配置环境变量
vim /etc/profile
添加如下配置内容:
export RABBITMQ=/usr/local/rabbitmq
export PATH=$PATH:$RABBITMQ/sbin
刷新配置:
source /etc/profile
执行初始化命令:
# 安装页面管理插件
rabbitmq-plugins enable rabbitmq_management
# 开启服务,后台运行
rabbitmq-server -detached
# 注:添加用户和权限都要先开启 RabbitMQ 服务
# 页面管理,用户 guest 是不能使用的,手动创建一个用户,并赋予权限
rabbitmqctl add_user admin admin
# 添加权限 .* 表示最高权限/所有权限
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
# 添加用户名角色,这里添加为 administrator (系统管理员)
rabbitmqctl set_user_tags admin administrator
# 以上修改必须重启
rabbitmq-server restart
如果重启失败,可以手动把之前的进程 kill 掉再启动:
查找占用端口对应的 pid,直接 kill 掉就可以:
4.测试访问
需要在自己的服务器上把对应的防火墙端口放开,否则是无法访问的,在浏览器上输入以下地址进行访问:
http://你的服务器ip地址:15672/
出现登录界面后,输入刚刚我们设置的用户名和密码:
界面显示如下,配置完成!
下一篇博客将进入消息队列专题的实战篇,会介绍 SpringBoot 与 RabbitMQ 的整合,新的 Flag 又立下了,待实现。
参考资料如下,非常感谢:
https://www.cnblogs.com/wyt007/p/9073154.html
https://blog.csdn.net/kavito/article/details/91403659
https://blog.csdn.net/yehongzhi1994/article/details/107593283
https://www.cnblogs.com/chenkeer/p/15239743.html
以上是关于消息队列专题(进阶篇):RabbitMQ 介绍与环境搭建的主要内容,如果未能解决你的问题,请参考以下文章
消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费
消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费