RabbitMQ系列之入门级

news2024/11/16 18:38:49

 

  🎉🎉欢迎来到我的CSDN主页!🎉🎉

🏅我是君易--鑨,一个在CSDN分享笔记的博主。📚📚

🌟推荐给大家我的博客专栏《RabbitMQ系列之入门级》。🎯🎯

🎁如果感觉还不错的话请给我关注加三连吧!🎁🎁

一、MQ的简介

1. 什么是MQ(概念简述) 

        MQ通常指的是消息队列(Message Queue),是一种用于在应用程序之间传递消息的通信方式。消息队列系统允许不同组件之间异步通信,通过在发送者和接收者之间引入队列,实现解耦和提高系统的可伸缩性

        在消息队列中,消息生产者将消息发送到队列,而消息消费者从队列中接收消息。这种异步通信的方式可以使系统中的各个组件独立运作,不需要直接依赖对方的状态,提高了系统的可维护性和可扩展性。

2. MQ的主要应用场景

         MQ的应用场景包括但不限于,下面是几个典型的几个应用场景:

MQ典型的应用场景
应用场景说明
解耦系统组件允许不同组件之间解耦,降低了组件之间的依赖性。
提高系统可靠性如果某个组件暂时不可用,消息队列可以存储消息,待组件恢复正常后再处理这些消息。
异步通信允许系统中的组件进行异步通信,提高了系统的响应性。
削峰填谷在流量波动较大的场景中,消息队列可以用来平滑流量,防止系统峰值负载。
分布式系统协调在分布式系统中,消息队列可以用来协调各个节点的工作。

3. MQ的常见实现方式

3.1 RabbitMQ

1. 特点

        RabbitMQ 是一个开源的消息队列系统,它遵循AMQP(Advanced Message Queuing Protocol)协议。它支持多种消息传递模式,包括点对点、发布/订阅和请求/响应。

2. 适用场景

        RabbitMQ适用于需要高度灵活性和多样性消息传递模式的场景,同时它的性能和可靠性也是其特点之一。

3.2 Apache Kafka 

1. 特点

        Kafka 是一个分布式的、高吞吐量的消息系统主要用于处理实时数据流。它的设计目标是具有高可用性和持久性,同时能够处理大规模的数据流。

2. 适用场景

         Kafka 适用于大规模的数据流处理,如日志收集、事件溯源、流式处理等场景。

3.3 ActiveMQ

1. 特点

        ActiveMQ 是一个基于Java的开源消息中间件,支持多种协议,包括OpenWire、STOMP、AMQP等。它提供了丰富的功能,如持久化、事务、集群等。 

2. 适用场景

         ActiveMQ适用于需要与多种协议兼容,并且对消息传递的可靠性和事务有要求的场景。

3.4 Apache RocketMQ接口

1. 特点

         RocketMQ 是由阿里巴巴开发的分布式消息中间件,具有高吞吐、低延迟、高可用性的特点。它支持丰富的消息传递模式,如顺序消息、事务消息等

2. 适用场景

         RocketMQ适用于高吞吐、低延迟要求的场景,尤其在电商、金融等领域有广泛应用。

3.5 Amazon Simple Queue Service (SQS)

1. 特点

        SQS是亚马逊提供的托管消息队列服务,具有高可用性和弹性。它支持分布式架构,并提供了简单的API用于发送和接收消息。 

2. 适用场景

        SQS适用于在AWS云上构建可扩展的、分布式的应用程序,无需担心消息队列的基础设施管理。 

3.6 Redis 发布/订阅 

1. 特点

        Redis 是一个内存数据库,但它也提供了发布/订阅(Pub/Sub)功能。Redis的消息发布/订阅是基于频道的,允许多个订阅者监听同一个频道的消息。

2. 适用场景

         Redis的Pub/Sub适用于简单的消息发布和订阅场景,尤其是对于需要快速实现的小规模应用。

         这些是一些常见的MQ实现方式,选择合适的MQ取决于应用的具体需求,包括对性能、可靠性、消息传递模式的要求等。

图解说明

4. MQ作用说明(含图解)

        假设我们在淘宝下了一笔订单后,淘宝后台需要做这些事情:

1. 消息通知系统:通知商家,你有一笔新的订单,请及时发货

2. 推荐系统:更新用户画像,重新给用户推荐他可能感兴趣的商品

3. 会员系统:更新用户的积分和等级信息

