RabbitMQ最全使用教程-小白也能看懂

简介: RabbitMQ最全使用教程-小白也能看懂

文章标题

前言

一: 消息中间件是什么?使用它有什么作用?

二: 常见的消息中间件有哪些?

三: 为什么选择RabbitMQ?

四: RabbitMQ中核心的内容有那些?

五: Spring如何整合rabbitMQ?

六: 如何通过代码操作RabbitMQ?

七:总结


  温馨提示: 本文大约7031字,阅读完大概需要3-6分钟,希望您能耐心看完,倘若你对该知识点已经比较熟悉,你可以直接通过目录跳转到你感兴趣的地方,希望阅读本文能够对您有所帮助,如果阅读过程中有什么好的建议、看法,欢迎在文章下方留言或者私信我,如果觉的文章给你带来一点帮助,可以帮忙点一下赞和关注,谢谢!!

前言

 “开局五道题,文章看不看全由你”


 如果下面的题目你觉你已经完全懂了,那么看到这里可以退出了,如果你觉的对一些问题还有点困惑,那么请继续看下去,文章多少会给你一些启示(本文讲解内容: 消息队列中间件):


 注: 因为本篇文章到此处已经是比较长了,考虑到大家的阅读时间,所以RabbitMQ的操作的具体参数会另起一片文章做详细的讲解,需要了解操作参数的详细含义的,可以【关注】一下我发表的文章,谢谢理解。

image.png

一: 消息中间件是什么?使用它有什么作用?

(一) 先来看下百度百科对它的定义:

image.png

image.png

看完我的心情也跟图片一样,一脸懵逼,还是通过比较通俗的语言表达更好,想要知道消息中间件是什么,我们可以拆开这个词来理解: 消息中间件 = 消息 + 中间件


消息: 简单的说就是软件之间通讯时传递的数据,它可以是很简单的数字、字母,也可以是很复杂的嵌套对象数据。


中间件: 最简单的理解是第三者,本来软件A和软件B间的通讯两者直接传递消息就可以了,但是,此时中间件作为第三者,非要先让软件A通讯的消息先发给它,再由它发给软件B(感觉就是中间商一样),下面通过图来更好的理解它们。


消息队列: 是消息中间件的一种实现方式。


总结:消息中间件则是将软件与软件之间的交互方式进行存储和管理的一种技术,也可以看做是一种容器。

image.png

image.png

此时此刻,你肯定会有疑问,软件间可以直接通讯,还要个"第三者"干嘛?“存在即合理”,下面我们就来看看消息中间件到底有什么作用!


(二) 消息中间件的作用:


 1、异步处理,提高响应速度: 比如我们最常见的短信验证码功能,当我们在界面点击“获取验证码”后,我们还可以同时进行其他的操作,如输入更新的密码等,此时,我们不需要一直等到手机收到短信了才进行下一步的操作,这就是异步处理,提高了用户体验。

image.png

image.png

2、应用解耦: 如常见的订单系统,当有订单下单时,我们需要减去库存,但如果订单、库存的逻辑都放在一个系统中,不止处理事件需要很长,系统的耦合性比较高,此时,使用消息中间件,可以实现将订单业务和库存业务抽出来做不同的系统,每次下单的时候可以将下单信息放入消息中间间中,然后库存系统去订阅它,只有有订单数据就进行减去库存操作,这样就将应用解耦了

image.png

image.png

3、流量削峰: 如常见的秒杀系统,如果有5万个商品可以秒杀,没有消息中间件的话,所有的请求都一次性到后台,此时系统很容易卡死,引入消息中间件如消息队列,此时可以在队列中设置好可以存储数据的数量,这样每次用户请求会先但消息队列中,消息队列就减去1,当消息队列中存储长度为0时,直接返回秒杀失败,这样就避免了所有用户请求可能在同一时间到达系统后台,达到流量削峰的作用

image.png

二: 常见的消息中间件有哪些?

  消息队列: 是消息中间件的一种实现方式。


  常见的消息队列中间件: ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等。


三: 为什么选择RabbitMQ?

想要知道为什么选择RabbitMQ,就需要先了解一些关于消息队列的专业知识:


  (一) 消息服务规范


 1、JMS(java message service) java消息服务: 基于jvm消息代理的规范,如ActiveMQ,HornetMQ就是JMS实现。


 2、AMQP(Advanced Message Queuing Protocol)高级消息队列协议: 是一个消息代理的规范,兼容JMS,RabbtisMQ是AMQP的实现。


  (二) 两者的区别:


 1、AMQP是跨语言,跨平台,JMS不是,只能用于Java平台


 2、JMS只提供了两种消息模型即: 点对点,发布订阅,AMQP提供了五种消息模型


 3、JMS支持多种消息类型,AMQP支持字节数组类型


 总结: 考虑到现在流行的微服务开发,不同微服务可能使用的是不同的语言开发,综合考虑选择RabbitMQ消息队列,因为它是AMQP规范的一个实现,可以达到跨平台、跨语言。


