RabbitMQ安装
镜像检索以及下载
使用docker的搜索命令docker search rabbitmq
在docker仓库中搜索RabbitMQ ,会搜索到如下结果:
下载命令:docker pull rabbitmq:management
rabbitmq:management 指定了安装rabbitmq的Web管理插件版本,这样就不用再进入容器内部开启插件了
查看我们下载的镜像:docker images
启动RabbitMQ
docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 -v `pwd`/opt/rabbitmq:/var/lib/rabbitmq --hostname myRabbit -e RABBITMQ_DEFAULT_VHOST=my_vhost -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=admin 这里放你MQ的IMAGE ID
- -d 表示的是后台运行容器
- --name 给容器指定名字。这个是给自己看的,docker ps的时候展示的名字
- 第一个 -p 指定的是服务运行的端口。(提供服务的端口)
- 第二个 -p 指定的是web管理端的端口。接下来会看到管理端的界面
- -v 映射目录或者文件。这里是把你当前所在目录下的/opt/rabbitmq文件夹映射到容器的/var/lib/rabbitmq
- --hostname 指定主机名称。该名称在集群的名称中使用
- -e 指定环境变量
- RABBITMQ_DEFAULT_VHOST:默认虚拟机名
- RABBITMQ_DEFAULT_USER:默认的用户名
- RABBITMQ_DEFAULT_PASS:默认用户名的密码
注意:
- 服务端口与web端口指定的顺序不重要,前后颠倒也是可以的。因为docker内部RabbitMQ的端口是固定的
- 命令中的
pwd
相当于是一个变量取值的操作,与$的能力类似,但是用途不太一样。其实就是执行了pwd的命令,然后把结果替换掉pwd
。如果我说的不明白可以看看这里 - 最好是确保你的主机目录下有你指定的映射目录、容器中的无所谓,会自动创建
- RabbitMQ的hostname 最好指定。Rabbit MQ的有一个重要的注意事项是它根据节点名称来存储数据,默认就是主机名、而上面说道hostname就是集群中的节点名称。如果不指定hostname,那么docker在启动的时候会自动生成hostname,如此一来可能每次生成的hostname都不一样,那么就会导致数据丢失
查看是否启动成功
使用命令docker ps
查看一下是否启动成功了,可以看到我们指定的名字 rabbitmq 已经起来了
也可以直接访问http://ip:15672
查看管理界面能否打开。
如果启动失败了,使用命令docker logs 复制的CONTAINER ID
来查看时什么问题
简单使用
发送数据:
如果生成多个的话,实现效果是轮询发送,一个一个循环发送数据,如同“皇帝轮流做…”
import pika
#建立连接
userx=pika.PlainCredentials("admin","admin")
conn=pika.BlockingConnection(pika.ConnectionParameters("10.10.10.235",5672,'my_vhost',credentials=userx))
#开辟管道
channelx=conn.channel()
#声明队列,参数为队列名
channelx.queue_declare(queue="MQtest")
#发送数据,发送一条,如果要发送多条则复制此段
for i in range(1000000):
channelx.basic_publish(exchange="",
routing_key="MQtest", # 队列名
body="hello world" # 发送的数据
)
print("--------发送数据完成-----------")
#关闭连接
conn.close()
接收数据:
import pika
#建立连接
userx=pika.PlainCredentials("admin","admin")
conn=pika.BlockingConnection(pika.ConnectionParameters("10.10.10.235",5672,'my_vhost',credentials=userx))
#开辟管道
channelx=conn.channel()
#声明队列,参数为队列名
channelx.queue_declare(queue="MQtest")
#消息处理函数,执行完成才说明接收完成,此时才可以接收下一条,串行
def dongcallbackfun(v1,v2,v3,bodyx):
print("得到的数据为:",bodyx)
#接收准备
channelx.basic_consume(queue="MQtest", #队列名
on_message_callback=dongcallbackfun, #收到消息的回调函数
auto_ack=True #是否发送消息确认
)
print("-------- 开始接收数据 -----------")
#开始接收消息
channelx.start_consuming()