createOrder(...) {
// 完成订单服务
doCreateOrder(...);
// 调用其他服务接口
sendMsg(...);
updateUserInterestedGoods(...);
updateMemberCreditInfo(...);
}

        如上图所示,我们订单系统创建订单的时候自身需要2s的处理时间,然后要向三个系统分别发送请求并且等待他们的响应一个系统服务需要等待2是,一共需要8s。

存在问题:

        过度耦合:如果后面创建订单时,需要触发新的动作,那就得去改代码,在原有的创建订单函数末尾,再追加一行代码

        缺少缓冲:如果创建订单时,会员系统恰好处于非常忙碌或者宕机的状态,那这时更新会员信息就会失败,我们需要一个地方,来暂时存放无法被消费的消息

        这时候我们使用一个消息中间件,来实现解耦和缓冲的功能

         使用一个消息中间件可以让我们的订单系统不必等待我们其他三个系统的响应而去处理其他的事务只需要等待2s,其他系统的响应让他在后台运行,就算响应的时间很长也影响不到订单系统的工作。

二、 RabbitMQ

1. 组成部分

        RabbitMQ的主要组成部分如下:

  1. Producer(生产者):

    • 生产者是消息的发送方,负责产生并发送消息到RabbitMQ的消息队列中。生产者通常将消息发布到一个特定的交换机。
  2. Exchange(交换机):

    • 交换机是消息的分发中心,负责将消息路由到一个或多个消息队列。RabbitMQ支持不同类型的交换机,包括直接交换机、主题交换机、扇出交换机等,以支持不同的消息分发策略。
  3. Queue(消息队列):

    • 队列是消息的存储位置,生产者将消息发送到队列,而消费者从队列中接收消息。消息在队列中等待被消费。
  4. Binding(绑定):

    • 绑定是交换机和队列之间的关联关系。它定义了消息如何从交换机路由到特定的队列。生产者通过将消息发送到交换机,而消费者通过从队列接收消息来实现消息的传递。
  5. Consumer(消费者):

    • 消费者是消息的接收方,负责从消息队列中获取消息并进行处理。消费者订阅一个或多个队列,以接收交换机路由到这些队列的消息。
  6. Virtual Host(虚拟主机):

    • 虚拟主机是RabbitMQ中的逻辑隔离单位,允许在同一物理服务器上创建多个相互独立的消息中间件环境。每个虚拟主机拥有自己的交换机、队列、绑定等。
  7. Connection(连接):

    • 连接是生产者和消费者与RabbitMQ之间的网络连接。一个连接可以包含多个通道(Channel),每个通道代表一个独立的会话。连接的建立和管理是由RabbitMQ客户端库处理的。
  8. 通道(通道):

    • 通道是在连接内部的逻辑通信信道,生产者和消费者通过通道与RabbitMQ进行交互。通道的使用可以减轻连接的开销,提高性能。

 图解

三、Docker安装部署RabbitMQ

1. 拉取RabbitMQ镜像文件

        我们现在我们的虚拟机中拉取我们的一个RabbitMQ的一个镜像文件,版本拉取management的。

指令:docker pull rabbitmq:management 

2. 安装部署RabbitMq容器

        我们拉取了rabbitmq镜像文件之后我们需要去创建一个RabbitMq的容器去运行使用。

创建的命令如下:

docker run -d \
--name my-rabbitmq \
-p 5672:5672 -p 15672:15672 \
--hostname my-rabbitmq-host \
-e RABBITMQ_DEFAULT_VHOST=my_vhost \
-e RABBITMQ_DEFAULT_USER=admin \
-e RABBITMQ_DEFAULT_PASS=admin \
--restart=always \
rabbitmq:management

 指令说明:

--hostname:主机名(RabbitMQ的一个重要注意事项是它根据所谓的 “节点名称” 存储数据,默认为主机名)

-e:指定环境变量:

RABBITMQ_DEFAULT_VHOST:默认虚拟机名

RABBITMQ_DEFAULT_USER:默认的用户名

RABBITMQ_DEFAULT_PASS:默认用户名的密码

 

        我们创建完我们的RabbitMq容器之后我们可以输入指令: docker logs my-rabbitmq 进行一个查看日志。

         我们在网页进行访问rabbitmq的后台界面,进行登陆进入。账号和密码在创建容器时就设置好了。

         登陆进去的首页。

         这就说明我们的rabbitmq的安装和部署已经成功。

3. 配置RabbitMq

        我们在登陆进入的后台首页中右侧的Virtual host中选择我们创建容器时的主机。

         我们点击页面的Admin进入其选项,新建一个用户用于我们后续的一个操作实现,我们一般不用admin进行登陆。

        我们创建好新的用户之后,还要点击进入该用户给该用户分配我们的主机。 下面是一些后台界面的功能说明。

