多租户与权限
**每一个RabbitMQ服务器都能创建虚拟的消息服务器,称之为虚拟主机(vhost),每一个vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。**vhost就像是虚拟机和物理服务器一样, 它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个RabbitMQ中的众多客户区分开,有可以避免队列和交换器等命名冲突。vhost之间是绝对隔离的,无法将vhost1中的交换器与vhost2中的队列进行绑定,这样既能保证了安全性,又可以确保可移植性。如果在使用RabbitMQ达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。
vhost是AMQP概念的基础,客户端在连接的时候必须指定一个vhost。**RabbitMQ默认创建的vhost为“/”,**如果不需要多个vhost或者对vhost的概念不是很理解,那么用这个默认的vhost也是非常合理的,如果默认的用户名guest和密码guest就可以访问它。但是为了安全起见,建议重新建立一个新的用户来访问它。
使用rabbitmqctl add_vhost {vhost}命令创建一个新的vhost,大括号里的参数表示vhost的名称。例如:
root@node01:~# rabbitmqctl add_vhost vhost1
Adding vhost "vhost1" ...
使用rabbitmqctl list_vhosts [vhostInfoItem]可以查看当前vhost的信息,vhostInfoItem的取值有两个:
- name表示vhost的名称
- tracing表示是否使用了RabbitMQ的trace功能;
root@node01:~# rabbitmqctl list_vhosts name tracing
Listing vhosts ...
name tracing
vhost1 false
/ems false
/ false
root@node01:~# rabbitmqctl trace_on
Starting tracing for vhost "/" ...
Trace enabled for vhost /
root@node01:~# rabbitmqctl list_vhosts name tracing
Listing vhosts ...
name tracing
vhost1 false
/ems false
/ true
使用rabbitmqctl delete_vhost [hostName]可以删除对应的vhost。注意,删除一个vhost同时也会删除其下所有的队列、交换器、绑定关系、用户权限、参数和策略等信息。
[root@node1 ~]# rabbitmqctl delete_vhost vhost1
Deleting vhost "vhost1"
[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts
RabbitMQ中的权限控制是以vhost为单位的,创建一个用户时,用户通常会被指派给至少一个vhost,并且只能访问被指派的vhost内的队列、交换器和绑定关系,因此RabbitMQ中的授予权限是在vhost级别进行的。
相关的授权命令为rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read},其中:
- vhost:为授予用户访问权限的vhost名称,可以设置为默认值,即vhost为“/”
- user:为可以访问指定vhost的用户名,
- conf:用于匹配用户在哪些资源上拥有可配置资源的正则表达式,
- write:用于匹配用户在哪些资源上拥有可写资源的正则表达式,
- read:用于匹配用户在哪些资源上拥有可读资源的正则表达式。
# 授予用户root可访问虚拟主机vhost1,并在所有资源上都具备可配置、可写以及可读的权限。
root@node01:~# rabbitmqctl set_permissions -p vhost1 test ".*" ".*" ".*"
Setting permissions for user "test" in vhost "vhost1" ...
# 授予用户root可访问虚拟主机vhost2,在以“queue”开头的资源上具备可配置权限,并在所有资源上拥有可写、可读的权限
root@node01:~# rabbitmqctl set_permissions -p vhost2 test "^queue.*" ".*" ".*"
Setting permissions for user "test" in vhost "vhost2" ...
注意:可配置指的是队列和交换器的创建及删除的操作,可写指的是发布消息,可读指的是与消息相关的操作,包括读取消息及清空整个队列等。
清除权限也是在vhost级别对用户而言的,命令为rabbitmqctl clear_permissions [-p vhost] {userName},其中vhost用于设置禁止用户访问的虚拟主机的名称,默认为“/”;username表示禁止访问特定虚拟主机的用户名称。
root@node01:~# rabbitmqctl clear_permissions -p vhost1 test
Clearing permissions for user "test" in vhost "vhost1" ...
在RabbitMQ中有两个Shell命令可以列举权限信息:
- 查看虚拟主机上的权限列表的命令为
rabbitmqctl list_user_permissions [-p vhost]; - 查看某个用户的权限命令为
rabbitmqctl list_user_permissions [userName]
[root@node1 ~]# rabbitmqctl list_permissions -p vhost1
Listing permissions in vhost "vhost1"
root .* .* .*
root@node01:~# rabbitmqctl list_user_permissions test
Listing permissions for user "test" ...
vhost configure write read
vhost2 ^queue.* .* .*
rabbitmqctl工具是用来管理RabbitMQ中间件的命令行工具,它通过连接各个RabbitMQ节点来执行所有操作。如果有节点没有运行,将显示诊断信息:不能到达或因不匹配的Erlang cookie而拒绝连接。rabbitmqctl工具的标准语法如下
rabbitmqctl [-n node] [-t timeout] [-q] {command} [command options...]
参数详解如下:
[-n node]:默认节点是”rabbit@hostname”,此处的hostname是主机名称。在一个名为”node.hidden.com”的主机上, RabbitMQ Erlang node 的节点名称通常是rabbit@node (除非RABBITMQ_NODENAME参数在启动时设置了非默认值)。 hostname -s 的输出通常是”@” 标志后的东西。
[-q]:使用-q标志来启用quiet模式,这样可以屏蔽一些消息的输出。 默认不开启quiet模式。
[-t timeout]:操作超时时间(秒为单位)。只适用于“list”类型的命令。 默认是无穷大。
示例如下:
[root@node1 ~]# rabbitmqctl list_vhosts
Listing vhosts
/
[root@node1 ~]# rabbitmqctl list_vhosts -q
/
[root@node1 ~]# rabbitmqctl list_vhosts -q -t 1
/
root@node01:~# rabbitmqctl list_vhosts -q -t 0
Error: operation list_vhosts on node rabbit@node01 timed out. Timeout value used: 0
用户管理
RabbitMQ中,用户是访问控制的基本单元,且单个用户可以跨越多个vhost进行授权。针对一至多个vhost,用户可以被赋予不同级别的访问权限,并且使用标准用户名和密码来认证用户。
创建用户的命令为rabbitmqctl add_user {userName} {password};其中username表示要创建的用户名称,password表示创建用户登录的密码。示例如下:
root@node01:~# rabbitmqctl add_user test test123
Adding user "test" ...
可以通过rabbitmqctl change_password {userName} {newpassword}命令可以用来更改用户的密码;举例如下:
root@node01:~# rabbitmqctl change_password test test123456
Changing password for user "test" ...
清除密码对应的命令为rabbitmqctl clear_password {userName},清除密码后不需要密码即可登录;
使用rabbitmqctl authenticate_user {username} {password}可以通过密码来验证用户,例如:
root@node01:~# rabbitmqctl authenticate_user test test123456
Authenticating user "test" ...
Success
删除用户的命令是rabbitmqctl delete_user {userName};
root@node01:~# rabbitmqctl delete_user test
Deleting user "test" ...
rabbitmqctl list_users命令可以列出当前所有的用户,后面会紧跟用户的角色(tags)。
root@node01:~# rabbitmqctl list_users
Listing users ...
user tags
ems [administrator]
admin [administrator]
guest [administrator]
用户角色分为5种:
- node:无任何角色,新创建的用户角色默认为none;
- management:可以访问Web管理页面;
- policymaker:包含management的所有权限,并且可以管理策略和参数;
- monitoring:包含management的所有权限,并且可以看到所有的连接、信道及节点相关的信息;
- administrator:包含monitoring的所有权限,并且可以管理用户、虚拟主机、权限、策略、参数等,它是最高权限
用户可以通过rabbitmqctl set_user_tags {userName} {tag1,tag2..}进行设置,tag参数可以用于设置0个、1个或多个角色,设置完成后会覆盖之前的身份,示例:
root@node01:~# rabbitmqctl set_user_tags ems monitoring
Setting tags for user "ems" to [monitoring] ...
root@node01:~# rabbitmqctl list_users
Listing users ...
user tags
ems [monitoring]
Web端管理
RabbitMQ management插件可以提供Web管理界面用来管理如前面所述的虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控RabbitMQ服务的状态及一些数据统计类信息。
在使用Web管理界面之前需要先启用RabbitMQ management插件。默认存放在$RABBITMQ_HOME/plugins目录下,执行rabbitmq-plugins enable {plugin-name}可以启用相关的插件,使用rabbitmq-plugins list命令可以查看当前插件的使用情况。rabbitmq-plugins disable [plugin-name]可以关闭插件。
应用与集群管理
与集群相关的一些操作命令包括:关闭、重置、开启服务以及建立集群的一些信息。
应用管理
rabbitmqctl stop [pid_file]用于停止RabbitMQ的Erlang虚拟机和RabbitMQ服务应用,如果指定了pid_file,还需要等待指定进程的结束。其中pid_file是通过调用rabbitmq-server命令启用RabbitMQ服务时创建的,默认情况下存放于Mnesia目录中,可以通过RABBITMQ_PID_FILE这个环境变量来改变存放路径。
注意:如果使用rabbit-server -detach 这个带有-detach后缀的命令来启动RabbitMQ服务则不会生产pid_file文件。
(上述文件可能由于安装方式或版本差异不尽相同)
rabbitmqctl shutdown用于停止RabbitMQ的虚拟机和RabbitMQ服务应用,执行这个命令后会阻塞直到Erlang虚拟机进程退出,与stop命令不同的是它不需要指定pid_file。如果没有成功关闭,则返回一个非零值。
rabbitmqctl stop_app用于停止RabbitMQ服务应用,但是此时Erlang虚拟机仍处于运行状态。此命令的执行优先于其他管理操作。这些管理操作需要首先停用RabbitMQ应用
rabbitmqctl start_app用于启动RabbitMQ应用,此命令典型的用途是在执行了其他管理操作之后,重新启动之前停止的RabbitMQ应用。
rabbitmqctl wait [pid_file]用于等待RabbitMQ应用的启动,它会等到pid_file的创建,然后等待pid_file中所代表的进程启动。当指定的进程没有启动RabbitMQ应用而关闭时将会返回失败。
rabbitmqctl reset用于将RabbitMQ节点重置还原到最初的状态,包括从原来所在的集群中删除此节点,从管理数据库中删除所有的配置数据,以及删除所有的持久化消息。执行此命令前必须先停止RabbitMQ应用
rabbitmqctl force_reset用于强制将RabbitMQ节点重置还原到最初状态,它不管当前管理数据库的状态和集群配置是什么,都会无条件地重置节点。因此,它只能在数据库或集群配置已经损坏的情况下使用。执行此命令前必须先停止RabbitMQ应用
rabbitmqctl rotate_logs {suffix}用于指示RabbitMQ节点轮换日志文件,RabbitMQ节点会将原来的日志文件中的内容追加到“原始名称+后缀”的日志文件中,然后再将新的日志内容记录到新创建的日志中,当目标文件不存在时会重新创建。如果不指定后缀suffix,则日志文件只是重新打开而不会进行轮换。
rabbitmqctl hipe_compile [directory]用于将部分RabbitMQ代码用Hipe(Erlang版的JIT)编译,并将编译后的.beam文件保存到指定目录。如果这个目录不存在,则自动创建。如果目录中原本有任何.beam文件,则会在编译之前删除。如果要使用预编译的这些文件,则需要设置RABBIT_SERVER_CODE_PATH这个环境变量来指定hipe_compile调用路径。
集群管理
rabbitmqctl join_cluster [cluster_node] [--ram]用于将节点加入到指定集群中,执行前需要停止RabbitMQ并重置节点
rabbitmqctl cluster_status用于显示集群的状态
rabbitmqctl change_cluster_node_type [disc|ram]用于修改集群节点的类型,执行前需要停止RabbitMQ应用
rabbitmqctl forget_cluster_node [--offline]用于将节点从集群中删除,允许离线执行
rabbitmqctl update_cluster_nodes [clusterNode]用于在集群中的节点应用启动前咨询clusternode节点的最新信息,并更新相应的集群信息。和join_cluster不同,它不加入集群。
rabbitmqctl force_boot用于确保节点可以启动,即使它不是最后一个关闭的节点。通常情况下RabbitMQ集群被整个关闭后,重启的第一个节点应该时最后关闭的节点,因为它可以看到其他节点所看不到的事情。但是有一些异常情况:例如整个集群都掉电而所有节点都认为它不是一个关闭的。这种情况下,可以调用rabbitmqctl force_boot命令,这就告诉节点可以无条件地启用节点。在此节点关闭后,集群的任何变化,它都会丢失。如果最后一个关闭的节点永久丢失了,那么需要优先使用rabbitmqctl forget_cluster_node [–offline]命令,因为它可以保证镜像队列的正常运转。
rabbitmqctl sync_queue [-p vhost] [queue]用于指示未同步队列queue的slave镜像可以同步master镜像行的内容,同步期间此队列会被阻塞(该队列的所有生产者消费者都会被阻塞),直到同步完成。该命令执行成功的前提是队列queue配置了镜像。注意,未同步队列中的消息被耗尽后,最终也会变成同步,此命令主要用于未耗尽的队列。
rabbitmqctl cannel_sync_queue [-p vhost] [queue]用于取消队列同步镜像的操作
rabbitmqctl set_cluster_name [name]用于设置集群的名称,集群名称会在客户端连接时通报给客户端。Federation和Shovel插件也会有用到集群名称的地方。默认是第一个节点的名称。
服务端状态
服务端状态的查询会返回一个以制表符分割的列表,list_queues、list_exchanges、list_bingings和list_consumers这种命令可接受一个可选的vhost参数以显示其结果,默认值为“/”。
rabbitmqctl list_queues [-p vhost] [queueInfoItem...]命令返回队列相关的信息,queueInfoItem参数用于指示哪些队列的信息项显示在结果集中,结果集的列顺序将匹配参数的顺序。queueinfoitem可以是下面列表中的任何值:
- name:队列名称
- durable:队列是否持久化
- auto_delete:队列是否自动删除
- arguments:队列的参数
- policy:应用到队列上的策略名称
- pid:队列关联的Erlang进程的ID
- owner_pid:处理排他队列连接的Erlang进程的ID。如果是非排他队列,此值为空
- exclusive:队列是否排他
- exclusive_consumer_pid:订阅到此排他队列的消费者相关的信道关联的Erlang进程ID。如果此队列是非排他的,此值将为空。
- exclusive_consumer_tag:订阅到此排他队列的消费者的consumerTag。 如果此队列是非排他的,此值将为空。
- messages_ready: 准备发送给客户端的消息个数。
- messages_unacknowledged:发送给客户端但尚未应答的消息个数。
- messages:准备发送给客户端和未应答消息的总和。
- messages_ready_ram:驻留在内存中messages_ready的消息个数。
- messages_unacknowledged_ram:驻留在内存中messages_unacknowledged的消息个数。
- messages_ram:驻留在内存中的消息总数。
- messages_persistent:队列中持久化消息的个数。对于非持久化队列来说总是0。
- messages_bytes:队列中所有消息的大小总和。这里不包括消息属性或者任何其他开销
- messages_bytes_ready:准备发送给客户端的消息的大小总和。
- messages_bytes_unacknowledged:发送给客户端但尚未应答的消息的大小总和。
- messages_bytes_ram:驻留在内存中的messages_bytes。
- messages_bytes_persistent:队列中持久化的messages_bytes。
- disk_reads:从队列启动开始,己从磁盘中读取该队列的消息总次数。
- disk_writes: 从队列启动开始,己向磁盘队列写消息的总次数。
- consumer:消费者数目。
- consumer_utilisation:队列中的消息能够立刻投递给消费者的比率,介于0和1之间。这个受网络拥塞或者Basic.Qos的影响而小于1。
- memory:与队列相关的Erlang进程所消耗的内存字节数,包括栈、堆及内部结构。
- slave_pids:如果队列是镜像的,列出所有slave镜像的pid。
- synchronisedslavepids: 如果队列是镜像的,列出所有己经同步的slave镜像的pid。
- state: 队列状态。正常情况下是running;如果队列正常同步数据可能会有"{syncing, MsgCount}"的状态;如果队列所在的节点掉线了,则队列显示状态为down(此时大多数的queueinfoitems也将不可用)。
如果没有指令queueInfoItem,那么该命令将显示队列的名称和消息的个数:
root@node01:/etc/rabbitmq# rabbitmqctl list_queues -p /
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
name messages
query.order 1
credit.finance 0
demo.queue 0
notify.payment 0
queue_work 0
notify.refund 0
api.report.payment 0
api.core 0
credit.bank 0
api.payment 0
api.report.refund 0
root@node01:/etc/rabbitmq# rabbitmqctl list_queues -p / messages messages_ram message_bytes
Timeout: 60.0 seconds ...
Listing queues for vhost / ...
messages messages_ram message_bytes
1 1 10
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
0 0 0
rabitmqctl list_exchanges [-p vhost] [exchangeInfoItem...]返回交换器的详细细节,如果没有-p vhost将显示默认的vhost。exchangeinfoitem参数用于指示哪些交换器的信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。exchangeinfoitem可以是下面列表中的任何值:
- name:交换器的名称。
- type:交换器的类型。
- durable:设置是否持久化。durable设置为true表示持久化,反之是非持久化。
- auto_delete:设置是否自动删除。
- internal:是否是内置的。
- arguments:其他一些结构化参数,比如alternate-exchange。
- policy:应用到交换器上的策略名称。
rabbitmqctl list_bindings [-p vhost] [bindingInfoItem...]将返回绑定关系的细节。如果没有-p vhost将显示默认的vhost。bindinginfoitem参数用于指示哪些信息项会包含在结果集中,结果集的列顺序将匹配参数的顺序。bindinginfoitem可以是下面列表中的任何值:
- source_name:绑定中消息来源的名称。
- source_kind:绑定中消息来源的类别。
- destination_name:绑定中消息目的地的名称。
- destination_kind:绑定中消息目的地的种类。
- routing_key:绑定的路由键。
- arguments:绑定的参数。
如果没有指定bindinginfoitem,那么将显示所有的条目:
root@node01:/etc/rabbitmq# rabbitmqctl list_bindings -q
source_name source_kind destination_name destination_kind routing_key arguments
exchange query.order queue query.order []
exchange credit.finance queue credit.finance []
exchange demo.queue queue demo.queue []
exchange notify.payment queue notify.payment []
exchange queue_work queue queue_work []
exchange notify.refund queue notify.refund []
exchange api.report.payment queue api.report.payment []
exchange api.core queue api.core []
exchange credit.bank queue credit.bank []
exchange api.payment queue api.payment []
exchange api.report.refund queue api.report.refund []
coreExchange exchange api.core queue api.core.* []
creditBankExchange exchange credit.bank queue [{"aging","fast"},{"type","cash"},{"x-match","all"}]
creditFinanceExchange exchange credit.finance queue [{"aging","fast"},{"type","cash"},{"x-match","any"}]
demo.exchange exchange demo.queue queue demo.queue []
paymentExchange exchange api.payment queue api.payment.# []
reportExchange exchange api.report.payment queue []
reportExchange exchange api.report.refund queue []
rabbitmqctl list_connections [connetionInfoItem...]返回TCP/IP连接的统计信息。connectioninfoitem参数用于指示哪些信息项会包含在结果集中,可选项如下:
- pid:与连接相关的Erlang进程ID。
- name:连接的名称。
- port:服务器端口。
- host:返回反向DNS获取的服务器主机名称,或者IP地址,或者未启用。
- peerport:服务器对端端口。当一个客户端与服务器连接时,这个客户端的端口就是peerport。
- peer_host:返回反向DNS获取的对端主机名称,或者IP地址,或者未启用。
- ssl:是否启用SSL。
- ssl_protocol:SSL协议,如tlsvl。
- ssl_key_exchange:SSL密钥交换算法,如rsa。
- ssl_cipher:SSL加密算法,如aes256_cbc。
- ssl_hash:SSL哈希算法,如sha
- peer_cert_subject:对端的SSL安全证书的主题,基于RFC4514的形式。
- peer_cert_issuer:对端SSL安全证书的发行者,基于RFC4514的形式 。
- peer_cert_validity:对端SSL安全证书的有效期。
- state:连接状态,包括starting、tuning、opening、running、flow、blocking、blocked、closing和closed这几种。
- channels:该连接中的信道个数。
- protocol:使用的AMQP协议的版本,注意,如果客户端请求的是AMQP0-9的连接,RabbitMQ也会将其视为0-9-1。
- auth_mechanism:使用的SASL认证机制,如PLAIN、AMQPLAIN、EXTERNAL、RABBIT-CR-DEMO等。
- user:与连接相关的用户名。
- vhost:与连接相关的vhost的名称。
- timeout:连接超时/协商的心跳间隔,单位为秒。
- frame_max:最大传输帧的大小,单位为B。
- channel_max:此连接上信道的最大数量,如果值0,则表示无上限,但客户端一般会将0转变为65535
- client_properties:在建立连接期间由客户端发送的信息属性。
- recv_oct:收到的字节数。
- recv_cnt:收到的数据包个数。
- send_oct:发送的字节数。
- send_cnt:发送的数据包个数。
- send_pend:发送队列大小。
- connected_at:连接建立的时间戳。
rabbitmqctl list_channels [channelInfoItem...]返回当前所有信道的信息。channelinfoitem参数可选项如下:
- pid:与连接相关的Erlang进程ID。
- connection:信道所属连接的Erlang进程ID。
- name:信道的名称。
- number:信道的序号。
- user:与信道相关的用户名称。
- vhost:与信道相关的vhost
- transactional:信道是否处于事务模式。
- confirm:信道是否处于publisher confirm模式。
- consumer_count:信道中的消费者的个数。
- messages_unacknowledged:己投递但是还未被ack的消息个数。
- messages_uncommitted:己接收但是还未提交事务的消息个数。
- acks_uncommitted:己ack收到但是还未提交事务的消息个数。
- messages_unconfirmed:己发送但是还未确认的消息个数。如果信道不处于publisher confirm模式下,则此值为0。
- perfetch_count:新消费者的Qos个数限制。0表示无上限。
- global_prefetch_count:整个信道的Qos个数限制。0表示无上限。
rabbitmqctl list_consumers [-p vhost]列举消费者信息。每行将显示由制表符分隔的已订阅队列的名称、相关信道的进程表示、comsumerTag、是否需要消费端确认、prefetch_count及参数列表这些信息。
rabbitmqctl status显示Broker的状态。比如当前Erlang节点运行的应用程序、RabbitMQ/Erlang的版本信息、OS的名称、内存以及文件描述符等统计信息。
rabbitmqctl node_health_check对RabbitMQ节点进行健康检查,确定应用是否正常运行,list_queues和list_channels是否能够正常返回等
root@node01:/etc/rabbitmq# rabbitmqctl node_health_check
This command is DEPRECATED and will be removed in a future version.
It performs intrusive, opinionated health checks and requires a fully booted node.
Use one of the options covered in https://www.rabbitmq.com/monitoring.html#health-checks instead.
Timeout: 70 seconds ...
Checking health of node rabbit@node01 ...
Health check passed
rabbitmqctl environment显示每个运行程序环境中每个变量的名称和值
rabbitmqctl report为所有服务器状态生成一个服务器状态报告,并将输出重定向到一个文件
rabbitmqctl eval {expr}执行任意Erlang表达式
注意:若要删除所有的交换器、队列及绑定关系,删除对应的vhost即可,而不需要一个个遍历删除
HTTP API接口管理
在安装RabbitMQ在本机后,通过http://127.0.0.1:15672访问管理界面,首页最下方点击“HTTP API”查看官网文档。


