本文主要讲解以下内容:
本文针对的主要是RabbitMQ服务管理,可以当做一个命令手册进行查阅。在本文章开始之间,我们先通过Docker来简单启动一个RabbitMQ服务实例。
# 拉取镜像docker pull rabbitmq:management# 启动RabbitMQ服务实例,指定应用程序的访问和对外暴露端口为5672,WEB管理界面的访问和对外暴露端口为15672docker run -d -p 5672:5672 -p 15672:15672 --hostname rabbitmq001 --name rabbit001 rabbitmq:management# 进入容器docker exec -it rabbit001 /bin/bash
RabbitMQ中还有一个vhost(虚拟的消息服务器)的概念,这就好比虚拟机和物理机的关系。RabbitMQ服务中可以有多个vhost,每个vhost之间互相独立,数据保密,互不影响,有自己的权限控制。两个vhost中的队列和交换器不能互相绑定,队列和交换器的名称可以重复。
RabbitMQ有一个默认的vhost就是"/"。
# 创建新的vhost,{vhost_name}为新vhost的名称rabbitmqctl add_vhost {vhost_name}# 列出vhost的信息# [vhostinfoitem...]指的显示信息,有两个选项:name(默认值),tracing(表示是否使用RabbitMQ的Trace功能)rabbitmqctl list_vhosts [vhostinfoitem...]# 删除vhost,{vhost_name}为要删除的vhost的名称rabbitmqctl delete_vhost {vhost_name}
RabbitMQ中的权限是以vhost为单位控制的。当新建一个用户时,通常会被至少指派给一个vhost,而且只能访问被分配的vhost中的交换器、队列和绑定关系等。
# 设置权限rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}## 举两个列子## 为rabbitmq用户设置可以对名称为test_vhost的vhost下面的资源可配置,可写,可读rabbitmqctl set_permissions -p test_vhost rabbitmq ".*" ".*" ".*"## 为rabbitmq用户设置可以对名称为test_vhost的vhost下面的以order开头的资源可配置,所有资源可写,所有资源可读rabbitmqctl set_permissions -p test_vhost rabbitmq "^order.*" ".*" ".*"
# 列举vhost的权限信息,默认是"/"rabbitmqctl list_permissions [-p vhost]# 列举用户权限信息,{username}是用户名rabbitmqctl list_user_permissions {username}# 清除用户在vhost下面的权限rabbitmqctl clear_permissions [-p vhost] {username}
# rabbitmqctl工具标准语法rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]
RabbitMQ中,用户是访问控制的基本单元,每个用户可以跨vhost授权。
# 新增用户rabbitmqctl add_user {username} {password}# 修改用户密码rabbitmqctl change_password {username} {newpassword}# 验证用户密码rabbitmqctl authenticate_user {username} {password}# 删除用户 rabbitmqctl delete_user {username}# 列出所有用户,结果为用户名和用户TAGrabbitmqctl list_users
# 设置用户标签(tag)rabbitmqctl set_user_tags {username} {tag...}
tag主要有以下几种选项:
WEB管理其实就是一个网页,通过这个网页可以管理RabbitMQ,本质和命令上没有什么区别,默认访问端口号是15672,这里就不说了。如果不用docker安装,需要手动开启这个插件,命令如下:
rabbitmq-plugins enable rabbitmq_management
由于我是使用Docker镜像部署的,且使用的镜像是支持该插件的,容器内部使用的端口是15672,我暴露出来的对外访问的端口也是15672。
主要包括关闭、重置、开启服务等信息。
# 用于停止RabbitMQ服务和Erlang应用程序。# 如果指定了pid_file,还需要等待指定进程的结束。# pid_file是通过调用rabbitmq-server命令启动RabbitMQ服务时创建的,默认情况下存放于Mnesia目录中,可以通过RABBITMQ_PID_FILE 这个环境变量来改变存放路径。rabbitmqctl stop [pid_file]# 用于停止运行RabbitMQ的Erlang虚拟机和RabbitMQ服务应用。执行这个命令会阻塞直到Erlang虚拟机进程退出。# 如果RabbitMQ没有成功关闭,则会返回一个非零值rabbitmqctl shutdown# 停止RabbitMQ服务,但不停止Erlang虚拟机。该命令的操作要优先于其他管理操作,比如rabbitmqctl resetrabbitmqctl stop_app# 启动RabbitMQ服务rabbitmqctl start_app# 等待RabbitMQ应用的启动。# 它会等到pid_file的创建,然后等待pid_file中所代表的进程启动。# 当指定的进程没有启动RabbitMQ应用而关闭时将会返回失败。rabbitmqctl wait [pid_file]# 将RabbitMQ节点重置还原到最初状态。# 包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,如己配置的用户、vhost等,以及删除所有的持久化消息。# 执行rabbitmqctl reset命令前必须停止RabbitMQ应用(比如先执行rabbitmqctl stop_app)rabbitmqctl reset# 强制将RabbitMQ节点重置还原到最初状态。# 不同于rabbitmqctl reset命令,rabbitmqctl force_reset命令不论当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。# 它只能在数据库或集群配置己损坏的情况下使用。# 与rabbitmqctl reset命令一样,执行rabbitmqctl force_reset命令前必须先停止RabbitMQ应用。rabbitmqctl force_reset# 指示RabbitMQ节点轮换日志文件。# RabbitMQ节点会将原来的日志文件中的内容追加到"原始名称+后缀"的日志文件中,然后再将新的日志内容记录到新创建的日志中(与原日志文件同名)。# 当目标文件不存在时,会重新创建。如果不指定后缀suffix. 则日志文件只是重新打开而不会进行轮换。rabbitmqctl rotate_logs {suffix}
服务器状态的查询会返回一个以制表符分隔的列表,listqueues、listexchanges、listbindings和listconsumers这种命令接受一个可选的vhost参数以显示其结果,默认值为 "/"。
# 此命令返回队列的详细信息,如果无[-p vhost]参数,将显示默认的vhost为 "/" 中的队列详情。# 不指定queueinfoitem参数,则只显示name和messagerabbitmqctl list_queues [-p vhost] [queueinfoitem ...]rabbitmqctl list_queues name durable auto_delete arguments policy pid owner_pid exclusive exclusive_consumer_pid exclusive_consumer_tag
queueinfoitem参数用于指示哪些队列的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。queueinfoitem可以是下面列表中的任何值:
# 返回交换器的详细细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的交换器详情。# 不指定exchangeinfoitem参数,只显示name和typerabbitmqctl list_exchanges [-p vhost] [exchangeinfoitem ...]
exchangeinfoitem参数用于指示哪些交换器的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem可以是下面列表中的任何值:
# 返回绑定关系的细节,如果无[-p vhost]参数,将显示默认的vhost为"/"中的绑定关系详情# 不指定bindinginfoitem默认全显示rabbitmqctl list_bindings [-p vhost] [bindinginfoitem ...]
bindinginfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem可以是下面列表中的任何值:
# 返回TCP/IP连接的统计信息。# 不指定connectionnfoitem,默认显示user、peer_host、peer_port、staterabbitmqctl list_connections [connectionnfoitem ...]
connectionnfoitem可以是下面列表中的任何值:
# 返回当前所有信道的信息。# 不指定channelinfoitem,默认显示pid、user、consumer_count、messages_unacknowledgedrabbitmqctl list_channels [channelinfoitem ...]
channelinfoitem可以是下面列表中的任何值:
# 列举消费者信息。# 每行将显示由制表符分隔的己订阅队列的名称、相关信道的进程标识、consumerTag、是否需要消费端确认、prefetch_count及参数列表这些信息。rabbitmqctl list_consumers [-p vhost]# 显示Broker的状态# 比如当前Erlang节点上运行的应用程序、RabbitMQ/Erlang的版本信息、os的名称、内存及文件描述符等统计信息。rabbitmqctl status# 对RabbitMQ节点进行健康检查,确认应用是否正常运行、list_queues、list_channels是否能够正常返回等。rabbitmqctl node_health_check# 显示每个运行程序环境中每个变量的名称和值。rabbitmqctl environment# 为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件。rabbitmqctl report > report.txt# 执行任意Erlang表达式。rabbitmqctl eval {expr}
这里就不说了,可以自行看官网。