Rabbitmq简介

1、什么是rabbitmq?

MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过写和检索出入列队的针对应用程序的数据(消息)来通信,而无需专用连接来链接它们。
RabbitMQ 是一个由 Erlang 语言开发的 AMQP(高级消息队列协议) 的开源实现。RabbitMQ 属于消息中间件,主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。

2、rabbitmq特点

  • 可靠性(Reliability)
    RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
  • 灵活的路由(Flexible Routing)
    在消息进入队列之前,通过 Exchange 来路由消息的。
  • 消息集群(Clustering)
    多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker 。
  • 高可用(Highly Available Queues)
    队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
  • 多种协议(Multi-protocol)
    RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
  • 多语言客户端(Many Clients)
    RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
  • 管理界面(Management UI)
    RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
  • 跟踪机制(Tracing)
    如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
  • 插件机制(Plugin System)
    RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

    3、rabbitmq的内部结构

    Rabbitmq集群详解_第1张图片

  • Message
    消息,消息是不具名的,它由消息头和消息体组成。
  • Publisher
    消息的生产者,也是一个向交换器发布消息的客户端应用程序。
  • Exchange
    交换器,用来接收生产者发送的消息并将这些消息路由给服务器中的队列。
  • Binding
    绑定,用于消息队列和交换器之间的关联。
  • Queue
    消息队列,用来保存消息直到发送给消费者。它是消息的容器,也是消息的终点。一个消息可投入一个或多个队列。
  • Connection
    网络连接,比如一个TCP连接。
  • Channel
    信道,多路复用连接中的一条独立的双向数据流通道。
  • Consumer
    消息的消费者,表示一个从消息队列中取得消息的客户端应用程序。
  • Virtual Host
    虚拟主机,表示一批交换器、消息队列和相关对象。虚拟主机是共享相同的身份认证和加密环境的独立服务器域。
  • Broker
    表示消息队列服务器实体。

    Rabbitmq应用

    rabbit应用模式

    单一模式
    普通模式(默认集群模式)
    镜像模式(队列做成镜像队列,存在多个节点)
    Rabbitmq的集群节点包括内存节点、磁盘节点,支持消息持久化、也就是数据写在磁盘上。

rabbit工作过程

Rabbitmq集群详解_第2张图片

(1)客户端连接到消息队列服务器,打开一个channel。
(2)客户端声明一个exchange,并设置相关属性。
(3)客户端声明一个queue,并设置相关属性。
(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。
(5)客户端投递消息到exchange。
(6)Exchange接收到消息根据消息的key和已经设置的binding,进行消息路由,将消息投递到queues中,应用程序双方就实现了通信。

Rabbitmq部署

实验说明:

一个集群中有三台服务器,其中一台使用磁盘模式,另外两台是内存模式。客户端通过前端反向代理去连接两台内存模式服务器。注意将三台服务器都连上互联网并安装软件包。

实验环境:

主机名 操作系统 IP地址 用途
mq01 CentOS7 192.168.37.128 磁盘节点
mq02 CentOS7 192.168.37.130 内存节点
mq03 CentOS7 192.168.37.131 内存节点

实验过程:

++++++三台服务器相同操作++++++
1、关闭防火墙、安全功能

systemctl stop firewalld.service
setenforce 0

2、首先修改三台服务器的主机名和hosts文件

hostnamectl set-hostname mq01
bash

vim /etc/hosts
192.168.37.128 mq01
192.168.37.130 mq02
192.168.37.131 mq03

Rabbitmq集群详解
Rabbitmq集群详解
Rabbitmq集群详解
3、yum安装软件包

yum install -y epel-release #epel为扩展软件包
yum install -y rabbitmq-server #rabbitmq软件包

4、建立软连接

ln -s /usr/lib/rabbitmq/bin/* /usr/bin/

5、查看插件安装情况

rabbitmq-plugins list

Rabbitmq集群详解_第3张图片
6、开启管理服务

rabbitmq-plugins enable rabbitmq_management

Rabbitmq集群详解_第4张图片

7、开启rabbitmq服务

systemctl start rabbitmq-server.service
netstat -ntap |grep 5672

Rabbitmq集群详解_第5张图片
8、查看各自的群集状态

rabbitmqctl cluster_status

mq01
Rabbitmq集群详解_第6张图片
mq02
Rabbitmq集群详解_第7张图片
mq03
Rabbitmq集群详解_第8张图片
9、关闭服务,复制配置文件后开启

systemctl stop rabbitmq-server.service
//隐藏文件,三台配置一样,将磁盘节点上的文件内容复制到其他2台
vim /var/lib/rabbitmq/.erlang.cookie
systemctl start rabbitmq-server.service

Rabbitmq集群详解_第9张图片
++++++以下操作在内存节点上++++++
1、将mq02、mq03内存节点服务器分别加入到磁盘节点

rabbitmqctl stop_app
rabbitmqctl join_cluster --ram rabbit@mq01 #加入到磁盘节点
#ram:以内存节点形式添加,不加磁盘形式
rabbitmqctl cluster_status #验证集群状态

mq02
Rabbitmq集群详解_第10张图片
mq03
Rabbitmq集群详解_第11张图片
2、查看mq01磁盘节点服务器的集群状态

rabbitmqctl cluster_status

Rabbitmq集群详解_第12张图片
++++++rabbit图形化操作++++++
1、登录磁盘节点服务器

http://192.168.37.128:15672/ 默认用户:guest 密码:guest

Rabbitmq集群详解_第13张图片
2、在磁盘节点服务器上创建策略

name: my_ha
pattern: ^a
Apply to : Exchange and queues
definition: ha-mode all

Rabbitmq集群详解_第14张图片
3、查看策略(三台服务器同步)
mq01
Rabbitmq集群详解_第15张图片
mq02
Rabbitmq集群详解_第16张图片
mq03
Rabbitmq集群详解_第17张图片
4、在磁盘节点服务器上增加消息队列
Name: aa
Durabiliy: Durable
Node: rabbit@mq01
Auto delete: No
Rabbitmq集群详解_第18张图片
5、在新建队列中写入消息
mode: 2-persistent
headers: a = 123
properties: id=1
payload: hello,world!
Rabbitmq集群详解_第19张图片
6、查看队列消息
Rabbitmq集群详解_第20张图片