四: RabbitMQ中核心的内容有那些?

  (一) 消息服务的两个概念


 1、消息代理(message broker): 负责接受消息生产者发送的消息


 2、目的地(destination):消息最终被消费的地方


 3、两者的关系: 当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定的目的地。

(二) 从消息代理到目的地的方式


  1、队列: 点对点的通信(point - to - point): 消息发送者发送消息,消息代理将其放入到一个队列中,消息接收者从队列中获取消息内容,消息读取后被移除出队列。

image.png

2、主题: 发布publish/订阅subscribe 消息通信: 发布者发送消息到主题,多个接收者(订阅者)订阅这个主题,那么就会在消息到达时同时收到消息

image.png

(三) RabbitMQ的核心概念


 1、Message(消息): 不具名,由消息头和消息体租出,消息体是不透明的。消息头是由一系列的可选属性组成如,routing-key路由键,priority-相对其他消息的优先权,delivery-mode-指出该消息是否需要永久存储等。


 2、Publicsher(消息的生产者): 是向交换器发布消息的客户端应用程序。


 3、Exchange(交换器): 用来接受消息并且消息路由给服务器中的队列,有四种类型,即决定消息发布到那个队列,具体有以下的类型:


   (1)、Direct:消息中的路由键(routingkey),如果和Binding中的binding key 一致,那么就将消息发到对应的队列中。


   (2)、Fanout类型: 即广播模式,每个发送到fanout类型的交换器消息,交换器会将消息发送到它绑定的所有队列中,它转发消息是最快的。


   (3)、Topic:主题,可以设置模糊匹配,会识别"#“和”*"号,#表示匹配0个或者多个单词,*匹配一个单词,单词之间使用:逗号隔开。


   (4)、headers:实现发布订阅模型(基本不使用了)。


 4、Queue(消息队列): 消息的容器,一个消息可以放在一个或者多个队列中。


 5、Binding(绑定): 用于消息队列和交换器之间的关联,一个绑定就是基于路由键将交换机和消息队列连接起来的路由规则,交换器跟队列的绑定可以是多对多的关系


 6、Connection(网络连接): 如一个Tcp连接。


 7、Channel(信道): 多路复用连接中的一条独立的双向数据流通道,信道是建立在真实的TCP连接内的虚拟通道,AMQP命令都是通过信道发出去的,不管是发布消息,订阅队列,还是接收消息,都是通过信道完成,因为对于操作系统来说创建和销毁一个TCP连接都是很昂贵的开销,所以使用信道以实现复用一条TCP连接。


 8、Consumer(消费者): 接受和消费消息。


 9、Virtaul Hos(虚拟主机): 即小型的RabbitMQ服务器,它表示一批交换器,消息队列和相关对象,连接时必须指定,默认是:/(以路径区分)。


10、Broker: 消息队列服务器实体。

image.png

五: Spring如何整合rabbitMQ?

  (一) 添加依赖

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

(二) 设置配置信息

spring:
  application:
    name: RabbitMQ-Test # 应用名称
  rabbitmq:
    host: localhost #rabbitServer的地址
    port: 5672 # 端口
    username: guest # 用户名称
    password: guest # 连接密码
    virtual-host: /
server: 
  port: 9090

(三) 启动类添加EnableRabbit注解

@SpringBootApplication
@EnableRabbit
public class RabbitMqTestApplication {
    public static void main(String [] args){
        SpringApplication.run(RabbitMqTestApplication.class,args);
    }
}

六: 如何通过代码操作RabbitMQ?

 注: 因为本篇文章到此处已经是比较长了,考虑到大家的阅读时间,所以RabbitMQ的操作的具体参数会另起一片文章做详细的讲解,需要了解操作参数的详细含义的,可以点击文章末尾的连接跳转,谢谢理解。


 (一) Spring提供操作RabbitMQ的工具类


 1、RabbitTemplate: 是Spring集成RabbitMQ而提供的一个工具类,跟JdbcTemplate一样,可以通过它进行消息的发送和接收。


 2、RabbitAdmin : 主要用于管理交换机和队列的信息。


 (二) 测试的公共执行代码