四、springboot连接配置RabbitMQ

1. 创建项目

        打开我们的开发工具IDEA进行创建对应的项目用户实现功能。我们新建一个空的项目。

        创建好空项目之后我们在这个空项目下创建两个Spring模块一个是发布者,一个是消费者。

2. 修改配置文件 

         我们创建好项目以及我们的两个模块后,我们在两个模块下的配置文件转换成yml的格式,以及对其配置文件进行配置。

 publisher/application.yml

server:
    port: 9999
spring:
  rabbitmq:
#      安装rabbitMq容器的虚拟机的ip地址
      host: 192.168.52.130
      #      Rabbitmq的用户账号
      username: yxspring
#      Rabbitmq的用户密码
      password: 123456
#            Rabbitmq的容器的端口号
      port: 5672
#       RabbitMq的主机
      virtual-host: my_vhost

consumer/application.yml

server:
    port: 8888
spring:
    rabbitmq:
        #      安装rabbitMq容器的虚拟机的ip地址
        host: 192.168.52.130
        #      Rabbitmq的用户账号
        username: yxspring
        #      Rabbitmq的用户密码
        password: 123456
        #            Rabbitmq的容器的端口号
        port: 5672
        #       RabbitMq的主机
        virtual-host: my_vhost

3. 案例演示

发布者

        我们配置完我们的配置文件之后,我们先发送消息到我们的RabbitMq中去,编写对应的所需的代码。在我们的发布者模块下创建一个配置类。

 RabbitConfig.java
package com.yx.publisher;

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

@Configuration
@SuppressWarnings("all")
public class RabbitConfig {
@Bean
public Queue firstQueue() {
return new Queue("firstQueue");
}

}

        我们在发布者编写完我们的配置类之后在创建一个controller类用于发送我们的消息到我们的RabbitMQ中。(注:我们没有配置类就无法向我们的RabbitMq中发送信息以及生成队列

 TestController.java
package com.yx.publisher;

import org.springframework.amqp.core.AmqpTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * com.yx.publisher
 *
 * @author 君易--鑨
 * @site www.yangxin.com
 * @company 木易
 * @create 2024/1/19
 */
@RestController
public class TestController {

//        注入AmqpTemplate
        @Autowired
        private AmqpTemplate amqpTemplate;
//        编写一个请求方法
    @RequestMapping("/send1")
    public String send1(){
//    向交换机发送消息
        amqpTemplate.convertAndSend("firstQueue","木易");
        return "木易";
    }


}

        我们直接启动我们的发布者服务,在网页去访问我们控制类中的方法。我们多访问几次多刷新几次

        我们再去到RabbitMq后台管理界面去查看。 

消费者

        我们之前只是向我们的RabbitMq中发送消息,但我们并没有去接收RabbitMQ的消息,接下来就是接收消息。

Receiver.java
package com.yx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "firstQueue") //接收的队列
public class Receiver {
@RabbitHandler
public void process(String msg) {
log.warn("接收到:" + msg);
}
}

         我们接听的队列一定要存在否则我们访问的时候回报错,然后我们运行消费者服务,我们会自动的接受我们的RabbitMQ的消息。

         上述图片的是我们消费者接收消息控制台输出对应的结果,我们基本的接受信息的操作就实现了。

 实例讲解

         我们接下来在我们的发布者中创建一个User实体类,然后我们发起一个请求将我们的实体对应传输过去。

User.java
package com.yx.publisher;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@SuppressWarnings("all")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User{
private String username;
private String userpwd;
}

        我们创建好实体类之后我们再去到我们的Controller类中去编写一个方法发送我们的实体对应到我们的RabbitMQ上去。在编写方法之前我们先去RabbitConfig配置类中去编写一个发送实体对象的队列。

        我们在对应的消费者服务中编写一个专门接受实体对象的类,并且在消费者服务者编写对应的实体对象进行接受。

 PojoReceiver.java
package com.yx.consumer;

import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitHandler;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

@Component
@SuppressWarnings("all")
@Slf4j
@RabbitListener(queues = "secondQueue") //接收的队列
public class PojoReceiver {
@RabbitHandler
public void process(User user) {
log.warn("接收到:" + user);
}
}

        编写完成之后我们重启我们的发布者服务,我们在网页测试发送实体对象的请求方法。

        我们的对象想要发送过去首先我们的对象实体类要实现序列化接口,我们在重新启动发布者服务调用对应的请求方法

 

 

        我们启动消费者进行接收信息结果会报错。

        报错的原因是因为发送的对象的名称和包名需要一致,我们如何解决呢?

 解决实体传输方案一:将对象转换成json的格式

        我们在发送之前将我们的实体对象转换成json的格式发送过去,再在消费者那边将json格式转换为实体对象的格式。

