• 【RabbitMQ实战】05 RabbitMQ后台管理


    一、多租户与权限

    1.1 vhost的概念

    每一个 RabbitMQ服务器都能创建虚拟的消息服务器,我们称之为虚拟主机(virtual host),简称为 vhost。每一个 vhost本质上是一个独立的小型RabbitMQ服务器,拥有自己独立的队列、交换器及绑定关系等,并且它拥有自己独立的权限。vhost 就像是虚拟机与物理服务器一样,它们在各个实例间提供逻辑上的分离,为不同程序安全保密地运行数据,它既能将同一个RabbitMQ中的众多客户区分开,又可以避免队列和交换器等命名冲突。vhost之间是绝对隔离的,无法将 vhostl 中的交换器与 vhost2中的队列进行绑定,这样既保证了安全性,又可以确保可移植性。如果在使用 RabbitMQ达到一定规模的时候,建议用户对业务功能、场景进行归类区分,并为之分配独立的vhost。

    vhost 是 AMQP概念的基础,客户端在连接的时候必须制定一个vhost。RabbitMQ默认创建的vhost 为“/”,如果不需要多个 vhost 或者对 vhost的概念不是很理解,那么用这个默认的vhost 也是非常合理的,使用默认的用户名 guest 和密码 guest 就可以访问它。但是为了安全和方便,建议重新建立一个新的用户来访问它。

    二、rabbitmqctl管理工具

    下面我们用rabbitmqctl工具来进行后台管理工作

    2.1 操作vhost

    • 添加
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl add_vhost vhost1
    Adding vhost "vhost1" ...
    
    • 1
    • 2
    • 查询
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_vhosts
    Listing vhosts ...
    name
    /
    virtual01
    vhost1
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 删除
      刚才创建的vhost1被删除了
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl delete_vhost vhost1
    Deleting vhost "vhost1" ...
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_vhosts
    Listing vhosts ...
    name
    /
    virtual01
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    2.2用户管理

    • 创建用户
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl add_user user1 123456
    Adding user "user1" ...
    Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
    
    • 1
    • 2
    • 3

    -查询用户列表

    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_users
    Listing users ...
    user	tags
    admin	[administrator]
    hello	[administrator]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 修改用户密码
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl change_password user1 111111
    Changing password for user "user1" ...
    
    • 1
    • 2
    • 删除用户
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl delete_user user1
    Deleting user "user1" ...
    
    • 1
    • 2

    2.3权限

    在RabbitMQ中权限控制是以vhost为单位的。
    当创建一个用户时,用户通常会被指派给至少一个 vhost,并且只能访问被指派的 vhost 内的队列、交换器和绑定关系等。因此,RabbitMQ中的授予权限是指在vhost级别对用户而言的权限授予。

    相关的授予权限命令为:
    rabbitmqctl set_permissions [-p vhost] {user) {conf}{write}{read}
    其中各个参数的含义如下所述。

    • vhost:授予用户访问权限的vhost名称,可以设置为默认值,即vhost为“/”。

    • user:可以访问指定 vhost的用户名。

    • conf:一个用于匹配用户在哪些资源上拥有可配置权限的正则表达式。

    • write:一个用于匹配用户在哪些资源上拥有可写权限的正则表达式。

    • read:一个用于匹配用户在哪些资源上拥有可读权限的正则表达式。

    注:
    可配置指的是队列和交换器的创建及删除之类的操作;
    可写指的是发布消息;
    可读指与消息有关的操作,包括读取消息及清空整个队列等。
    
    • 1
    • 2
    • 3
    • 4
    • 添加权限
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl set_permissions -p vhost1 user1 ".*" ".*" ".*"
    Setting permissions for user "user1" in vhost "vhost1" ...
    
    • 1
    • 2

    “.*” 这个.*号代表什么呢?
    其实代码通配符,看下面的例子

    I have no name!@0d5cb60e3a06:/$ rabbitmqctl set_permissions -p vhost1 user1 "^queue01.*" ".*" ".*"
    Setting permissions for user "user1" in vhost "vhost1" ...
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_user_permissions user1
    Listing permissions for user "user1" ...
    vhost	configure	write	read
    vhost1	^queue01.*	.*	.*
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    授权user1用户,在以“queue01”开头的资源上有可配置的权限,并在所有资源上有可写、可读的权限

    • 查询用户权限
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_permissions -p vhost1
    Listing permissions for vhost "vhost1" ...
    user	configure	write	read
    user1	.*	.*	.*
    
    • 1
    • 2
    • 3
    • 4
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl list_user_permissions user1
    Listing permissions for user "user1" ...
    vhost	configure	write	read
    vhost1	.*	.*	.*
    
    • 1
    • 2
    • 3
    • 4
    • 清除权限
    I have no name!@0d5cb60e3a06:/$ rabbitmqctl clear_permissions -p vhost1 user1
    Clearing permissions for user "user1" in vhost "vhost1" ...
    
    • 1
    • 2

    2.4用户角色

    用户角色作用在web管理插件下的,不要与permissions相混淆

    用户角色tags可分为五类:

    • 超级管理员(administrator)可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
    • 监控者(monitoring) 可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
    • 策略制定者(policymaker)可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。但无法查看节点的相关信息。 与administrator的对比,administrator能看到这些内容
    • 普通管理者(management) 仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
      其他 无法登陆管理控制台,通常就是普通的生产者和消费者。 了解了这些后,就可以根据需要给不同的用户设置不同的角色,以便按需管理。
      设置用户角色的命令为:

    rabbitmqctl set_user_tags {User} {Tag}
    User为用户名,
    Tag为角色名(对应于上面的administrator,monitoring,policymaker,management,或其他自定义名称)。

    也可以给同一用户设置多个角色,例如

    rabbitmqctl set_user_tags user001 monitoring policymaker management
    
    • 1

    三、Web端管理

    rabbitmqctl管理工具,通过命令行的方式,来进行管理工作。那有没有更友好的图形界面呢?有的。
    RabbitMQ management插件可以提供Web管理界面用来管理如前面所述的虚拟主机、用户等,也可以用来管理队列、交换器、绑定关系、策略、参数等,还可以用来监控 RabbitMQ服务的状态及一些数据统计类信息,可谓是功能强大,基本上能够涵盖所有RabbitMQ管理的功能。

    在使用Web管理界面之前需要先启用 RabbitMQ management插件。RabbitMQ提供了很多的插件,默认存放在$RABBITMQ_HOME/plugins 目录下,如下所示。

    3.1插件的管理

    • 列出当前的启用的插件
    I have no name!@0d5cb60e3a06:/opt/bitnami/rabbitmq/plugins$ rabbitmq-plugins list
    Listing plugins with pattern ".*" ...
     Configured: E = explicitly enabled; e = implicitly enabled
     | Status: * = running on rabbit@localhost
     |/
    [  ] rabbitmq_amqp1_0                  3.9.11
    [  ] rabbitmq_auth_backend_cache       3.9.11
    [  ] rabbitmq_auth_backend_http        3.9.11
    [  ] rabbitmq_auth_backend_ldap        3.9.11
    [  ] rabbitmq_auth_backend_oauth2      3.9.11
    [  ] rabbitmq_auth_mechanism_ssl       3.9.11
    [  ] rabbitmq_consistent_hash_exchange 3.9.11
    [  ] rabbitmq_event_exchange           3.9.11
    [  ] rabbitmq_federation               3.9.11
    [  ] rabbitmq_federation_management    3.9.11
    [  ] rabbitmq_jms_topic_exchange       3.9.11
    [E*] rabbitmq_management               3.9.11
    [e*] rabbitmq_management_agent         3.9.11
    [  ] rabbitmq_mqtt                     3.9.11
    [  ] rabbitmq_peer_discovery_aws       3.9.11
    [  ] rabbitmq_peer_discovery_common    3.9.11
    [  ] rabbitmq_peer_discovery_consul    3.9.11
    [  ] rabbitmq_peer_discovery_etcd      3.9.11
    [  ] rabbitmq_peer_discovery_k8s       3.9.11
    [  ] rabbitmq_prometheus               3.9.11
    [  ] rabbitmq_random_exchange          3.9.11
    [  ] rabbitmq_recent_history_exchange  3.9.11
    [  ] rabbitmq_sharding                 3.9.11
    [  ] rabbitmq_shovel                   3.9.11
    [  ] rabbitmq_shovel_management        3.9.11
    [  ] rabbitmq_stomp                    3.9.11
    [  ] rabbitmq_stream                   3.9.11
    [  ] rabbitmq_stream_management        3.9.11
    [  ] rabbitmq_top                      3.9.11
    [  ] rabbitmq_tracing                  3.9.11
    [  ] rabbitmq_trust_store              3.9.11
    [e*] rabbitmq_web_dispatch             3.9.11
    [  ] rabbitmq_web_mqtt                 3.9.11
    [  ] rabbitmq_web_mqtt_examples        3.9.11
    [  ] rabbitmq_web_stomp                3.9.11
    [  ] rabbitmq_web_stomp_examples       3.9.11
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41

    其中[E*]表示显示启动,[e*] 为隐式启动

    • 如何启用一个插件
      以上面代码为例,启用rabbitmq_web_mqtt插件
    I have no name!@0d5cb60e3a06:/opt/bitnami/rabbitmq/plugins$ rabbitmq-plugins enable rabbitmq_web_mqtt
    Enabling plugins on node rabbit@localhost:
    rabbitmq_web_mqtt
    The following plugins have been configured:
      rabbitmq_management
      rabbitmq_management_agent
      rabbitmq_mqtt
      rabbitmq_web_dispatch
      rabbitmq_web_mqtt
    Applying plugin configuration to rabbit@localhost...
    The following plugins have been enabled:
      rabbitmq_mqtt
      rabbitmq_web_mqtt
    
    started 2 plugins.
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    再查询一下插件rabbitmq_web_mqtt那一行有了[E*],表示启用了

    I have no name!@0d5cb60e3a06:/opt/bitnami/rabbitmq/plugins$ rabbitmq-plugins list
    Listing plugins with pattern ".*" ...
     Configured: E = explicitly enabled; e = implicitly enabled
     | Status: * = running on rabbit@localhost
     |/
    ....
    [E*] rabbitmq_web_mqtt                 3.9.11
    ....
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3.2 web管理页面

    能进入web管理页面的前提是启用了后台管理插件:rabbitmq_management
    访问地址:http://192.168.56.201:15672/
    其中192.168.56.201是我本机装有rabbitmq的机器ip

    先按上面学的知识,添加一个用户,并且具有配置、读、写所有资源的权限,并且设置好administrator权限,然后我们再用此用户登录管理后台

    I have no name!@0d5cb60e3a06:~$ rabbitmqctl add_user user1 123456
    Adding user "user1" ...
    Done. Don't forget to grant the user permissions to some virtual hosts! See 'rabbitmqctl help set_permissions' to learn more.
    I have no name!@0d5cb60e3a06:~$ rabbitmqctl set_permissions user1 ".*" ".*" ".*"
    Setting permissions for user "user1" in vhost "/" ...
    I have no name!@0d5cb60e3a06:~$ rabbitmqctl set_user_tags user1 administrator
    Setting tags for user "user1" to [administrator] ...
    I have no name!@0d5cb60e3a06:~$ rabbitmqctl list_permissions
    Listing permissions for vhost "/" ...
    user	configure	write	read
    user1	.*	.*	.*
    admin	.*	.*	.*
    
    I have no name!@0d5cb60e3a06:~$ rabbitmqctl list_users
    Listing users ...
    user	tags
    admin	[administrator]
    user1	[administrator]
    hello	[administrator]
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    登录成功
    在这里插入图片描述

    3.3 virtual host的管理

    在这里插入图片描述

    3.4用户的管理

    在这里插入图片描述

    3.5 Connection,Channel,Exchange,Queues的管理

    在这里插入图片描述

  • 相关阅读:
    算法练习——字符串
    [CISCN 2019 初赛]Love Math
    什么是coms coms设置图解
    窗口信息保存
    设计模式——责任链模式(Chain of Responsibility Pattern)+ Spring相关源码
    C语言实现数组逆置
    计算机毕业设计之java+ssm基于web的实验室课程管理系统
    一步步搞懂 MySQL 元数据锁(MDL)
    jmeter-事务控制器与并发控制器与if控制器项目实践
    2023 Shandong Provincial Collegiate Programming Contest
  • 原文地址:https://blog.csdn.net/suyuaidan/article/details/133272464