// 测试前加载RabbitAdmin
  private static AmqpAdmin amqpAdmin;
    private static ConnectionFactory connectionFactory;
    @BeforeClass
    public static void loadNeedBean(){
        com.rabbitmq.client.ConnectionFactory connFactory = new com.rabbitmq.client.ConnectionFactory();
        connFactory.setHost("47.91.198.211");
        connFactory.setPort(5672);
        connFactory.setUsername("guest");
        connFactory.setPassword("guest");
        connFactory.setVirtualHost("/");
        connectionFactory = new CachingConnectionFactory(connFactory);
        // RabbitAdmin 主要用于管理交换机和队列的信息
        amqpAdmin = new RabbitAdmin(connectionFactory);
    }

(三) 操作交换机(Exchange)

    // 交换机操作
    @Test
    public void rabbitExchangeTest() throws Exception{
        // 创建交换机
        // 参数分别是: 交换机名称,是否持久化,是否自动删除
        Exchange exchange = new DirectExchange("direct_test",true,false);
        amqpAdmin.declareExchange(exchange);
        // 删除交换机
        amqpAdmin.deleteExchange("direct_test");
    }

(四) 操作队列(Queue)

    // 操作队列
    @Test
    public void rabbitExchangeAndQueueTest() throws Exception{
        // 创建队列
        Queue queue = new Queue("queue_test111");
        amqpAdmin.declareQueue(queue);
        // 删除队列
        amqpAdmin.deleteQueue("queue_test111");
    }

(五) 交换机和队列的绑定

 // 队列和交换机操作
    @Test
    public void rabbitQueueTest(){
        // 创建交换机
        Exchange exchange = new DirectExchange("direct_test2",true,false);
        amqpAdmin.declareExchange(exchange);
        // 创建队列
        Queue queue = new Queue("queue_test",true);
        amqpAdmin.declareQueue(queue);
        // 绑定交换机交换机
        //Binding binding = new Binding("direct_test2", Binding.DestinationType.EXCHANGE,"direct_test2","rount-key",null);
        // 队列绑定到交换机
        Binding binding = new Binding("queue_test", Binding.DestinationType.QUEUE,"direct_test2","rount-key",null);
        amqpAdmin.declareBinding(binding);
    }

(六) 消息生产者发送消息到消息队列中

    @Test
    public void messageProductTest(){
        // 消息操作模板
        RabbitTemplate rest = new RabbitTemplate(connectionFactory);
        MessageProperties messageProperties = new MessageProperties();
        messageProperties.setContentType(MessageProperties.CONTENT_TYPE_JSON);
        // 发送消息方式一
        String msg = "hello world";
        Message message = new Message(msg.getBytes(),messageProperties);
        // 发送消息方式二
        HashMap map = new HashMap();
        map.put("key","value");
        rest.convertAndSend("direct_test2","rount-key",map);
    }

(七) 消息消费者从队列中消费(手动执行的方式)

    // 消息的消费者
    @Test
    public void messageConsumerTest() throws  Exception{
        RabbitTemplate rest = new RabbitTemplate(connectionFactory);
        // 从名为queue_test的队列中获取消息
        Message queue_test = rest.receive("queue_test");
        System.out.println(new String(queue_test.getBody(),"UTF-8"));
    }

(八) 消息消费者从队列中消费(自动监听,使用注解的方式)

@RestController
public class RabbitController {
    // 指定需要监听的队列名称,可以是多个
    @RabbitListener(queues = "queue_test")
    public void messageListener(Message data){
        System.out.println("收到数据:----------");
        System.out.println(data);
    }
}

image.png

