RabbitMQ 是一个开源的消息代理和队列服务器,用来通过普通协议在完全不同的应用之间共享数据(这句话的含义就是可以跨平台,跨语言的)
RadditMQ 是使用Erlang语言来编写的
并且RabbitMQ是基于AMQP协议的
什么是AMQP高级消息队列协议?
AMQP全称:Advanced Message Queuing Protocol(中文:高级消息队列协议)
AMQP定义:具有现代特征的二进制协议,是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
AMQP核心概念
Server:又称Broke;它接收客户端的连接,实现AMQP实体服务,Broker:简单来说就是消息队列服务器实体
Connection:连接;它是应用程序与Broker的网络连接
Channel:网络信道; 几乎所有的操作都在Channel中进行(比如你做一个消息的流转,都需要用到这个Channel,比如说你MQ服务做一些管理性的操作,如清空队列中的消息,删除某个队列,删除一个ExChange,添加用户等),Channel是进行消息读写的通道,客户端可以建立多个Channel,每个Channel代表一个会话任务
Message:消息; 服务器和应用程序之间传送的数据,由Properties和Body组成,Properties可以对消息进行修饰,比如消息的优先级,延迟等高级性能;Body则就是消息体内容
Virtual host:虚拟地址; 用于进行逻辑隔离,最上层的消息路由,一个Virtual Host里面可以有若干个ExChange 和Queue,同一个Virtual Host里面不能有相同名称的Exchange或Queue
RabbitMQ为什么要设置这个Virtual host呢?比如说以后你可能有多个应用服务的开发(例如有A,B两个应用服务) A服务我们可以将消息路由到/VirtualHost/A 这个层次上,B服务我们可以将消息路由到/VirtualHost/B这个层次上
简单来讲:每个VirtualHost相当月一个相对独立的RabbitMQ服务器,每个VirtualHost之间是相互隔离的。exchange、queue、message不能互通。 相当于mysql的db
Exchange:交换机,接收消息,根据路由键转发西消息到绑定的队列
Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key
Routing key:一个路由规划,虚拟机可以用它来确定如何路由一个特定消息 (可以这样理解:生产者想发送一条消息到指定的Queue队列中,首先这条消息会Exchange接收到,因为Exchange与queue是进行了绑定,这个绑定指定了RoutingKey(路由名称),这时候Exchange就会通过这个路由名称,来找到指定的Queue,然后将消息保存到Queue中)
Queue:也称为Message Queue 消息队列,用于保存消息并将它们转发给消费者
打开Linux终端 (管他三七二十一,我们先对软件源列表更新下,防止安装软件的时候出现无法定位软件包的问题)
sudo apt-get update
这个命令,会访问源列表里的每个网址,并读取软件列表,然后保存在本地电脑。我们在新立得软件包管理器里看到的软件列表,都是通过update命令更新的。update后,可能需要upgrade一下。
sudo apt-get upgrade
这个命令,会把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示你更新。如果你的软件都是最新版本。
总而言之,update是更新软件列表,upgrade是更新软件
由于RabbitMQ需要Erlang语言的支持,在安装rabbitMq之前需要安装Erlang语言包
apt-get install erlang-nox # 安装Erlang
erl # 查看Erlang语言版本,成功执行则说明Erlang安装成功
当我们只想erl命令的时候,可能不知道怎么返回到命令行,这时候按Ctrl+C,就会弹出如下截图内容,然后在下面输入一个a就可以返回到命令行了
sudo wget -O- https://www.rabbitmq.com/rabbitmq-release-signing-key.asc | sudo apt-key add -
sudo apt-get update
sudo apt-get install rabbitmq-server
安装完成后检查,查看下RabbitMQ状态
systemctl status rabbitmq-server #Active: active (running) 说明处于运行状态
# service rabbitmq-server status 用service指令也可以查看,同systemctl指令
#当然我们也可以用 下面命令查看RabbitMQ的情况
ps -ef|grep rabbit
rabbitmq-plugins enable rabbitmq_management # 启用插件
service rabbitmq-server restart # 重启
sudo rabbitmqctl add_user admin 123456 # 增加普通用户 admin是我设定的用户名,123456是我设定的密码
添加用户后,我们也可以用下面的命令来查看我们rabbitmq下面的所有用户
sudo rabbitmqctl list_users
sudo rabbitmqctl set_user_tags admin administrator # 给admin这个用户分配超级管理员角色
角色名有这几种:administrator,monitoring,policymaker,management,或其他自定义名称
administrator:超级管理员;可登陆管理控制台,可查看所有的信息,并且可以对用户,策略(policy)进行操作。
monitoring:监控者;可登陆管理控制台,同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
policymaker:策略制定者;可登陆管理控制台, 同时可以对policy进行管理。但无法查看节点的相关信息
management:普通管理者;仅可登陆管理控制台,无法看到节点信息,也无法对策略进行管理。
其他:无法登陆管理控制台,通常就是普通的生产者和消费者
sudo rabbitmqctl set_permissions -p VHostPath User ConfP WriteP ReadP
例子1:
sudo rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" #注:admin是我的用户名,三个".*"中间用空格分开,别挨着 ; 这段命令意思是为虚拟地址为/ 下的admin用户分配权限
例子2:
sudo rabbitmqctl set_permissions -p "/vhost001" admin ".*" ".*" ".*" #注:这段命令意思是为虚拟地址为/vhost 下的admin用户分配权限
注:ConfP:表示配置权限 WriteP:表示只读权限 ReadP:表示只读权限
注:VHostPaht是虚拟地址,假设我们创建了/vhost001这个虚拟地址,又创建了admin这个用户,我们可以把这个admin添加到这个/vhost001的虚拟地址下(一个用户可以添加到多个虚拟地址下),我们可以根据虚拟地址来为用户分配权限
例如:在 / 这个虚拟地址下我们可以为 admin用户 分配只读权限,而在 /vhost001这个虚拟地址下,我们可以为admin分配所有权限,这样的话admin这个用户在 /vhost001这个虚拟地址下就可以配置,也可以写,也可以读了。
注意,根据个人经验 只有授权后外网才能访问,之前用.net连接乌班图中的Rabbitmq,就因为这个问题折腾了一天都没有连接上
此时RabbitMQ就已经安装好了,并为它添加了一个名字为admin的普通用户,并为这个用户分配了管理员角色
这时候我们就可以浏览器上输入:http://127.0.0.1:15672 来访问你的rabbitmq监控页面。使用刚刚添加的新用户登录浏览器上输入。使用刚刚添加的用户admin用户,用123456这个密码进行登录
sudo rabbitmqctl start_app 启动用用
sudo rabbitmqctl stop_app 关闭应用
sudo rabbitmqctl status 节点状态
sudo rabbitmqctl add_user username password 添加用户 例子:sudo rabbitmqctl add_user admin 123456 添加一个名字为admin的用户,密码为123456
sudo rabbitmqctl delete_user username 删除用户 例子:sudo rabbitmqctl delete_user admin 删除名字为admin的用户
sudo rabbitmqctl change_passowrd username password 修改用户密码 例子:sudo rabbitmqctl change_passowrd admin 456789 将admin用户的密码修改为456789
sudo rabbitmqctl set_permissions -p vhostpath username ".*" ".*" ".*" 设为用户权限 例子sudo rabbitmqctl set_permissions -p vhostpath admin ".*" ".*" ".*" 设置admin用户具有最大权限
sudo rabbitmqctl clear_permissions -p vhostpath username 清除用户权限 例子:sudo rabbitmqctl clear_permissions -p vhostpath admin 清除admin这个用户的所有权限
sudo rabbitmqctl list_users 查看所有的用户
sudo rabbitmqctl add_vhost vhostpath 创建虚拟主机,注:vhostpath就是虚拟主机的的名称路径;例子:sudo rabbitmqctl add_vhost /test001 创建名字test001的虚拟主机,虚拟主机的路径为/test001 在Rabbitmq中默认的虚拟主机名称路径为/
sudo rabbitmqctl delete_vhost vhostpath 删除虚拟主机 例子sudo rabbitmqctl delete_vhost /test001 删除名称路径为/test的虚拟主机
sudo rabbitmqctl list_vhosts 查看所有的虚拟主机
sudo rabbitmqctl list_permissions -p vhostpath 查看虚拟主机上所有的权限
例子1:sudo rabbitmqctl list_permissions -p / 查看徐您主机名称路径为 /的所有权限
例子2:sudo rabbitmqctl list_permissions -p /test001 查看徐您主机名称路径为 /test001的所有权限
sudo rabbitmqctl -p vhostpath purge_queue queuename 清除队列里的消息
例子1:sudo rabbitmqctl -p / purge_queue queuen001 清除虚拟主机中名称路径为 / 中名称为queuen001队列里中的所有消息
例子1:sudo rabbitmqctl -p /vhost001 purge_queue queuen001 清除虚拟主机中名称路径为 /vhost001 中Queue队列名称为queuen001中的所有消息
sudo rabbitmqctl list_queues 查看所有队列信息
命令行与管控台的高级操作
sudo rabbitmqctl reset 移除rabbitmq所有的数据:注意需要在rabbitmqctl stop_app之后才能使用 即:在关闭rabbitmq应用后才能操作
sudo rabbitmqctl join_cluster [--ram] 组成集群命令
解释:以后我们要组成Rabbitmq集群环境的构建,我们想几个节点组成一个集群,就可以用这个命令
[--ram]的意思是 当你加入节点的时候,可以指定这个节点存储的模式是ram ,ram就是一个内存级别的存储(即:我们的数据都落在内存上)如果是[--disc]表示磁盘存储模式(即:我们的数据都落在磁盘上) 默认就是磁盘存储模式
sudo rabbitmqctl cluster_status 查看集群状态
sudo rabbitmqctl change_cluster_node_type disc| ram 修改集群节点的存储模式 (比如我们在刚刚加入集群节点的时候,如果我忘记了这个节点的存储模式,我们就可以通过这个命令来修改)
sudo rabbitmqctl forget_cluster_node [--offline] 忘记节点或者叫 摘除节点 (很有意义的)
例如:以后我们做rabbitmq集群的时候,集群在运行一段时间后发现有些节点可能启动不起来了(有可能宕机了),我们就可以通过这个命令将那些启动不起来的节点给"忘记掉" 或者说给"摘除掉" 这就是最简单的故障转移
sudo rabbitmqctl rename_cluster_node oldnodeName newnodeName 修改节点名称
如果我们在,启动,或者重启的时候遇到如下错误,就证明我们的RabbitMQ服务已经存在了(这个问题是一个很常见的问题,出现这个错误的问题可能是我们之前已经安装过RabbitMq,然后删除的时候没有正常的卸载,或者说之前已经启动过RabbitMq服务了)
ERROR: node with name "rabbit" already running on "fanbin-VirtualBox"
我们来解决下这个问题
我们在输入如下命令
sudo ps -ef | grep rabbitmq #这条语句的作用是查看含有"rabbitmq"的活动进程
杀死Rabbitmq的后台守护进程后,我们再来重启我们的Rabbitmq服务,就可以正常启动了
sudo rabbitmq-server start & #注:&表示后台启动
在RabitMq安装完成后,它里面的默认用户guest是禁止远程访问的(当然我们手动添加的其他用户也是一样禁止远程访问的),我们在.net,或者java下用这个用户来连接RabbitMQ,是连接不成功的,要想允许我们的用户允许远程访问就需要在配置文件下将loopback_users里面的<<"">>号去掉 改成{loopback_users,[guest]} 可以用vi修改
它的核心配置文件在usr目录下
路径是: /usr/lib/rabbitmq/lib/rabbitmq_server-3.5.7/ebin/rabbit.app 它就是Rabbitmq的核心配置文件,它是json格式的
{vsn,"3.5.7"}表示Rabbitmq的版本号
{env,[
{tcp_listeners,[5672]}, //表示rabbitmq监听的客户端,如果需要你可以在这里改成其他的端口号
//表示禁止guest用户远程访问,只有去掉中括号里面的尖括号和分号才能起开启guest用户远程访问
//即:改成:{loopback_users,[guest]},既然loopback_users的值是一个数组,那么我自然可以在这里面添加其他的用户,(注:在rabbitmq配置文件中<<>>其实就是禁用的意思,去掉<<>>就表示允许)
//假如我们rabbitmq下面有3个用户(guest,admin,fanbin)都需要远程访问,我们可以在这里配置成{loopback_users,[guest,admin,fanbin]}
{loopback_users,[<<"guest">>]},
]}