RabbitMQ

本文详细介绍了RabbitMQ的安装、配置、插件管理、工作原理及应用,包括队列、工作队列、发布订阅模式、路由模式和Topic话题。通过实例展示了Pika库的使用,并探讨了RabbitMQ在RPC远程过程调用中的作用,以及消息队列在系统解耦和速度匹配中的价值。
摘要由CSDN通过智能技术生成

RabbitMQ

  • RabbitMQ是由LShift提供的一个Advanced Message Queuing Protocol(AMQP)的开源实现,由以高性能、健壮以及可伸缩性出名的Erlang写成,因此也是继承了这些优点。

安装

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支持新旧两种配置文件格式
  1. erlang配置文件格式,为了兼容继续采用

rabbitmq_001
2. sysctl格式,如果不需要兼容,RabbitMQ鼓励使用。 (这个文件也可以不配置)

rabbitmq_002

插件管理

列出所有可用插件

rabbitmq-plugins list

  • 启动WEB管理插件,会依赖启用其他几个插件。
[root@xdd rabbitmq]$ rabbitmq-plugins enable rabbitmq_management

启动服务

systemctl start rabbitmq-server

  • 启动中,可能出现下面的错误
    1. 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
    rabbitmq_003

  • 使用guest/guest只能本地登陆,远程登录会报错

  1. rabbitmqctl命令
    • rabbitmqctl [-n <node>] [-1][-q] <command> [<command options>]
    • General options:
      1. -n node
      2. -q,–quiet
      3. -t,–timeout timeout
      4. -l longnames
    • Commands:
      1. add_user <username> <password> 添加用户
      2. list_user 列出用户
      3. delete_user username 删除用户
      4. change_password <username> <password> 修改用户名,密码
      5. set_user_tags <username> <tag> [...] 设置用户tag
      6. 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的意义如下:

    1. administrator可以管理用户、权限、虚拟主机。
      rabbitmq_004
  • 基本信息(web管理端口15672,协议端口5672)
    rabbitmq_005

  • 虚拟主机

    1. 缺省虚拟主机,默认只能是guest用户在本机链接,下图新建的用户gdy默认无法访问任何虚拟主机
      rabbitmq_006

Pika库

  • Pika是纯Python实现的支持AMQP协议的库
    1. pip install pika

RabbitMQ工作原理及应用

工作模式

rabbitmq_007

rabbitmq_008

  • 名词解释
名词 说明
Server 服务器
接受客户端连接,实现消息队列及路由功能的进程(服务),也称为消息代理
注意:客户端可用生产者,也可以是消费者,它们都需要连接到Server
Connection 网络物理连接
Channel 一个连接允许多个客户端连接
Exchange 交换器。接收生产者发来的消息,决定如何路由给服务器中的队列。
常用的类型有:
direct(point-to-point)
topic(publish-subscribe)
fanout(multicast)
Message 消息
Message Queue 消息队列,数据的存储载体
Bind 绑定
建立消息队列和交换器之间的关系,也就是说交换器拿到数据,把什么样的数据送给哪个队列
Virtual Host 虚拟主机
一批交换器、消息队列和相关对象的集合。为了多用户互不干扰,使用虚拟主机分组交换机,消息队列
Topic 主题、话题
Broker 可等价为Server
1.队列
  1. 注意:出现如下运行结果
pika.exceptions.ProbableAuthenticationError: (403, 'ACCESS_REFUSED - Login was refused using authentication mechanism PLAIN. For details see the broker logfile.')
  • 访问被拒绝,还是权限问题,原因还是guest用户只能访问localhost上的缺省虚拟主机
  • 解决办法
    1. 缺省虚拟主机,默认只能在本机访问,不要修改为远程访问,是安全的考虑。
    2. 因此,在Admin中Virtual hosts中,新建一个虚拟主机test。
    3. 注意:新建的test虚拟主机的Users是谁,本次是gdy用户

rabbitmq_010

  • 在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。
    rabbitmq_011

  • URLParameters,也可以使用URL创建参数

# amqp://username:password@host:port/<virtual_host>[?query-string] 
parameters = pika.URLParameters('amqp://guest:guest@rabbit-server1:5672/%2F')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值