RabbitMQ
文章目录
- RabbitMQ是由LShift提供的一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成,因此也是继承了这些优点。
安装
-
选择RPM包下载,选择对应平台,本次安装在CentOS7,其他平台类似。https://www.rabbitmq.com/install-rpm.html
-
由于使用了erlang语言开发,所以需要erlang的包。erlang和RabbitMQ的兼容性,参考https://www.rabbitmq.com/which-erlang.html#compatibility-matrix
-
第二种错误,可以修改host文件,修改主机名即可
-
下载 rabbitmq-server-3.7.16-1.el7.noarch.rpm、erlang-21.3.8.6-1.el7.x86_64.rpm。socat在CentOS中源中有。
yum -y install erlang-21.3.8.6-1.el7.x86_64.rpm rabbitmq-server-3.7.16-1.el7.noarch.rpm
- 查看安装的文件
[root@xdd ~]# rpm -ql rabbitmq-server
/etc/logrotate.d/rabbitmq-server
/etc/profile.d/rabbitmqctl-autocomplete.sh
/etc/rabbitmq
/usr/lib/ocf/resource.d/rabbitmq/rabbitmq-server
/usr/lib/ocf/resource.d/rabbitmq/rabbitmq-server-ha
/usr/lib/rabbitmq/autocomplete/bash_autocomplete.sh
/usr/lib/rabbitmq/autocomplete/zsh_autocomplete.sh
/usr/lib/rabbitmq/bin/cuttlefish
/usr/lib/rabbitmq/bin/rabbitmq-defaults
配置
环境配置
- 使用系统环境变量,如果没有使用rabbitmq-env.conf中定义环境变量,否则使用缺省值
RABBITMQ_NODE_IP_ADDRESS the empty string, meaning that it should bind to all network interfaces.
RABBITMQ_NODE_PORT 5672
RABBITMQ_DIST_PORT RABBITMQ_NODE_PORT + 20000 #内部节点和客户端工具通信用
RABBITMQ_CONFIG_FILE 配置文件路径默认为/etc/rabbitmq/rabbitmq
环境变量文件,可以不配置
工作特性配置文件
- rabbitmq.config配置文件
- 3.7支持新旧两种配置文件格式
- erlang配置文件格式,为了兼容继续采用
2. sysctl格式,如果不需要兼容,RabbitMQ鼓励使用。 (这个文件也可以不配置)
插件管理
列出所有可用插件
rabbitmq-plugins list
- 启动WEB管理插件,会依赖启用其他几个插件。
[root@xdd rabbitmq]$ rabbitmq-plugins enable rabbitmq_management
启动服务
systemctl start rabbitmq-server
- 启动中,可能出现下面的错误
Error when reading /var/lib/rabbitmq/.erlang.cookie:eacces
这就是这个文件的权限问题,修改属组、属组为rabbitmq即可
chown rabbitmq.rabbitmq /var/lib/rabbitmq/.erlang.cookie
- 服务启动成功
[root@xdd ~]# ss -tanl | grep 5672
LISTEN 0 128 *:25672 *:*
LISTEN 0 128 *:15672 *:*
LISTEN 0 128 :::5672 :::*
[root@xdd ~]#
用户管理
-
开始登陆WEB界面,
http://192.168.61.108(rabbitmq所在主机的ip):15672
-
使用guest/guest只能本地登陆,远程登录会报错
- rabbitmqctl命令
rabbitmqctl [-n <node>] [-1][-q] <command> [<command options>]
- General options:
-n
node-q
,–quiet-t
,–timeout timeout-l
longnames
- Commands:
add_user <username> <password>
添加用户list_user
列出用户delete_user username
删除用户change_password <username> <password>
修改用户名,密码set_user_tags <username> <tag> [...]
设置用户tag- list_user_permissions 列出用户权限
-
添加用户:
rabbitmqctl add_user username password
-
删除用户:
rabbitmqctl delete_user username
-
更改密码:
rabbitmqctl change_password username newpassword
-
设置权限Tags,其实就是分配组:
rabbitmqctl set_user_tags username tag
-
设置xdd用户为管理员tag后登陆
# rabbitmqctl add_user gdy gdy #添加xdd用户
# rabbitmqctl list_users #查看所有用户
# rabbitmqctl set_user_tags gdy administrator #设置xdd用户为管理员用户
-
tag的意义如下:
- administrator可以管理用户、权限、虚拟主机。
- administrator可以管理用户、权限、虚拟主机。
-
基本信息(web管理端口15672,协议端口5672)
-
虚拟主机
- 缺省虚拟主机,默认只能是guest用户在本机链接,下图新建的用户gdy默认无法访问任何虚拟主机
- 缺省虚拟主机,默认只能是guest用户在本机链接,下图新建的用户gdy默认无法访问任何虚拟主机
Pika库
- Pika是纯Python实现的支持AMQP协议的库
pip install pika
RabbitMQ工作原理及应用
工作模式
- 名词解释
名词 | 说明 |
---|---|
Server | 服务器 接受客户端连接,实现消息队列及路由功能的进程(服务),也称为消息代理 注意:客户端可用生产者,也可以是消费者,它们都需要连接到Server |
Connection | 网络物理连接 |
Channel | 一个连接允许多个客户端连接 |
Exchange | 交换器。接收生产者发来的消息,决定如何路由给服务器中的队列。 常用的类型有: direct(point-to-point) topic(publish-subscribe) fanout(multicast) |
Message | 消息 |
Message Queue | 消息队列,数据的存储载体 |
Bind | 绑定 建立消息队列和交换器之间的关系,也就是说交换器拿到数据,把什么样的数据送给哪个队列 |
Virtual Host | 虚拟主机 一批交换器、消息队列和相关对象的集合。为了多用户互不干扰,使用虚拟主机分组交换机,消息队列 |
Topic | 主题、话题 |
Broker | 可等价为Server |
1.队列
- 这种模式就是最简单的生产者消费者模型,消息队列就是一个FIFO的队列
- 生产者send.py,消费者receie.py
- 官方例子:https://www.rabbitmq.com/tutorials/tutorial-one-python.html
- 注意:出现如下运行结果
pika.exceptions.ProbableAuthenticationError: (403, 'ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.')
- 访问被拒绝,还是权限问题,原因还是guest用户只能访问localhost上的缺省虚拟主机
- 解决办法
- 缺省虚拟主机,默认只能在本机访问,不要修改为远程访问,是安全的考虑。
- 因此,在Admin中Virtual hosts中,新建一个虚拟主机test。
- 注意:新建的test虚拟主机的Users是谁,本次是gdy用户
-
在ConnectionParameters中没有用户名、密码填写的参数,它使用参数credentials传入,这个需要构建一个pika.credentials.Credentials对象。
-
参照官方例子,写一个小程序
# send.py
import pika
from pika.adapters.blocking_connection import BlockingChannel
#构建用户名密码对象
credential = pika.PlainCredentials("gdy","gdy")
# 配置链接参数
params = pika.ConnectionParameters(
"192.168.61.108",#ip地址
5672, #端口
"test",#虚拟机
credential #用户名密码
)
# # 第二种建立连接方式
# params = pika.URLParameters("amqp://gdy:gdy@192.168.61.108:5672/test")
# 建立连接
connection = pika.BlockingConnection(params)
with connection:
# 建立通道
channel:BlockingChannel = connection.channel()
#创建一个队列,queue命名为hello,如果queue不存在,消息将被dropped
channel.queue_declare(queue="hello")
channel.basic_publish(
exchange="",#使用缺省exchange
routing_key="hello", #routing_key必须指定,这里要求和目标queue一致
body="Hello world" #消息
)
print("消息发送成功Sent Message OK")
-
测试通过。去服务管理界面查看Exchanges和Queues。
-
URLParameters,也可以使用URL创建参数
# amqp://username:password@host:port/<virtual_host>[?query-string]
parameters = pika.URLParameters('amqp://guest:guest@rabbit-server1:5672/%2F')