【RabbitMQ】消息队列中间件学习之RabbitMQ(7)

本文深入介绍了RabbitMQ的多租户机制,通过虚拟主机(vhost)实现资源隔离,并详细阐述了如何管理用户权限,包括创建、删除vhost,设置用户权限等。此外,还探讨了RabbitMQ的集群管理,包括应用与集群状态监控、Web管理界面的使用,以及HTTP API接口的管理,提供了丰富的命令行操作示例和HTTP API调用示例。

多租户与权限

**每一个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”查看官网文档。
RabbitMQ HTTP API
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        |
+--------------------+----------+

参考资料

  1. 《RabbitMQ实战指南》 朱忠华 著
  2. https://www.cnblogs.com/Jscroop/p/14290303.html
  3. https://developer.aliyun.com/article/238305?spm=a2c6h.13262185.0.0.62ca55fduDmdJu
  4. https://cloud.tencent.com/developer/article/1469328
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

镰刀韭菜

看在我不断努力的份上,支持我吧

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值