RabbitMQ 消息中间件总结

​优质博文:IT-BLOG-CN

RabbitMQ是实现高级消息队列协议(AMQP:Advanced Message Queue Protocol)的开源代理软件,也称为面向消息的中间件。支持多种操作系统、多种编程语言。RabbitMQ服务器使用Erlang语言编写,其集群和故障转移是构建在开放电信平台框架上的。

AMQP是一个面向消息中间件的开放式应用层协议。定义消息方向、消息队列、消息路由、可靠性、安全性等特性。要求消息的提供者和客户端接收者的行为要实现对不同供应商可以用相同的方式(FTP/HTTP/SMTP等)进行互相操作。以往的JMS,主要是建立在API级别,建立标准化的程序间的互操作性。而AMQP是一个线路级协议。描述的是通过网络发送的数据传输格式,任何符合该数据格式的消息发送和接收工具都能互相兼容和进行操作,这样就可以实现跨技术平台的架构方案。

一、基本概念

【1】Broker 消息队列服务器的实体,负责接收生产者的消息,然后将消息发送到消息接受者或者其他Broker
【2】Exchange 消息交换机,消息第一个到达的地方,消息通过它指定的路由规则,分发到不同的消息队列中去。
【3】Queue 消息队列,消息通过发送和路由之后最终到达的地方,到达Queue的消息即进入逻辑上等待消费的状态。每个消息都会被发送到一个或多个队列。
【4】Binding 绑定,它的作用是把ExchangeQueue按照路由规则绑定起来(虚拟连接)。
【5】Routing Key 路由关键字,Exchange根据这个关键字进行消息投递。
【6】Virtual host 虚拟主机,它是对Broker的虚拟划分,将消费者、生产者和他们依赖的AMQP相关结构进行隔离,一般都是为了安全考虑。比如,我们可以在一个Broker中设置多个虚拟主机,对不同用户进行权限管理。
【7】Connection 连接,代表生产者、消费者、Broker之间进行通信的物理网络。
【8】Channel 消息通道,用户连接生产者与消费者的逻辑结构。在客户端的每个连接里,可建立多个Channel,每个Channel,每个Channel代表一个会话任务,通过Channel可以隔离同一连接中的不同交互内容。
【9】Producer 消息生产者,制造消息并发送消息的程序。
【10】Consumer 消息消费者,接收消息并处理消息的程序。

二、消息传递到队列的过程

【1】客户端连接到消息队列服务器,打开一个Channel
【2】客户端声明一个Exchange,并设置相关属性。
【3】客户端声明一个Queue,并设置相关属性。
【4】客户端使用Routing Key,在ExchangeQueue之间建立好绑定关系。
【5】客户端投递消息到Exchange
【6】Exchange接收到消息后,根据消息的Key和已经设置的Binding,进行消息路由,将消息传递到一个或多个Queue里。

三、Exchange 三种类型

【1】Direct交换机: 完全根据Key进行投递。比如,绑定时设置了 Routing Keyabc,那么客户端提交的消息,只有设置了Keyabc的才会被投递到队列。
【2】Topic交换机:Key进行模式匹配后进行投递,可以使用符号#匹配一个或多个词,符号*匹配正好一个词。比如,abc.#匹配abc.efg.dwgabc.*只匹配类似abc.efg
【3】Fanout交换机: 不需要任何Key,它采用广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。

四、RabbitMQ 持久化策略

为了数据安全考虑,大多数情况下都会选择持久化,也就是将数据写到磁盘上。消息持久化包括以下3个部分:
【1】Exchange持久化,在声明时指定durable => 1
【2】Queue持久化,在声明时指定durable => 1
【3】消息持久化,在投递时指定delivery_mode => 21是非持久化)
如果ExchangeQueue都是持久化的,那么他们之间的Binding也是持久化的,如果ExchangeQueue两者之间有一个是持久化的,一个是非持久化的。就不允许建立绑定。

五、RabbitMQ 管理

我们可以直接通过访问配置文件进行管理,也可以通过访问Web进行管理,我们主要介绍通过Web进行管理。

配置完环境之后,在cmd窗口执行rabbitmq-plugins enable rabbitmq_management命令,开启Web管理插件。
在这里插入图片描述

六、快速入门

通过Spring Boot应用整合RabbitMQ,实现一个简单的发送、接收消息的例子。在Spring Boot中添加AMQPStarter即可。
【1】创建一个SpringBoot工程,命名为rabbitmq-hello
【2】在pom.xml中引入如下依赖内容:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

【3】在application.yml中配置关于RabbitMQ的连接和用户信息:

spring:
  application:
    name: rabbitmq-hello
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

【4】创建消息生产者Sender,通过注入AmqpTemplate接口的实例来实现消息的发送,AmqpTemplate接口定义了一套针对AMQP协议的基本操作。在 SpringBoot中会根据配置注入其具体实现。在该生产者汇总,我们会产生一个字符串,并向队列名为hello中发送消息。

@Component
public class Sender {
    @Autowired
    private AmqpTemplate rabbitTemp;

    public void send(){
        String context = "hello "+new Date();
        System.out.println("Sender : " + context);
        this.rabbitTemp.convertAndSend("hello",context);
    }
}

【5】创建消费者Receiver,通过@RabbitListener注解定义该类对hello队列的监听,并用@RabbitHandler注解来指定对消息的处理方法。

@Component
@RabbitListener(queues = "hello")
public class Receiver {
    @RabbitHandler
    public void process(String hello){
        System.out.println("Receviver:"+hello);
    }
}

【6】创建RabbitMQ的配置类RabbitConfig,用来配置队列,交换器、路由等高级特性。

@Configuration
public class helloQueue {
​```
评论 55
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿进阶

千言万语都不及一句“谢谢”

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值