一、什么是RabbitMQ?
1.1简介
RabbitMQ是一个广泛使用的消息服务器,采用Erlang语言编写,是一种开源的实现 AMQP(高级消息队列协议)的消息中间件。
AMQP协议(http://www.amqp.org),即 Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。
RabbitMQ最早是起源于金融系统,它的性能及稳定性都非常的好。
1.2RabbitMQ相关网址
官网:RabbitMQ: One broker to queue them all | RabbitMQ
Github:RabbitMQ · GitHub
1.3消息中间件
简单来说,消息中间件就是指保存数据的一个容器(服务器),可以用于两个系统之间的数据传递。
消息中间件一般有三个主要角色:生产者、消费者、消息代理(消息队列、消息服务器)。
工作流程主要是生产者发送消息到消息服务器,然后消费者从消息代理(消息队列)中获取数据并进行处理。
1.4常用的消息中间件
- RabbitMQ
- kafka(大数据领域)
- RocketMQ(阿里巴巴开源)献给Apache组织,使用java开发的
- pulsar
二、MQ的应用场景
2.1异步处理
下订单业务
同步:下订单-->加积分-->发红包-->发手机短信-->发优惠券
异步:下订单--->向MQ 发消息-->积分系统,红包系统,手机短信系统,优惠券系统接收消息
同步是阻塞的(会造成等待),异步是非阻塞的(不会等待)。
大流量高并发请求、批量数据传递,就可以采用异步处理,提升系统吞吐量。
2.2系统解耦
多个系统之间,不需要直接交互,通过消息进行业务流转。
2.3流量削峰
高负载请求/任务的缓冲处理
2.4日志处理
主要是用kafka这个服务器来做。
日志处理是指将消息队列用于在日志处理中,比如用Kafka解决大量日志传输的问题;
ELK(Elastic search+Logstash+Kibana) 日志处理解决方案:
loger.error(......) -->Logstash收集消息--> 发送消息的kafka --> Elastic search(es) -->Kibana(可视化)================>ELK日志处理平台
三、RabbitMQ运行环境搭建
RabbitMQ是使用Erlang语言开发的,所以要先下载安装Erlang
3.1Erlang及RabbitMQ安装版本的选择
下载时一定要注意版本兼容问题
版本兼容说明地址:Erlang Version Requirements | RabbitMQ
3.2下载Erlang
Erlang官网:Index - Erlang/OTP
Linux下载命令如下:
wget https://github.com/erlang/otp/releases/download/OTP-25.2.3/otp_src_25.2.3.tar.gz
说明:wget 是Linux命令,可以用来下载软件
如果wget没安装可以先安装一下wget
yum install wget
3.3安装Erlang
3.3.1先安装Erlang的Linux依赖库
yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel
说明:yum -y install 安装linux的一些依赖库的命令 ,-y表示自动确认;
3.3.2解压Erlang安装包文件
tar -xvzf otp_src_25.2.3.tar.gz
3.3.3配置
切换到解压目录下
cd otp_src_25.2.3
运行配置命令
./configure
3.3.4编译
make
3.3.5安装
make install
安装好了Erlang后可以将解压的目录删除:
# 删除解压目录,-r代表递归删除 -f 强制删除,强制删除就不会提示
rm -rf otp_src_25.2.3
3.3.6验证Erlang是否安装成功
# 终端输入erl,如果进入了编程命令行则表示安装成功
erl
#然后按ctrl + z 退出编程命令行
3.4下载RabbitMQ
从RabbitMQ官网找到下载链接:https://www.rabbitmq.com
Linux:下载3.11.15
wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.11.15/rabbitmq-server-generic-unix-3.11.15.tar.xz
generic 是通用的意思,这个版本也就是通用的unix版本
3.5安装RabbitMQ
解压RabbitMQ的压缩包,即安装完成,无需再编译
tar -xvf rabbitmq-server-generic-unix-3.11.15.tar.xz -C /usr/local/
说明 -C 是指定解压目录,如果不指定会解压到当前目录
到此,rabbitmq就安装好了。
四、启动及停止RabbitMQ
4.1启动RabbitMQ
切换到安装目录的sbin目录下:
#启动
./rabbitmq-server -detached
说明:-detached 选项为后台启动运行rabbitmq;不加该参数表示前台启动;
rabbitmq的运行日志存放在rabbitmq安装目录的var目录下;
现在的目录是:/usr/local/rabbitmq_server-3.11.15/var/log/rabbitmq
4.2查看RabbitMQ的状态
切换到sbin目录下执行:
./rabbitmqctl -n rabbit status
说明:-n rabbit 是指定节点名称为rabbit,目前只有一个节点,节点名默认为rabbit
注意:此处-n rabbit 也可以省略
4.3停止RabbitMQ
切换到sbin目录下执行:
./rabbitmqctl shutdown
4.4配置path环境变量
vi /etc/profile
将以下代码加入进去
RABBIT_HOME=/usr/local/rabbitmq_server-3.11.15
PATH=$PATH:$RABBIT_HOME/sbin
export RABBIT_HOME PATH
编辑后保存退出(:wq)
:wq
刷新环境变量,命令如下
source /etc/profile
配置环境变量后就可以在任何目录下使用rabbitmq下sbin目录中的命令了
五、RabbitMQ的管理命令
rabbitmqctl 是一个管理命令,可以管理rabbitmq的很多操作。
rabbitmqctl help可以查看一下有哪些操作
查看具体子命令 可以使用 rabbitmqctl help 子命令名称
5.1用户管理
用户管理包括增加用户,删除用户,查看用户列表,修改用户密码。
这些操作都是通过rabbitmqctl管理命令来实现完成。
查看帮助:
rabbitmqctl help add_user
查看当前用户列表
rabbitmqctl list_users
新增一个用户
语法:rabbitmqctl add_user Username Password
示例: rabbitmqctl add_user root 123456789
5.2设置用户角色
rabbitmqctl set_user_tags User Tag
示例:rabbitmqctl set_user_tags root administrator
说明:此处设置admin用户的角色为管理员角色
5.3设置用户权限
查看用户权限
rabbitmqctl list_permissions
设置用户权限
rabbitmqctl set_permissions -p / root ".*" ".*" ".*"
说明:此操作是设置root用户拥有操作虚拟主机/下的所有权限
参考页面:Authentication, Authorisation, Access Control | RabbitMQ
六、Web管理后台
Rabbitmq有一个Web管理后台,这个管理后台是以插件的方式提供的,启动后台Web管理功能
6.1启动管理后台
# 查看rabbitmq 的插件列表
rabbitmq-plugins list
#启用插件rabbitmq_management
rabbitmq-plugins enable rabbitmq_management
#禁用插件rabbitmq_management
rabbitmq-plugins disable rabbitmq_management
6.2防火墙操作
# 检查防火墙状态
systemctl status firewalld
# 关闭防火墙,Linux重启之后会失效
systemctl stop firewalld
# 防火墙置为不可用,Linux重启后,防火墙服务不自动启动,依然是不可用
systemctl disable firewalld
注意生产环境禁止这样做,生产环境只能开放某些端口,比如web管理界面只需开放15672端口
#开放15672端口
sudo firewall-cmd --zone=public --add-port=15672/tcp --permanent
#刷新
sudo firewall-cmd --reload
#查看是否成功开放
sudo firewall-cmd --list-all
6.3访问Web管理后台
http://你的ip地址:15672
用户名/密码为我们上面创建的root/123456789
备注:如果使用默认用户guest、密码guest登录,会提示User can only log in via localhost
说明:guest用户只能从localhost本机(虚拟机)登录,所以不要使用该用户。
6.4通过Web页面创建虚拟主机
新建虚拟主机spike,参见下图
建完后如下图
七、RabbitMQ工作模型
比喻:rabbitmq和mysql作比喻:
- broker 相当于mysql服务器
- virtual host相当于数据库(一个mysql服务器可以有多个数据库,一台broker可以有多个虚拟主机)
- queue相当于表(一个数据库有多张表,一个虚拟主机有多个队列)
- 消息相当于记录(一张表中有多条记录,一个队列中有多条消息)
消息队列有三个核心要素: 消息生产者、消息队列、消息消费者;
生产者(Producer):发送消息的应用;(java程序,也可能是别的语言写的程序)
消费者(Consumer):接收消息的应用;(java程序,也可能是别的语言写的程序)
代理(Broker):就是消息服务器,RabbitMQ Server就是Message Broker;
连接(Connection):连接RabbitMQ服务器的TCP长连接;
信道(Channel):连接中的一个虚拟通道,消息队列发送或者接收消息时,都是通过信道进行的;
虚拟主机(Virtual host):一个虚拟分组,在代码中就是一个字符串,当多个不同的用户使用同一个RabbitMQ服务时,可以划分出多个Virtual Host,每个用户在自己的Virtual Host创建exchange/queue等;(分类比较清晰、相互隔离)
交换机(Exchange):交换机负责从生产者接收消息,并根据交换机类型分发到对应的消息队列中,起到一个路由的作用;
路由键(Routing Key):交换机根据路由键来决定消息分发到哪个队列,路由键是消息的目的地址;
绑定(Binding):绑定是队列和交换机的一个关联连接(关联关系);
队列(Queue):存储消息的缓存;
消息(Message):由生产者通过RabbitMQ发送给消费者的信息;(消息可以为任何数据,字符串,user对象,json串,图片,视频等等)