avatar

Catalog
RabbitMQ 总结及安装

RabbitMQ 总结

1. RabbitMQ 简介

AMQP

  1. AMQP(Advanced Message Queuing Protocol,高级消息队列协议)是一个进程间传递异步消息的网络协议。

  2. 工作过程

    发布者(Publisher)发布消息(Message),经由交换机(Exchange)。

    交换机根据路由规则将收到的消息分发给与该交换机绑定的队列(Queue)。

    最后 AMQP 代理会将消息投递给订阅了此队列的消费者,或者消费者按照需求自行获取。

  3. server:又称broker,接受客户端连接,实现AMQP实体服务。
    connection:连接和具体broker网络连接。
    channel:网络信道,几乎所有操作都在channel中进行,channel是消息读写的通道。客户端可以建立多个channel,每个channel表示一个会话任务。
    message:消息,服务器和应用程序之间传递的数据,由properties和body组成。properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性;body是消息实体内容。
    Virtual host:虚拟主机,用于逻辑隔离,最上层消息的路由。一个Virtual host可以若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。
    Exchange:交换机,接受消息,根据路由键转发消息到绑定的队列上。
    banding:Exchange和Queue之间的虚拟连接,binding中可以包括routing key
    routing key:一个路由规则,虚拟机根据他来确定如何路由 一条消息。
    Queue:消息队列,用来存放消息的队列。
    
  4. 消息模型

    *所有 MQ 产品从模型抽象上来说都是一样的过程: 消费者(consumer)订阅某个队列。生产者(producer)创建消息,然后发布到队列(queue)中,最后将消息发送到监听的消费者 *

  5. RabbitMQ 基本概念

    1. Message

      消息,消息是不具名的,它由消息头和消息体组成。消息体是不透明的,而消息头则由一系列的可选属性组成,这些属性包括routing-key(路由键)、priority(相对于其他消息的优先权)、delivery-mode(指出该消息可能需要持久性存储)等。

    2. Publisher

      消息的生产者,也是一个向交换器发布消息的客户端应用程序。

    3. Exchange

      交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。

    4. Binding

      绑定,用于消息队列和交换器之间的关联。一个绑定就是基于路由键将交换器和消息队列连接起来的路由规则,所以可以将交换器理解成一个由绑定构成的路由表。

    5. Queue

      消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。消息一直在队列里面,等待消费者连接到这个队列将其取走。

    6. Connection

      网络连接,比如一个TCP连接。

    7. Channel

      信道,多路复用连接中的一条独立的双向数据流通道。信道是建立在真实的TCP连接内地虚拟连接,AMQP 命令都是通过信道发出去的,不管是发布消息、订阅队列还是接收消息,这些动作都是通过信道完成。因为对于操作系统来说建立和销毁 TCP 都是非常昂贵的开销,所以引入了信道的概念,以复用一条 TCP 连接。

    8. Consumer

      消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。

    9. Virtual Host

      虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。每个 vhost 本质上就是一个 mini 版的 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制。vhost 是 AMQP 概念的基础,必须在连接时指定,RabbitMQ 默认的 vhost 是 / 。

    10. Broker

      表示消息队列服务器实体。

2. RabbitMQ 安装及验证

1. 安装Erlang

由于RabbitMQ依赖Erlang, 所以需要先安装Erlang。 
java
1
2
3
4
5
添加erlang solutions源
$ wget https://packages.erlang-solutions.com/erlang-solutions-1.0-1.noarch.rpm
$ sudo rpm -Uvh erlang-solutions-1.0-1.noarch.rpm

$ sudo yum install erlang

安装验证

java
1
erl

2. 安装RabbitMQ

  1. 先下载rpm

    java
    1
    wget http://www.rabbitmq.com/releases/rabbitmq-server/v3.6.6/rabbitmq-server-3.6.6-1.el7.noarch.rpm
  2. 下载完成后安装

    java
    1
    yum install rabbitmq-server-3.6.6-1.el7.noarch.rpm
  3. 关于RabbitMQ的配置,可以下载RabbitMQ的配置文件模板/etc/rabbitmq/rabbitmq.config, 然后按照需求更改即可。 设置配置文件

    java
    1
    cp /usr/share/doc/rabbitmq-server-3.6.6/rabbitmq.config.example /etc/rabbitmq/rabbitmq.config
  4. 访问url:ip:15672,如果访问不了,要把防火墙关了。同时要在服务器上开放567215672端口

    java
    1
    2
    /sbin/iptables -I INPUT -p tcp --dport 5672 -j ACCEPT  
    /sbin/iptables -I INPUT -p tcp --dport 15672 -j ACCEPT

    注意 !

    利用wget下载东西时,比如输入指令wget www.baidu.com
    提示报错

    java
    1
    2
    “wget: unable to resolve host address …”
    wget:无法解析主机地址。这就能看出是DNS解析的问题

    解决办法:修改/etc/resolv.conf文件,添加nameserver即可,下面给出两个通用的谷歌域名服务器,如果有自己解析服务器也可以换成自己的

    1
    2
    3
    vim /etc/resolv.conf
    nameserver 8.8.8.8 #google域名服务器
    nameserver 8.8.4.4 #google域名服务器

3. RabbitMQ 的一些操作

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo chkconfig rabbitmq-server on 			 # 添加开机启动RabbitMQ服务
service rabbitmq-server start # 启动服务
sudo /sbin/service rabbitmq-server status # 查看服务状态
service rabbitmq-server stop # 停止服务
sudo rabbitmqctl list_users # 查看当前所有用户

由于RabbitMQ默认的账号用户名和密码都是guest。为了安全起见, 先删掉默认用户
sudo rabbitmqctl delete_user guest

sudo rabbitmqctl add_user username password # 添加新用户

sudo rabbitmqctl set_user_tags username administrator # 设置用户tag

sudo rabbitmqctl set_permissions -p / username ".*" ".*" ".*" # 赋予用户默认vhost的全部操作权限

sudo rabbitmqctl list_user_permissions username # 查看用户的权限
sudo rabbitmq-plugins enable rabbitmq_management # 开启web管理接口

开启远程访问

默认情况下,RabbitMQ的默认的guest用户只允许本机访问, 如果想让guest用户能够远程访问的话,只需要将配置文件中的loopback_users列表置为空即可,如下:

Code
1
2
3
4
5
vim /etc/rabbitmq/rabbitmq.config

将 %%{loopback_users, []},

改成 {loopback_users, []}

另外关于新添加的用户,直接就可以从远程访问的,如果想让新添加的用户只能本地访问,可以将用户名添加到上面的列表, 如只允许admin用户本机访问。

Code
1
{loopback_users, ["admin"]}

更新配置后,别忘了重启服务哦!


有想法的小伙伴可以进入我的Github查看源码

** 在哪里跌倒,就在哪里趴下,休息一会儿你会发现新大陆的哦~ **

Author: ClodSleep666
Link: https://bugger.top/2020/05/27/1010914/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
    微信
  • 支付寶
    支付寶

Comment