zl程序教程

您现在的位置是:首页 >  其他

当前栏目

RabbitMQ 菜鸟教程

2023-04-18 16:30:02 时间

面试总结(重要!!!,这段话请记忆):

1.RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message Queue,高级消息队列协议。
2.RabbitMQ 用于分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗
3.RabbitMQ 内部几个重要结构:  交换机组件对象、  路由组件对象、队列组件对象
Exchange交换机组件对象: 用来和消息发送端(生产者)建立连接并接收消息 
Routes路由组件对象:  用来指定以什么策略将消息传递到队列中(消息传递策略自己找资料了解)
Queue队列组件对象: 用来给消息的接收端(消费者)提供消息 (接收端用监听器从队列取数据)

另外:
Publish-生产者(发布消息到RabbitMQ中的Exchange)
Consumer-消费者(监听RabbitMQ中的Queue中的消息)

一、简介,什么是RabbitMQ:

RabbitMQ 是一个由 Erlang 语言开发的 AMQP 的开源实现。 AMQP :Advanced Message Queue,高级消息队列协议。它是应用层协议的一个开放标准,为面向消息的中间件设计,基于此协议的客户端与消息中间件可传递消息,并不受产品、开发语言等条件的限制。 RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
1.1.RabbitMQ特征
1.可靠性(Reliability) RabbitMQ 使用一些机制来保证可靠性,如持久化、传输确认、发布确认。
2.灵活的路由(Flexible Routing) 在消息进入队列之前,通过 Exchange 来路由消息的。对于典型的路由功能,RabbitMQ已经提供了一些内置的 Exchange 来实现。针对更复杂的路由功能,可以将多个Exchange 绑定在一起,也通过插件机制实现自己的 Exchange 。
3.消息集群(Clustering) 多个 RabbitMQ 服务器可以组成一个集群,形成一个逻辑 Broker
4.高可用(Highly Available Queues) 队列可以在集群中的机器上进行镜像,使得在部分节点出问题的情况下队列仍然可用。
5.多种协议(Multi-protocol) RabbitMQ 支持多种消息队列协议,比如 STOMP、MQTT 等等。
6.多语言客户端(Many Clients) RabbitMQ 几乎支持所有常用语言,比如 Java、.NET、Ruby 等等。
7.管理界面(Management UI) RabbitMQ 提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker 的许多方面。
8.跟踪机制(Tracing) 如果消息异常,RabbitMQ 提供了消息跟踪机制,使用者可以找出发生了什么。
9.插件机制(Plugin System) RabbitMQ 提供了许多插件,来从多方面进行扩展,也可以编写自己的插件。

1.2.RabbitMQ的结构

和Kafka不同,Kafka是使用话题名称来收发信息,结构简单
RabbitMQ是使用交换机路由key指定要发送消息的队列
消息的发送者发送消息时,需要指定交换机和路由key名称
消息的接收方接收消息时,只需要指定队列的名称
在编写代码上,相比于Kafka,每个业务要编写一个配置类
这个配置类中要绑定交换机和路由key的关系,以及路由Key和队列的关系

二、安装RabbitMQ并启动:

RabbitMQ是Erlang语言开发的,所以要先安装Erlang语言的运行环境
下载Erlang的官方路径
https://erlang.org/download/otp_versions_tree.html
下载RabbitMQ
https://www.rabbitmq.com/install-windows.html
2.1.安装RabbitMQ:
先安装opt_win64_24.3.4.exe, 再安装rabbitmq-server-3.10.1.exe
默认安装即可(一直点下一步安装完成就可以),不要安装在中文路径和有空格的路径下
注意:rabbitmq和opt软件版本要对应, 具体对应关系请参考官网说明:
https://www.rabbitmq.com/which-erlang.html#compatibility-matrix

2.2.配置环境变量:

 A.ERLANG_HOME

B.otp_win64_24.3.4软件的bin目录配置到path中:


