Rabbitmq 之 vhost

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rabbitmq 之 vhost相关的知识,希望对你有一定的参考价值。

参考技术A         每一个RabbitMQ服务器都能创建虚拟消息服务器,我们称为虚拟主机Vhost.每一个vhost 本质上是一个mini版 的RabbitMq. 拥有自己的队列 交换器 和绑定. 更重要的是, 它拥有自己的权限机制,

        vhost 是AMQP 概念基础, 你必须在连接时进行制定, 由于RabbitMq 包含了开箱即用的默认vhost:"/", 因此使用起来非常方便.可以通过默认的guest 和 密码 guest 访问默认的vhost. 

        在Rabbit里创建一个用户时, 用户通常会被指派至少一个vhost , 并且只能访问被指派vhost内的队列,交换器和绑定. vhost 之间是绝对隔离的.

        在RabbitMq 集群上创建vhost 时, 整个集群上都会创建该vhost. vhost 不仅消除了为基础架构中的每一层运行一个RabbitMq服务器的需要, 童谣避免为每一层创建不同的集群.

        新增: RabbitMq 安装路径 ./sbin 目录中 的 rabbitmqctl 工具来创建.

        rabbitmqctl add_vhost[vhost_name] 就可以创建一个vhost.vhost_name 就是想要创建的vhost.

        删除:  rabbitmqctl delete_vhost[vhost_name]

        查询: 查询特定rabbit 上有哪些vhost: ./sbin/rabbitmqctl list_vhosts

注: 也可以通过制定 -n rabbit@[server_name] 分成两部分: 左边是 Erlang 应用名称, 在这里永远都是rabbit . 右边是服务器主机名和IP地址. 你需要确保

运行Rabbit节点的服务器和运行rabbitmqctl的工作站安装了相同的Erlang cookie.

RabbitMQ vhost用户和权限

rabbitmq中,vhost提供了资源隔离机制。同时,通过为用户设置vhost粒度的权限,可以实现丰富的权限控制功能。

vhost

在rabbitmq中,可以创建被称为虚拟主机(vhost)的虚拟消费服务器。每个vhost逻辑上是一个独立的消息服务器,拥有自己独立的交换器、队列和绑定等资源。
vhost提供了隔离机制,使得用户可以在同一套rabbitmq服务器上创建多个vhost,并对不同对应用使用不同对vhost,不同的vhost之间相互隔离,这在业务复杂的大型应用中会比较有用。

RabbitMQ默认创建了名称为"/"的vhost,这也是大多数情况下默认使用的vhost,应用程序在此vhost中声明交换器、队列和绑定,供业务使用。
通过rabbitmqctl,可以方便的查看、创建和删除vhost。

查看vhost

rabbitmqctl list_vhosts可以查看所有创建的vhost。

$ rabbitmqctl list_vhosts
Listing vhosts ...
/

创建vhost

rabbitmqctl add_vhost {vhost}

$ rabbitmqctl add_vhost myVhost
Adding vhost "myVhost" ..
$ rabbitmqctl list_vhosts
Listing vhosts ...
/
myVhost

删除vhost

rabbitmqctl delete_vhost {vhost}

$ rabbitmqctl delete_vhost myVhost
Deleting vhost "myVhost" ...

用户管理

创建用户

rabbitmqctl add_user {username} {password}

$ add_user swaf swaf123
Adding user "swaf" ...

查看用户

rabbitmqctl list_users

$ rabbitmqctl list_users
Listing users ...
swaf    []
guest   [administrator]  //[]中为用户角色

修改用户密码

rabbitmqctl change_password {username} {password}

$ rabbitmqctl change_password swaf swaf456
Changing password for user "swaf" ...

验证用户

rabbitmqctl authenticate_user {username} {password}

$ rabbitmqctl authenticate_user swaf swaf456
Authenticating user "swaf" ...
Success
$ rabbitmqctl authenticate_user swaf jaf
Authenticating user "swaf" ...
Error: failed to authenticate user "swaf"
user ‘swaf‘ - invalid credentials

删除用户

rabbitmqctl delete_user {username}

$ rabbitmqctl delete_user swaf
Deleting user "swaf" ...

权限控制

在RabbitMQ中,权限控制是以vhost为单位的。权限控制可以设置用户对某(几)个vhost内资源的访问权限。

授权

为用户授权的命令为格式为: rabbitmqctl set_permissions [-p vhost] {user} {conf}{write}{read}
其中

  • -p 为可选项,指定vhost;
  • user指定用户;
  • {conf}{write}{read}分别指定用户可以在哪些资源上做配置、读、和写的权限。它们都是一个正则表达式,如果资源名称与指定的正则匹配,则用户对该资源有对
    应对操作权限。需要说明对是{conf}是指可以对队列、交换器等做创建、删除之类等管理操作,{write}是指可以发布消息,{read}是指可以消费消息。
# 创建一个vhost和user
$ rabbitmqctl add_vhost vh1
Adding vhost "vh1" ...

$ rabbitmqctl add_user u1 upass
Adding user "u1" ...

rabbitmqctl list_vhosts
Listing vhosts ...
vh1
/

$ rabbitmqctl list_users
Listing users ...
guest   [administrator]
u1  []

# 授予用户权限
#1 授予用户u1对vh1上所有资源对可配置、可读、可写权限
$ rabbitmqctl set_permissions -p vh1 u1 ".*" ".*" ".*"
Setting permissions for user "u1" in vhost "vh1" ...

#2 用户u1对vh1上以error开头对资源有配置权限;对vh1上以log结尾对资源有写权限;对vh1上所有资源有读权限
$ rabbitmqctl set_permissions -p vh1 u1 "^error.*" ".*log$" ".*"
Setting permissions for user "u1" in vhost "vh1" ...

查看权限

有个两个命令可以查看用户权限,分别从vhost视角和user视角查看权限。

  • rabbitmqctl list_permissions [-p vhost] 查看vhost上对权限
  • rabbitmqctl list_user_permissions {username} 查看用户对权限
$ rabbitmqctl list_permissions -p vh1
Listing permissions for vhost "vh1" ...
u1  ^error.*    .*log$  .*

$ rabbitmqctl list_user_permissions u1
Listing permissions for user "u1" ...
vh1 ^error.*    .*log$  .*

清除权限

与授权相同,清除用户权限也是以vhost为单位对,即一次性清除用户在某个vhost上设置对所有权限。
清除权限命令为: rabbitmqctl clear_permissions [-p vhost] {username}

$ rabbitmqctl clear_permissions -p vh1 u1
Clearing permissions for user "u1" in vhost "vh1" ...
$ rabbitmqctl list_user_permissions u1
Listing permissions for user "u1" ...

$ 





以上是关于Rabbitmq 之 vhost的主要内容,如果未能解决你的问题,请参考以下文章

python之rabbitMQ

21Python之rabbitMQ,redis

RabbitMQ手册之rabbitmq-env.conf

python之rabbitMQ

云原生之Docker实战使用Docker部署Rabbitmq集群

消息队列之RabbitMQ