赞
踩
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()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。