文章目录
RabbitMQ是一个在AMQP协议标准基础上完善的,可复用的消息中间件。
它遵循Mozilla Public License开源协议,采用 Erlang 实现的工业级的消息队列(MQ)服务器,Rabbit MQ 是建立在Erlang OTP平台上;
具有可伸缩性(即集群服务),消息持久化的特性。
好文章 记得收藏+点赞+关注额 !!!---- Nick.Peng
一、下载并安装 Erlang
因为 RabbitMQ 服务器是基于 Erlang 环境的,所以安装 RabbitMQ 服务器前必须先安装 Erlang;
安装 Erlang 时要注意安装的 RabbityMQ 所依赖的 Erlang 版本,根据 RabbitMQ 的要求选择一个版本,这里我要安装的RabbitMQ 的版本是 3.8.1 ,他依赖的 Erlang 版本范围是 21.3.x ~ 22.x,因此我选择版本是 OTP 22.1. Erlang下载地址。
也可点击查看:RabbitMQ 对应的 Erlang 依赖版本地址。
-
安装 Erlang
找到下载的文件,直接按照以下步骤安装即可,如图:
-
设置 ERLANG_HOME 环境变量
在桌面右击 此电脑–>点击属性,按下图所示步骤设置即可:
注意:如果之前安装了Erlang的其他版本,需要卸载后在进行重新安装和设置。 -
验证Erlang是否安装成功:
快捷键 win+Q,在输入框输入 Erlang,点击启动 Erlang,出现如下界面,说明Erlang安装成功了。接下来就安装RabbitMQ。
二、下载并安装 RabbitMQ
进入RabbitMQ的官方网站下载最新版本的RabbitMQ服务器安装程序
-
安装 RabbitMQ
找到下载文件rabbitmq-server-3.8.1.exe,然后双击按照以下步骤安装即可;安装完成后会作为系统服务自动启动
-
设置RABBITQM_SERVER环境变量
为了能够在任意Windows命令窗口上操控RabbitMQ服务,我们需要设置设置RABBITQM_SERVER环境变量,并且将其添加到系统的 PHTH 环境变量中。如图:
这样就可以在windows administrator启动的CMD窗口操控RabbitMQ服务了。不需要每次都定位到:
D:\Develop\RabbitMQ Server\rabbitmq_server-3.8.1\sbin>
三、安装 rabbitmq_management
-
查看 RabbtitMQ 的所有插件
输入命令:
rabbitmq-plugins list
,可以看到 RabbtitMQ 的所有插件,如图:
-
安装 rabbitmq_management 可视化界面插件
输入命令:
rabbitmq-plugins enable rabbitmq_management
,即可安装可视化界面插件,运行完命令后,看到下图表示安装成功了;这款插件可以以操作界面的方式查看RabbitMQ 服务器实例的状态,以及操控RabbitMQ服务器。
现在我们在浏览器中输入:http://localhost:15672 可以看到一个登录界面:
这里可以使用默认账号guest/guest登录后的界面如下:
在浏览器中输入 http://localhost:15672/api/ 就可以看到 RabbitMQ Management HTTP API 文档,如下图:
四、管理 rabbitmq_management 用户
-
查看 rabbitmq 已注册用户
命令:
rabbitmqctl list_users
发现现在只有一个用户guest,并且它的tag是administrator. -
创建一个用户
命令:
rabbitmqctl add_user [username] [password]
即:rabbitmqctl add_user root root
现在看下有多少用户,输入命令:rabbitmqctl list_users
发现用户列表里多了一个用户 root,但是tag是空的。 -
给用户root设置tag
命令:
rabbitmqctl set_user_tags root administrator ...
出现上图表明设置tag成功;tag 共有5种,分别是:administrator ,monitoring,policymaker,management和none,其实这里的tag代表的是权限,administrator是最高权限。注意:上述讲的是用命令创建用户,给用户添加权限;另在可视化界里面也可以创建用户,创建交换机(Exchange)和创建队列(Queque)等等。
五、利用Python实现测试
-
RabbitMQ 常见实现方式有5种,这里用 topic 来举例,原理图如下:
-
Producer 生产者代码
#!/usr/bin/env python # -*- coding:utf-8 -*- import pika import sys connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() # 创建一个通道 channel.exchange_declare(exchange='topic_logs', exchange_type='topic') routing_key = sys.argv[1] if len(sys.argv) > 2 else 'anonymous.info' # 声明queue, 可接受命令行传参 message = ' '.join(sys.argv[2:]) or 'Hello World!' channel.basic_publish( exchange='topic_logs', # 交换机,按指定的策略转发到不同Queue routing_key=routing_key, # 发送至queue的名字 body=message) # 发送的消息内容 print(" [x] Sent %r:%r" % (routing_key, message)) connection.close()
-
Consumer 消费者代码
#!/usr/bin/env python # -*- coding:utf-8 -*- import time import pika import sys connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost')) channel = connection.channel() # 创建一个通道 channel.exchange_declare(exchange='topic_logs', exchange_type='topic') result = channel.queue_declare('', exclusive=True) queue_name = result.method.queue binding_keys = sys.argv[1:] if not binding_keys: sys.stderr.write("Usage: %s [binding_key]...\n" % sys.argv[0]) sys.exit(1) for binding_key in binding_keys: channel.queue_bind( exchange='topic_logs', queue=queue_name, routing_key=binding_key) def callback(ch, method, properties, body): # 回调函数 # time.sleep(30) print(" [x] %r:%r" % (method.routing_key, body)) # ch.basic_ack(delivery_tag=method.delivery_tag) # 服务器确认是否处理完毕 channel.basic_consume( # 消费消息 queue=queue_name, # 如果收到消息,就调用callback函数来处理消息 on_message_callback=callback, # 告诉rabbitMQ使用callback来接收消息 auto_ack=True) # 服务器不确认消息是否处理完毕 # 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理,按ctrl+c退出 print(' [*] Waiting for logs. To exit press CTRL+C') channel.start_consuming()
-
分别运行 consumer.py 和 producer.py 输入消息和接收消息效果如下: