rabbitMQ的虚拟服务器,每一个rabbitMQ服务器都能创建虚拟服务器,而每一个vhost本质上又是一个独立的小型rabbitMQ服务器,拥有自己独立的队列、交换器、及绑定关系,并拥有自己独立权限,类似电脑的实体机和虚拟机的关系,rabbitMQ默认创建一个“/”的vhost
用户
在rabbitMQ中,用户是访问控制的基本单元,可以类似理解成linux系统的用户
角色
用户的身份,就类似于a用户是学生;b用户是老师,那么显然老师和学生的权限是不同的,同样,不同角色的rabbitMQ用户对于rabbitMQ的权限也不同,角色固定可以取以下值
none
:无任何角色。新建用户的角色默认为none
management
:可以访问web界面
policymaker
:包含management的所有权限,并可管理策略和参数
monitoring
:包含management的所有权限,并可以看到所有连接、信道及节点相关信息
administrator
:包含monitoring的所有权限,并可以管理用户、vhost、权限、策略、参数等
权限
RabbitMQ权限是基于vhost的,意思就是设置权限就是设置一个用户在vhost的操作范围,有以下几个操作范围
conf
:可配置权限
write
:可写
read
:可读
新增用户 rabbitmqctl add_user {username} {passwd}
eg. rabbitmqctl add_user root root123
创建一个用户名为root、密码为root123的用户
修改密码 rabbitmqctl change_password {username} {newpasswd}
eg. rabbitmqctl change_password root root321
清除密码 rabbitmqctl clear_password {username}
eg. rabbitmqctl clear_password root
验证用户密码 rabbitmqctl authenticate_user {username} {passwd}
删除用户 rabbitmqctl delete_user
显示当前所有用户 rabbitmqctl list_users
设置用户角色 rabbitmqctl set_user_tags {username} {tag}
eg. rabbitmqctl set_user_tags root administrator
设置root角色为administrator
创建vhost rabbitmqctl add_vhost {vhost}
列出当前所有vhost的信息 rabbitmqctl list_vhosts [option]
,其中option
取值如下
name
:表示显示vhost名称
tracing
:表示是否启用了rabbitMQ的trace功能
删除vhost rabbitmqctl delete_vhost {vhost}
授权指令 rabbitmqctl set_permissions [-p vhost] {user} {conf} {write} {read}
vhost
:设置权限的vhost,如果指定则为“/”
user
:设置权限的用户
conf
:一个正则表达式,表示用户在哪些资源上有可配置的权限
write
:一个正则表达式,表示用户在哪些资源上有可写权限
read
:一个正则表达式,表示用户在哪些资源上有可读权限
eg. rabbitmqctl set_permissions -p vhost1 root “^test." ".” “.*” 设置root在vhost1上的权限,在以test开头的资源上有可配置权限,在其他所有资源上有可读写权限
清除权限 rabbitmqctl clear_permissions [-p vhost] {username}
显示虚拟主机上的权限 rabbitmqctl list_permissions [-p vhost]
显示用户权限 rabbitmqctl list_user_permissions {user}
RabbitMQ
镜像docker pull rabbitmq
RabbitMQ
容器启动命令:
docker run -d -p 15672:15672 -p 5672:5672 -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin --hostname myRabbit --name rabbitmq rabbitmq
参数说明:
-d
:表示在后台运行容器;
-p
:将容器的端口 5672(应用访问端口)和 15672 (控制台Web端口号)映射到主机中;
-e
:指定环境变量:
RABBITMQ_DEFAULT_VHOST
:默认虚拟机名;
RABBITMQ_DEFAULT_USER
:默认的用户名;
RABBITMQ_DEFAULT_PASS
:默认的用户密码;
--hostname
:指定主机名(RabbitMQ 的一个重要注意事项是它根据所谓的 节点名称 存储数据,默认为主机名);
--name
rabbitmq:设置容器名称;
rabbitmq
:容器使用的镜像名称;
设置 docker 启动的时候自动启动(可选):
docker update rabbitmq --restart=always
rabbitmq_management
docker exec -it rabbitmq /bin/bash
---------------------------------
user@7b295c46c99d /: rabbitmq-plugins enable rabbitmq_management
使用图形界面前需要开启rabbitMQ的managment的插件,开始此插件的指令:
rabbitmq-plugins enable rabbitmq_management
可使用rabbitmq-plugins list
查看当前插件的使用情况,执行过之后的截图如下
其中标记[E*]为显式启动,[e*]为隐式启动
插件启动成功后打开浏览器输入http://localhost:15672进入登录界面,界面如下
可输入默认用户guest/guest进行登录,上文提到的所有命令行指令的功能都可以在web界面中实现
用户管理界面
点击1可以进入用户管理界面,点击2可以查看所有用户,点击3可以新增用户,点击用户可以查看详细用户信息
vhost管理界面
按顺序点击1->2可以进入vhost管理界面,点击3可以查看所有vhost,点击4可以新增vhost,点击具体的vhost可以查看vhost的详细信息,并可以配置vhost的权限,具体界面见下图
import pika
#建立连接
userx=pika.PlainCredentials("xx","xx")
conn=pika.BlockingConnection(pika.ConnectionParameters("xx.xx.xx.xx",5672,'my_vhost',credentials=userx))
#开辟管道
channelx=conn.channel()
#声明发布和订阅通道,如果可以确认通道存在则可以去掉该句
channelx.exchange_declare(exchange="shupian2",exchange_type="direct")
#发送数据
channelx.basic_publish(exchange="shupian2",#确定发布主题为:shupian2
routing_key="test1", #确定发布的队列(发布的主题):test1
body="nihao 666", # 确定发送的数据
)
#发送数据
channelx.basic_publish(exchange="shupian2",#确定发布主题为:shupian2
routing_key="test2", #确定发布的队列(发布的主题):test2
body="nihao 555", # 确定发送的数据
)
print("--------发送数据完成-----------")
#关闭连接
conn.close()
import pika
import time
#建立连接
userx=pika.PlainCredentials("xx","xx")
conn=pika.BlockingConnection(pika.ConnectionParameters("xx.xx.xx.xx",5672,'my_vhost',credentials=userx))
#开辟管道
channelx=conn.channel()
#声明发布和订阅通道,如果可以确认通道存在则可以去掉该句
channelx.exchange_declare(exchange="shupian2",exchange_type="direct")
#声明队列,生成一个随机的且不存在的队列,该队列会在连接断开后自动销毁
resqueue=channelx.queue_declare('', exclusive=True)
#得到随机生成的队列名
queuenamex=resqueue.method.queue
#将队列和发布数据绑定,确定订阅主题为:test1 和 test2
channelx.queue_bind(exchange="shupian2",queue=queuenamex,routing_key="test1")
channelx.queue_bind(exchange="shupian2",queue=queuenamex,routing_key="test2")
#消息处理函数,执行完成才说明接收完成,此时才可以接收下一条,串行
def dongcallbackfun(channlx,methodx,v3,bodyx):
time.sleep(10)
print("队列名(订阅的主题名)为:%r 得到的数据为:%r "%(methodx.routing_key,bodyx))
channelx.basic_qos(prefetch_count=1)
#接收准备
#这里移除了no_ack=True这个参数,也即需要对message进行确认(默认行为)
#否则consumer在偶然down后其正在处理和分配到该consumer还未处理的message可能发生丢失
#因为此时RabbitMQ在发送完message后立即从内存删除该message
#假如没有设置no_ack=True则consumer在偶然down掉后其正在处理和分配至该consumer但还未来得及处理的message会重新分配到其他consumer
#没有设置no_ack=True则consumer在收到message后会向RabbitMQ反馈已收到并处理了message告诉RabbitMQ可以删除该message
#RabbitMQ中没有超时的概念,只有在consumer down掉后重新分发message
channelx.basic_consume(on_message_callback=dongcallbackfun, #收到消息的回调函数
queue=queuenamex, #队列名
auto_ack=True
)
print("-------- 开始接收数据 -----------")
#开始接收消息
channelx.start_consuming()