大家好,这个系列我要介绍的是消息中间件RabbitMQ,消息中间件在高并发场景下能解决很多问题,在面试中也是比较常问的。现在消息中间件有很多种,比如ActiveMQ(JMS的实现)和RocketMQ等,而我选择RabbitMQ的原因也是觉得它更火吧,关于几大主流消息中间件的对比后面的文章再讲,今天就先入个门,从搭建环境讲起。
1、RabbitMQ简介
RabbitMQ的特性:
开源;
平台和供应商无关性:AMQP具有平台和供应商无关性,而RabbitMQ实现了AMQP,且RabbitMQ提供了几乎所有语言的客户端;
轻量级;
插件机制:比如利用插件直接将消息写入数据库;
安全:客户端可以使用SSL通信和客户端证书验证以提高安全性;可以使用插件与外部LDAP系统集成;
管理界面;
多种协议:除了AMQP协议,还支持MQTT、Stomp和XMPP等协议;
RabbitMQ使用Erlang语言自带的进程间通信(IPC)机制实现跨节点通信。
AMQP定义了三种抽象组件用于指定消息的路由行为:
交换器(Exchange):MQ中用于把消息路由到队列的组件;
队列(Queue):用来存储消息的数据结构,位于硬盘或内存中;
绑定(Binding):一套规则,用于告诉交换器消息应该被存储到哪个队列;
消息中间件一般有两种传递模式:
点对点模式:基于队列,队列使得消息可以异步传输;
发布订阅模式:基于主题,适用于一对多广播;
消息中间件作用:
解耦
(冗余)存储
扩展性
削峰
可恢复性
保证顺序性
缓冲
异步通信
2、安装erlang
由于RabbitMQ是用erlang编写的,所有首先要搭建erlang环境。这里我介绍一下在centos上通过yum方式安装erlang的方法。
第一步:添加yum源。
在目录 etc/yum.repos.d/ 下存储了yum常用的源,这里我们自己建立一个。
vi /etc/yum.repos.d/rabbitmq_erlang.repo
在这个文件中,写入下列内容。
[rabbitmq_erlang]
name=rabbitmq_erlang
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/$basearch
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
[rabbitmq_erlang-source]
name=rabbitmq_erlang-source
baseurl=https://packagecloud.io/rabbitmq/erlang/el/7/SRPMS
repo_gpgcheck=1
gpgcheck=0
enabled=1
gpgkey=https://packagecloud.io/rabbitmq/erlang/gpgkey
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
metadata_expire=300
第二步:安装。
yum install -y erlang
第三步:验证是否安装成功。
erl -version
如果上述方式不好使,那么还可以直接下载rpm文件进行安装。
wget --content-disposition https://packagecloud.io/rabbitmq/erlang/packages/el/7/erlang-23.3.1-1.el7.x86_64.rpm/download.rpm
yum -y install erlang-23.3.1-1.el7.x86_64.rpm/download.rpm
更多安装方式请参考 https://packagecloud.io/rabbitmq/
3、安装RabbitMQ
使用如下命令安装RabbitMQ。
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.14/rabbitmq-server-3.8.14-1.el7.noarch.rpm
yum -y install rabbitmq-server-3.8.14-1.el7.noarch.rpm
RabbitMQ默认的安装目录为/usr/lib/rabbitmq/lib。
安装好后,在/sbin目录下会有如下文件。

启动RabbitMQ。
systemctl start rabbitmq-server
RabbitMQ默认的TCP端口号是5672。
如果启动不了,可能与域名有关,需要在hosts文件中添加主机ip和主机名的映射。
vi /etc/hosts
RabbitMQ有一个非常美观的管理界面,不过需要手动开启。
rabbitmq-plugins enable rabbitmq_management
后台管理开启成功后,访问 http://ip:15672/,即可访问到管理界面。
默认的guest/guest用户只能通过本地主机登录,如下图所示。

因此我们添加一个后台管理员用户。
# 添加用户
rabbitmqctl add_user bobo ok
# 设置用户角色
rabbitmqctl set_user_tags bobo administrator
# 设置用户权限
rabbitmqctl set_permissions -p bobo '.*' '.*' '.*'
这里的授权命令格式如下所示。
rabbitmqctl set_permissions -p /vhost username conf write read
这个命令有几点我解释一下。
vhost,即VirtualHost,相当于一个相对独立的RabbitMQ服务器,每个vhost之间是相互隔离的;vhost可以理解为关系型数据库中的schema。RabbitMQ的权限是vhost级别的,而不是用户级别;
conf:可配置权限(队列和交换器的创建及删除等);
write:可写权限(发布消息);
read:可读权限(与消息有关的操作,包括读取消息及清空整个队列等);
关于交换器和队列的概念我后面的文章会介绍到。
用新用户登录RabbitMQ的管理界面,如下图所示。

rabbitmqctl 工具是用来管理RabbitMQ 中间件的命令行工具。
RabbitMQ Management插件不仅提供了Web管理界面,还提供了HTTP API接口来方便调用,具体的HTTP API请自行百度。
其它命令 。
# 查询所有用户
rabbitmqctl list_users
# 开启某个插件
rabbitmq-plugins enable xxx
# 关闭某个插件
rabbitmq-plugins disable xxx