2.3.启动RabbitMQ:
用如下命令到rabbitmq_server-3.10.1的sbin目录启动服务:
rabbitmq-plugins enable rabbitmq_management
如果rabbitmq安装在D: abbitmq_server-3.10.1,则需要进入sbin用上边命令启动服务

D: abbitmq_server-3.10.1sbin>rabbitmq-plugins enable rabbitmq_management

启动成功后,会有如下提示:

运行完成后
1.可以在Window任务管理器中的服务选项卡找到RabbitMQ的服务(Ctrl+Shift+ESC)
2.另外的验证方法:     打开浏览器访问http://localhost:15672
登录界面用户名密码都是guest
登录成功后看到RabbitMQ运行的状态
注意:如果启动失败,需要重新安装
参考路径如下
https://baijiahao.baidu.com/s?id=1720472084636520996&wfr=spider&for=pc


三、案例:

1.导包:
 

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

2.编写配置类:

package com.zyq.rattitmq.mq;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

// SpringBoot整合RabbitMQ之后
// 这些配置信息要保存在Spring容器中,所以这些配置也要交给SpringBoot管理
@Configuration
public class RabbitMQConfig {
    // 声明需要使用的交换机名称路由Key队列的名称
    public static final String STOCK_EX="stock_ex";
    public static final String STOCK_ROUTE="stock_route";
    public static final String STOCK_QUEUE="stock_queue";

    // 1.声明交换机,需要几个声明几个,这里就一个
    // 方法中实例化交换机对象,确定名称,保存到Spring容器
    @Bean
    public DirectExchange stockDirectExchange(){
        return new DirectExchange(STOCK_EX);
    }

    // 2.声明队列,需要几个声明几个,这里就一个
    // 方法中实例化队列对象(需要指定队列名称),然后保存到Spring容器
    @Bean
    public Queue stockQueue(){
        return new Queue(STOCK_QUEUE);
    }

    // 3.声明路由Key对象(用来确定交换机和队列的关系),需要几个声明几个,这里就一个
    //注意:路由key对象中用.bing()和to()映射了队列和交换机的关系
    // 方法中实例化路由Key对象(需要指定路由key名称),保存到Spring容器
    @Bean
    public Binding stockBinding(){
        return BindingBuilder.bind(stockQueue()).to(stockDirectExchange()).with(STOCK_ROUTE);
    }

}


3.编写发送端:
 

package com.zyq.rattitmq.mq;

import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;

@Component
public class Sender {

    // RabbitTemplate就是amqp框架提供的发送消息的对象
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send() {
        //输出当前时间
        System.out.println("Sender-------"+ LocalDateTime.now() +"------发送消息  zhaoyq: rabbitMQ Message");
        // 先简单的发送一个字符串(指定交换机名称、路由Key、 发送的消息内容)
        rabbitTemplate.convertAndSend(
                RabbitMQConfig.STOCK_EX,
                RabbitMQConfig.STOCK_ROUTE,
                "zhaoyq: rabbitMQ Message");
    }

}

4.编写接收端:

package com.zyq.rattitmq.mq;

import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

// 这个对象也是需要交由Spring容器管理的,才能实现监听Spring容器中保存的队列的效果
// 和Kafka不同的是Kafka在一个方法上声明监听器
// 而RabbitMQ是在类上声明,监听具体的队列名称
//注意:@RabbitListener注解指定了Receiver类监听的队列是RabbitMQConfig.STOCK_QUEUE
@Component
@RabbitListener(queues = {RabbitMQConfig.STOCK_QUEUE})
public class Receiver {
        // 监听了类,但是运行代码的一定是个方法
        // 框架要求这个类中只允许一个方法包含下面这个注解
        // 表示这个方法是处理消息的方法
        // 方法的参数就是消息的值
        @RabbitHandler
        public void process(String str){
            System.out.println("Receiver接收到的消息为:"+str);
        }
}


四、扩展练习:

自己将RabbitMQ和Quartz结合:  
用Quartz在指定时间周期自动发送消息, RabbitMQ的接收端通过监听器自动从队列中取消息