RabbitMQ安装及使用教程

RabbitMQ安装及使用教程

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查看当前插件的使用情况,执行过之后的截图如下
RabbitMQ安装及使用教程_第1张图片
其中标记[E*]为显式启动,[e*]为隐式启动
插件启动成功后打开浏览器输入http://localhost:15672进入登录界面,界面如下 RabbitMQ安装及使用教程_第2张图片
可输入默认用户guest/guest进行登录,上文提到的所有命令行指令的功能都可以在web界面中实现

用户管理界面
RabbitMQ安装及使用教程_第3张图片
点击1可以进入用户管理界面,点击2可以查看所有用户,点击3可以新增用户,点击用户可以查看详细用户信息

vhost管理界面
RabbitMQ安装及使用教程_第4张图片
按顺序点击1->2可以进入vhost管理界面,点击3可以查看所有vhost,点击4可以新增vhost,点击具体的vhost可以查看vhost的详细信息,并可以配置vhost的权限,具体界面见下图
RabbitMQ安装及使用教程_第5张图片

Python Api

发布者

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()

你可能感兴趣的:(运维管理,rabbitmq,分布式)