发布者

        消费者在对应的接收类中我们对其先注入ObjectMapper类,再将传输过来的json格式转换为实体对象。

 消费者

        我们再重启两个服务再进行对应的接口测试。 

        由上图可知我们成功的解决了传输实体对象的问题。 


🎉🎉本期的博客分享到此结束🎉🎉

📚📚各位老铁慢慢消化📚📚

🎯🎯下期博客博主会带来新货🎯🎯

🎁三连加关注,阅读不迷路 !🎁

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1407881.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测

多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测 目录 多维时序 | Matlab实现GWO-TCN-Multihead-Attention灰狼算法优化时间卷积网络结合多头注意力机制多变量时间序列预测效果一览基本介绍程序设计参考资料 效…

Universal Approximation Capabilities of Mixture of Weibulls (混合韦布尔分布的万能近似)

找了好久都没有找到混合韦布尔分布是否有万能近似性质,下面这个算是一点线索,不过看不太懂。 回答1:Ultimately this sounds tautological: just define “well-behaved” as any density that can be approximated, according to some speci…

uniapp+vue3+ts --微信小程序tab导航可以上下滚动选中选项组件代码

uniappvue3ts --微信小程序tab导航可以上下滚动选中选项组件代码 废话不多说&#xff0c;直接上代码。 组件代码&#xff1a; <template><view class"scroll-tabs-container"><view class"radiusz bg-white pt-[10rpx] z-[999]" :class&…

【Flutter 面试题】Flutter 是什么?它与其他移动开发框架有什么不同?

文章目录 写在前面Flutter是什么&#xff1f;定义和起源核心设计思想架构组成总结 Flutter与其他移动开发框架的差异1. 跨平台性能2. Dart语言的全面优势3. 热重载功能的优化体验4. 丰富的组件和库的生态系统5. UI一致性和用户体验总结 写在前面 &#x1f44f;&#x1f3fb; 正…

幻兽帕鲁4核16G配置推荐价格表阿里云和腾讯云

阿里云幻兽帕鲁服务器Palworld服务器推荐4核16G配置&#xff0c;可以选择通用型g7实例或通用算力型u1实例&#xff0c;ECS通用型g7实例4核16G配置价格是502.32元一个月&#xff0c;算力型u1实例4核16G是432.0元/月&#xff0c;经济型e实例是共享型云服务器&#xff0c;价格是32…

Qt配置OpenCV

首先安装好Qt Createor&#xff0c;CMake&#xff0c;OpenCV,我本次使用的是Qt6.3.4和OpenCV4.6.0 Qt Creator清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/qt/official_releases/qtcreator/OpenCV官网下载: https://opencv.org/releases/ 一. 编译OpenCV 首先使用Qt C…

【GitHub项目推荐--不错的 Go 学习项目】【转载】

开源实时性能分析平台 Pyroscope 是基于 Go 的开源实时性能分析平台&#xff0c;在源码中添加几行代码 pyroscope 就能帮你找出源代码中的性能问题和瓶颈、CPU 利用率过高的原因&#xff0c;调用树展示帮助你理解程序&#xff0c;支持 Go、Python、Ruby 语言。 Pyroscope 可以…

Linux RTC 子系统

rtc 一般负责系统关机后计时、闹钟等&#xff0c;Linux 内核提供了一个 rtc 子系统&#xff0c;来支持所有的 rtc 设备。 rtc 设备本质上是一个字符设备&#xff0c;rtc 子系统在字符设备的基础上抽象与硬件无关的部分&#xff0c;并在这个基础上拓展 sysfs 和 proc 文件系统下…

纯前端实现上一条下一条切换,并实现跨页切换上一条下一条

1.开发遇到了新的需求&#xff1a;再进入到视频播放界面&#xff0c;需要支持可以点击上一条下一条按钮&#xff0c;实现数据切换的功能 2.功能开发的理解 需要考虑到以上的需求&#xff0c; 1.由于视频的入口不一致&#xff0c;要根据入口的不同&#xff0c;实现不同的上一条…

Vue 的 事件修饰符and按键修饰符