下面是文档内容的翻译:
1)介绍
除了这个帮助页面之外,所有URI只提供application/json类型的资源,并且需要HTTP基本身份验证(使用标准RabbitMQ用户数据库)。默认用户是guest/guest。
许多URI要求将虚拟主机的名称作为路径的一部分,因为名称只能唯一地标识虚拟主机中的对象。由于默认虚拟主机名为“/”,因此需要将其编码为“%2F”。
通过PUTing在RabbitMQ服务器上创建资源。上传的JSON对象必须具有某些强制密钥(如下所述)并且可以具有可选密钥。其他密钥会被忽略。如果缺少强制密钥会构成错误。
**当Binding在AMQP中没有名称或id时,RabbitMQ会根据其所有的属性合成一个名称或id。**由于在一般情况下很难预测此名称,因此也可以通过POSTing到工厂的URI来创建Binding。请参阅下面的示例。
**许多URI返回列表,这样的URI可以添加查询字符串参数sort和sort_reverse。sort允许您选择要排序的主字段,如果设置为true,sort_reverse将倒序排序。sort参数可以包含多个子字段然后用“.”分隔。
这允许您按所列项目的嵌套组件排序;不允许您按多个字段排序。**请参阅下面的示例。
还可以使用columns参数限制每个项返回的信息。这是由点分隔的子字段的逗号分隔列表,请参阅下面的示例。
大多数GET查询都为每个对象返回许多字段。本指南的第二部分将介绍这些内容。
补充:这里的HTTP API是完全基于RESTful风格的,一共涉及4中HTTP方法:GET、PUT、DELETE、POST。GET方法一般用来获取集群、节点、队列、交换器等信息,PUT方法用来创建交换器、队列等资源,DELETE方法用来删除资源,POST方法同样用来创建资源,但创建的是无法用具体名称的资源,如绑定关系及发布关系无法指定一个具体的名称。
2)示例
①获取虚拟主机(vhost)列表:
root@node01:/etc/rabbitmq# curl -i -u guest:guest http://localhost:15672/api/vhosts
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 660
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Fri, 29 Jan 2021 09:37:07 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[{"cluster_state":{"rabbit@node01":"running"},"messages":1,"messages_details":{"rate":0.0},"messages_ready":1,"messages_ready_details":{"rate":0.0},"messages_unacknowledged":0,"messages_unacknowledged_details":{"rate":0.0},"name":"/","tracing":false},{"cluster_state":{"rabbit@node01":"running"},"messages":0,"messages_details":{"rate":0.0},"messages_ready":0,"messages_ready_details":{"rate":0.0},"messages_unacknowledged":0,"messages_unacknowledged_details":{"rate":0.0},"name":"/ems","tracing":false},{"cluster_state":{"rabbit@node01":"running"},"name":"vhost1","tracing":false},{"cluster_state":{"rabbit@node01":"running"},"name":"vhost2","tracing":false}]
②获取信道列表,快速生产者,并限制我们返回的信息项
root@node01:/etc/rabbitmq# curl -i -u guest:guest 'http://localhost:15672/api/channels?sort=message_stats.publish_details.rate&sort_reverse=true&columns=name,message_stats.publish_details.rate,message_stats.deliver_get_details.rate'
HTTP/1.1 200 OK
cache-control: no-cache
content-length: 2
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
content-type: application/json
date: Fri, 29 Jan 2021 09:38:40 GMT
server: Cowboy
vary: accept, accept-encoding, origin
[]
③创建一个新的虚拟主机:
root@node01:/etc/rabbitmq# curl -i -u guest:guest -H "content-type:application/json" \
> -XPUT http://localhost:15672/api/vhosts/foo
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Fri, 29 Jan 2021 09:39:19 GMT
server: Cowboy
vary: accept, accept-encoding, origin
root@node01:/etc/rabbitmq#
④在默认虚拟主机上创建一个新的交换器:
root@node01:/etc/rabbitmq# curl -i -u guest:guest -H "content-type:application/json" \
> -XPUT -d'{"type":"direct","durable":true}' \
> http://localhost:15672/api/exchanges/%2F/my-new-exchange
HTTP/1.1 201 Created
content-length: 0
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Fri, 29 Jan 2021 09:40:40 GMT
server: Cowboy
vary: accept, accept-encoding, origin
⑤删除创建的交换器:
root@node01:/etc/rabbitmq# curl -i -u guest:guest -H "content-type:application/json" \
> -XDELETE http://localhost:15672/api/exchanges/%2F/my-new-exchange
HTTP/1.1 204 No Content
content-security-policy: script-src 'self' 'unsafe-eval' 'unsafe-inline'; object-src 'self'
date: Fri, 29 Jan 2021 09:41:20 GMT
server: Cowboy
vary: accept, accept-encoding, origin
具体结果的详细信息,参考RabbitMQ 的官方文档。另外如果单纯地使用curl的方式来调用,rabbitmqadmin会显得更加方便。rabbitmqadmin也是RabbitMQ Management插件提供的功能,它会包装HTTP API接口,使其调用显得更加简洁方便。例如:
root@node01:/var/lib/rabbitmq/mnesia/rabbit@node01-plugins-expand/rabbitmq_management-3.8.9/priv/www/cli# ./rabbitmqadmin -u guest -p guest declare queue name=vhost
queue declared
root@node01:/var/lib/rabbitmq/mnesia/rabbit@node01-plugins-expand/rabbitmq_management-3.8.9/priv/www/cli#
root@node01:/var/lib/rabbitmq/mnesia/rabbit@node01-plugins-expand/rabbitmq_management-3.8.9/priv/www/cli# ./rabbitmqadmin list queues
+--------------------+----------+
| name | messages |
+--------------------+----------+
| api.core | 0 |
| api.payment | 0 |
| api.report.payment | 0 |
| api.report.refund | 0 |
| credit.bank | 0 |
| credit.finance | 0 |
| demo.queue | 0 |
| notify.payment | 0 |
| notify.refund | 0 |
| query.order | 1 |
| queue_work | 0 |
| vhost | 0 |
| work | 0 |
+--------------------+----------+
参考资料
- 《RabbitMQ实战指南》 朱忠华 著
- https://www.cnblogs.com/Jscroop/p/14290303.html
- https://developer.aliyun.com/article/238305?spm=a2c6h.13262185.0.0.62ca55fduDmdJu
- https://cloud.tencent.com/developer/article/1469328
本文深入介绍了RabbitMQ的多租户机制,通过虚拟主机(vhost)实现资源隔离,并详细阐述了如何管理用户权限,包括创建、删除vhost,设置用户权限等。此外,还探讨了RabbitMQ的集群管理,包括应用与集群状态监控、Web管理界面的使用,以及HTTP API接口的管理,提供了丰富的命令行操作示例和HTTP API调用示例。
1万+

被折叠的 条评论
为什么被折叠?



