消息队列专题(进阶篇):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 作为消息通信的模型,目前有两种主流实现方式:AMQPJMS

两者间的区别和联系:

  • 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:路由键,交换机通过路由键来决定分发消息到哪个队列,可以看作是消息的目的地址;

协同工作流程:

  1. 消息生产者 Producer 连接 RabbitMQ 的 Broker,创建 connection,开启 channel 通道;
  2. 生产者 Consumer 通过通道声明 Exchange 交换机的类型、名称等;
  3. 生产者 Consumer 发送消息,并指定消息是否持久化等属性和 Routing Key;
  4. Exchange 交换机收到消息后,根据 Routing Key 路由到和当前交换机绑定的匹配队列里;
  5. 消费者监听接收到消息后,发送 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
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 的集群架构模式

消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费

消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费

消息队列专题(高级特性篇):RabbitMQ 如何保证消息的可靠性投递传输和消费

中间件面试专题:RabbitMQ高频面试问题