都2023年了,诸佬们肯定熟知RabbitMQ了吧

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言大家好我是小威24届毕业生曾经在某央企公司实习目前入职某税务公司。本篇文章将记录和分享RabbitMQ相关的知识点。
本篇文章记录的基础知识适合在学Java的小白也适合复习中面试中的大佬🤩🤩。
如果文章有什么需要改进的地方还请大佬不吝赐教👏👏。
小威在此先感谢各位大佬啦~~🤞🤞
在这里插入图片描述

🏠个人主页小威要向诸佬学习呀
🧑个人简介大家好我是小威一个想要与大家共同进步的男人😉😉
目前状况🎉24届毕业生曾经在某央企公司实习目前在某税务公司实习👏👏

💕欢迎大家这里是CSDN我总结知识的地方欢迎来到我的博客我亲爱的大佬😘

在这里插入图片描述

以下正文开始

在这里插入图片描述

文章目录

🎉初始RabbitMQ

我们接触过队列的时候还是在介绍AQS的时候在AQS的内部维护了一个基于FIFOFirst Input First Output的等待队列。对于今天记录的rabbitmq知识也是一个先进先出的队列只不过这个队列是存放消息的队列。

RabbitMQ(message queue)消息队列是RabbitMQ公司基于Erlang开发语言来创建的其支持多种协议如AMQP协议XMPP协议SMTP协议STOMP协议等等。

我们在项目中进行同步调用的时候会遇到很多问题比如当服务的生产者出现某些问题调用这些服务提供者的消费者也会出现问题导致项目不可用而且同步调用会使得项目的耦合度比较高当每次加入新的需求时都需要对源代码进行改造同步调用的性能也不是那么的好因为同步调用的上一个步骤完成后才会进行下一步如果调用的时间比较长则需要等待很长的时间。

而异步通信恰好可以解决这些问题。其中RabbitMQ消息队列就是异步通信中的一种。
在这里插入图片描述

🎇RabbitMQ的优点

上面我们了解到了同步调用的缺点异步通信的优点接着我们了解一下RabbitMQ的优点。

🎈应用解耦

以我们平时做的电商项目为例在电商项目中我们通常会有支付服务订单服务库存系统物流服务等。比如用户在下完单后如果耦合地调用订单服务库存服务其中如果有一个系统发生故障都会导致用户下单操作失败。但是如果基于消息队列的方式异步调用时如果物流服务发生故障我们只需要花时间来处理物流服务即可不会影响到用户的下单支付服务。当物流服务的bug处理完成后即可恢复正常。

🎈流量削峰

以我们的生活为例通常在双十一双十二时购物优惠力度会很大在此期间用户订单会很多如果不对订单流量进行控制服务器很容易崩掉。因此我们可以将消息队列用来做缓冲限制订单的个数或者将某段时间内的订单分散成一段时间处理一些用户在下完单后的一小段时间内收到下单成功的提醒这样可以有效地控制极大流量的情况。

🎈异步处理

同步调用需要一步一步地去执行系统总执行的时间是各子系统模块花销的时间之和而异步处理可以使得子系统从对应的消息队列中消费自己对应的消息在自己本地执行相对应的操作。因此异步处理可以极大提升系统的响应速度和吞吐量。

🎊MQ的种类

消息队列的种类有很多比如为我们所熟知的RabbitMQRocketMQActiveMQKafKa接下来简单介绍一下吧。

RabbitMQ公司基于Erlang开发语言来创建的其支持多种协议如AMQP协议XMPP协议SMTP协议STOMP协议等等。其可用性比非常高单机吞吐量一般消息延迟微秒级别消息可靠性比较高。

ActiveMQ是有Apache研发的开源中间件开发语言是用Java来开发的支持多种编程语言支持多种协议如OpenWire协议STOMP协议RESY协议AMQP协议XMPP协议等其可用性一般单机吞吐量略差消息延迟为毫秒级消息可靠性一般。

RocketMQ是阿里巴巴公司研发的消息队列的一种也是由Java语言开发的RocketMQ的协议支持自定义高吞吐量可用性非常高消息可靠性也比较高时效性能延迟在毫秒级别。

KafKa是由Apache社区使用Scala和Java语言开发的消息队列其支持自定义协议可用性非常高单机吞吐量非常高多用于分布式架构是由阿里开源的之后交付给了Apache社区消息可靠性一般。

RabbitMQ在各个方面都表现的挺不错因此我们可以选择RabbitMQ来学习的。