七:总结

   看到此处,你应该对RabbitMQ有了更深入的认识,但是、关于RabbitMQ的知识远远不止这一篇文章描述的,因为篇幅有限,后面会更新更多关于RabbitMQ相关的知识。

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
12月前
|
消息中间件 监控 Docker
Docker环境下快速部署RabbitMQ教程。
就这样,你成功地用魔法召唤出了RabbitMQ,还把它和你的应用程序连接了起来。现在,消息会像小溪流水一样,在你的系统中自由流淌。别忘了,兔子们不喜欢孤独,他们需要你细心的关怀,不时地监控它们,确保他们的世界运转得井井有条。
711 18
|
消息中间件 Java RocketMQ
RocketMQ实战教程之RocketMQ安装
这是一篇关于RocketMQ安装的实战教程,主要介绍了在CentOS系统上使用传统安装和Docker两种方式安装RocketMQ。首先,系统需要是64位,并且已经安装了JDK 1.8。传统安装包括下载安装包,解压并启动NameServer和Broker。Docker安装则涉及安装docker和docker-compose,然后通过docker-compose.yaml文件配置并启动服务。教程还提供了启动命令和解决问题的提示。
|
消息中间件 前端开发 数据库
RocketMQ实战教程之MQ简介与应用场景
RocketMQ实战教程介绍了MQ的基本概念和应用场景。MQ(消息队列)是生产者和消费者模型,用于异步传输数据,实现系统解耦。消息中间件在生产者发送消息和消费者接收消息之间起到邮箱作用,简化通信。主要应用场景包括:1)应用解耦,如订单系统与库存系统的非直接交互;2)异步处理,如用户注册后的邮件和短信发送延迟处理,提高响应速度;3)流量削峰,如秒杀活动限制并发流量,防止系统崩溃。
|
消息中间件 存储 JSON
rabbitmq基础教程(ui,java,springamqp)
本文提供了RabbitMQ的基础教程,包括如何使用UI创建队列和交换机、Java代码操作RabbitMQ、Spring AMQP进行消息发送和接收,以及如何使用不同的交换机类型(fanout、direct、topic)进行消息路由。
289 0
rabbitmq基础教程(ui,java,springamqp)
|
网络协议 物联网 测试技术
App Inventor 2 MQTT拓展入门(保姆级教程)
本文演示的是App和一个测试客户端进行消息交互的案例,实际应用中,我们的测试客户端可以看着是任意的、支持MQTT协议的硬件,通过订阅及发布消息,联网硬件与我们的App进行双向数据通信,以实现万物互联的智能控制效果。
1561 2
|
消息中间件 存储 Apache
RocketMQ实战教程之常见概念和模型
Apache RocketMQ 实战教程介绍了其核心概念和模型。消息是基本的数据传输单元,主题是消息的分类容器,支持字节、数字和短划线命名,最长64个字符。消息类型包括普通、顺序、事务和定时/延时消息。消息队列是实际存储和传输消息的容器,是主题的分区。消费者分组是一组行为一致的消费者的逻辑集合,也有命名限制。此外,文档还提到了一些使用约束和建议,如主题和消费者组名的命名规则,消息大小限制,请求超时时间等。RocketMQ 提供了多种消息模型,包括发布/订阅模型,有助于理解和优化消息处理。
|
消息中间件 存储 Java
RocketMQ实战教程之NameServer与BrokerServer
这是一个关于RocketMQ实战教程的概要,主要讨论NameServer和BrokerServer的角色。NameServer负责管理所有BrokerServer,而BrokerServer存储和传输消息。生产者和消费者通过NameServer找到合适的Broker进行交互,不需要直接知道Broker的具体信息。工作流程包括生产者向NameServer查询后发送消息到Broker,以及消费者同样通过NameServer获取消息进行消费。这种设计类似于服务注册中心的概念,便于系统扩展和集群管理。
|
消息中间件 监控 Ubuntu
RabbitMQ安装配置,超详细版教程
以上步骤为您提供了在Linux环境下安装RabbitMQ的详细过程。安装Erlang作为基础,然后通过添加官方源并安装RabbitMQ本身,最后对服务进行配置并启用Web管理界面。这些步骤操作简单直观,只需要跟随上述指南,即可在短时间内将RabbitMQ服务器运行起来,并进行进一步的配置和管理。不要忘记硬件和网络资源对性能的影响,确保RabbitMQ能够满足您的应用需求。
1600 0
|
消息中间件 中间件 Java
RocketMQ实战教程之几种MQ优缺点以及选型
该文介绍了几种主流消息中间件,包括ActiveMQ、RabbitMQ、RocketMQ和Kafka。ActiveMQ和RabbitMQ是较老牌的选择,前者在中小企业中常见,后者因强大的并发能力和活跃社区而流行。RocketMQ是阿里巴巴的开源产品,适用于大规模分布式系统,尤其在数据可靠性方面进行了优化。Kafka最初设计用于大数据日志处理,强调高吞吐量。在选择MQ时,考虑因素包括性能、功能、开发语言、社区支持、学习难度、稳定性和集群功能。小型公司推荐使用RabbitMQ,而大型公司则可在RocketMQ和Kafka之间根据具体需求抉择。
|
消息中间件 Cloud Native 自动驾驶
RocketMQ实战教程之MQ简介
Apache RocketMQ 是一个云原生的消息流平台,支持消息、事件和流处理,适用于云边端一体化场景。官网提供详细文档和下载资源:[RocketMQ官网](https://rocketmq.apache.org/zh/)。示例中提到了RocketMQ在物联网(如小米台灯)和自动驾驶等领域的应用。要开始使用,可从[下载页面](https://rocketmq.apache.org/zh/download)获取软件。