1、事件修饰符概览 修饰符说明 .prevent阻止默认事件 .stop阻止冒泡.once事件只触发一次 .capture 添加事件侦听器时使用事件捕获模式.self只有点击当前元素本身时才会触发回调.passive事件的默认行为立即执行&#xff0c;无需等待事件回调执行完毕(不常用).native 将vue组件…

Qt 拖拽事件示例

一、引子 拖拽这个动作,在桌面应用程序中是非常实用和具有很友好的交互体验的。我们常见的譬如有,将文件拖拽到某个窗口打开,或者拖拽文件到指定位置上传;在绘图软件中,选中某个模板、并拖拽到画布上,画布上变回绘制该模板的图像… 诸如此类,数不胜数。 那么,在Qt中我…

学习笔记-李沐动手学深度学习(一)(01-07,概述、数据操作、tensor操作、数学基础、自动求导)

个人随笔 第三列是 jupyter记事本 官方github上啥都有&#xff08;代码、jupyter记事本、胶片&#xff09; https://github.com/d2l-ai 多体会 【梯度指向的是值变化最大的方向】 符号 维度 &#xff08;弹幕说&#xff09;2&#xff0c;3&#xff0c;4越后面维度越低 4…

Java线程池七大参数详解和配置(面试重点!!!)

一、corePoolSize核心线程数 二、maximunPoolSize最大线程数 三、keepAliveTime空闲线程存活时间 四、unit空闲线程存活时间的单位 五、workQueue线程工作队列 1、ArrayBlockingQueue FIFO有界阻塞队列 2、LinkedBlockingQueue FIFO无限队列 3、PriorityBlockingQueue V…

电池回收产业东风中,吉利科技集团如何先行一步?

随着绿色低碳可持续发展理念深入人心&#xff0c;全球能源变革和转型升级持续推进&#xff0c;新能源行业不断涌现新的机遇。 动力电池回收和再利用&#xff0c;就是近在眼前的“红利型”产业。 我国新能源汽车市场近年来爆发式增长&#xff0c;动力电池生产紧随电动车普及步…

Elasticsearch分布式一致性原理剖析(三)-Data篇

本文首发于云栖社区(Elasticsearch分布式一致性原理剖析(三)-Data篇-博客-云栖社区-阿里云)&#xff0c;由原作者转载。 前言 “Elasticsearch分布式一致性原理剖析”系列将会对Elasticsearch的分布式一致性原理进行详细的剖析&#xff0c;介绍其实现方式、原理以及其存在的问…

OceanBase创建租户

租户是集群之上的递进概念&#xff0c;OceanBase 数据库采用了多租户架构。 集群偏部署层面的物理概念&#xff0c;是 Zone 和节点的集合&#xff0c;租户则偏向于资源层面的逻辑概念&#xff0c;是在物理节点上划分的资源单元&#xff0c;可以指定其资源规格&#xff0c;包括…

常见的二十种软件测试方法详解

一.单元测试&#xff08;模块测试&#xff09; 单元测试是对软件组成单元进行测试。其目的是检验软件组成单位的正确性。测试对象是&#xff1a;模块。 对模块进行测试&#xff0c;单独的一个模块测试&#xff0c;属于静态测试的一类 测试阶段&#xff1a;编码后或者编码前&…

大数据学习之Redis、从零基础到入门(一)

目录 一、Redis入门概述 1. 是什么&#xff1f; 官方解释&#xff1a; 2. 能干嘛&#xff1f; 2.1 主流功能与应用 2.1.1分布式缓存 2.1.2内存存储和持久化(RDBAOF) 2.1.3高可用架构搭建 2.1.4缓存穿透、击穿、雪崩 2.1.5分布式锁 2.1.6队列 2.2 总体功能概括 2.3…

JeecgBoot 3.6.1实现Modal对话框,以为审核数据为例

JeecgBoot 3.6.1实现Modal对话框 vue使用的是3.0版本 文章目录 JeecgBoot 3.6.1实现Modal对话框前言一、列表页面关键代码示例二、textAuditModal.vue代码示例三、test.api.ts总结 前言 在工作中&#xff0c;有一个需求&#xff0c;要求&#xff0c;在数据列表页&#xff0c;…

容联云入选中国大模型产业新锐企业TOP30

近日&#xff0c; WIM 2023&#xff08;世界创新者年会&#xff09;发布《2023中国大模型产业创新服务商TOP 30》名单&#xff0c;评选出30家2023年中国大模型领域做出卓越贡献的企业&#xff0c;凭借垂直行业大模型“赤兔大模型”展现出的创新力与商业落地速度&#xff0c;容联…