🧨RabbitMQ组件架构

在这里插入图片描述

Publisher 消息的生产者。

Consumer 消息的消费者。

Broker主要用于接收和分发消息RabbitMQ Server 就是 Message Broker。

Virtual host顾名思义虚拟主机类似于nacos中的 namespace命名空间 概念。当多个不同的用户使用同一个 RabbitMQ server 提供的服务时可以划分出多个 vhost每个用户在自己的 vhost 创建 exchange/queue 等。vhost在连接的时候需要指定默认的vhost是/。

Connection生产者和消费者与 broker 之间建立的 TCP 连接。

Channel中文意思为管道用于数据双向流通。不管是发布消息、订阅队列还是接收消息这些动作都是通过管道完成。因为对于操作系统来说建立和销毁TCP都是非常昂贵的开销因此引入了管道的概念以复用一条TCP连接。

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

Queue消息队列用来保存消息直到发送给消费者。它是存放消息的容器。一个消息可投入一个或多个队列消息最终被送到这里等待 consumer 取走。

Binding绑定关系主要用于交换机和队列之间的关联binding 中可以包含 routing key通过路由键Routing Key将交换机和消息队列关联起来。
在这里插入图片描述

🎍SpringAMQP

我们先来看一下官方给出的SpringAMQP介绍

Spring AMQP项目将Spring的核心概念应用于基于AMQP的消息传递解决方案的开发。它提供了一个“模板”作为发送和接收消息的高级抽象。它还为带有“监听器容器”的消息驱动的 POJO 提供支持。这些库有助于管理 AMQP 资源同时促进依赖关系注入和声明性配置的使用。在所有这些情况下您都会看到与 Spring 框架中的 JMS 支持的相似之处。

特征
用于异步处理入站消息的监听器容器

发送和接收消息的模板

RabbitAdmin用于自动声明队列交换和绑定

我们利用SpringAMQP来实现HelloWorld中的基础消息队列功能
我们首先创建两个模块publisher生产者模块和consumer消费者通过在生产者中发送消息消费者对消息进行处理。
由于publisher模块和consumer模块都需要SpringAMQP依赖所以在父过程的pom文件中引入依赖

     <!--AMQP依赖包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>

接着在publisher模块的yaml中配置RabbitMQ的相关地址信息

logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.220.135
    port: 5672
    username: xiaowei
    password: 123456
    virtual-host: /

然后在publisher模块的测试类中编写代码

package cn.itcast.mq.spring;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@SpringBootTest
@RunWith(SpringRunner.class)
public class SpringAmqpTest {
    @Autowired //自动装配和我们使用的RedisTemplate相似
    private RabbitTemplate rabbitTemplate;
    @Test
    public void testSendMessage2SimpleQueue() {
        String queueName="simple.queue";
        String message = "hello, spring amqp!";
        rabbitTemplate.convertAndSend(queueName,message);
    }
}

直到此刻生产者就可以发送消息了启动项目登录RabbitMQ官网可看到队列中有一条消息
在这里插入图片描述
之后配置consumer模块的依赖和application.yaml这个是和生产者一样的

     <!--AMQP依赖包含RabbitMQ-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-amqp</artifactId>
        </dependency>
logging:
  pattern:
    dateformat: MM-dd HH:mm:ss:SSS
spring:
  rabbitmq:
    host: 192.168.220.135
    port: 5672
    username: xiaowei
    password: 123456
    virtual-host: /

接着编写来接收生产者消息的类

package cn.itcast.mq.listener;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;
@Component  //加上注解交给spring容器来管理
public class SpringRabbitListener {
    @RabbitListener(queues="simple.queue") //simple.queue是创建的队列名称
     public void listenSimpleQueue(String msg){  //由于生产者那里是string类型因此这里一样类型
        System.out.println("消费者已经接收到simple.queue的消息:[" + msg +  "]");
     }
}

启动consumer模块项目运行查看控制台可以看到消费者这里可以得到生产者那里发送的消息
在这里插入图片描述
我们再次打开官网的界面刷新后会发现那条消息已经被消费了
在这里插入图片描述
由于篇幅原因本篇文章就先分享到这里了后续会继续分享其他的知识感谢大佬认真读完支持咯~
在这里插入图片描述

文章到这里就结束了如果有什么疑问的地方请指出诸佬们一起讨论🍻
希望能和诸佬们一起努力今后进入到心仪的公司
再次感谢各位小伙伴儿们的支持🤞

在这里插入图片描述

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: RabbitMQ