mall :rabbit项目源码解析
文章目录
- 一、mall开源项目
- 1.1 来源
- 1.2 项目转移
- 1.3 项目克隆
- 二、RabbitMQ 消息中间件
- 2.1 rabbit简介
- 2.2 分布式后端项目的使用流程
- 2.3 分布式后端项目的使用场景
- 三、安装RabbitMQ(Win10)
- 3.1安装erLang语言,配置环境变量
- 3.2 安装RabbitMQ服务端
- 3.3 测试安装效果
- 四、源码解析
- 4.1 集成与配置
- 4.1.1 导入依赖
- 4.1.2 添加配置
- 4.1.3 创建用户,密码,绑定角色(在命令行下)
- 4.1.4 创建用户,密码,绑定角色(在web界面管理工具下)
- 4.1.5 拓展
- 4.2 深入浅出
- 4.2.1 六种消息模式介绍
- 4.2.2 简单工作队列模式
- 4.2.3 工作队列模式
- 4.2.4 发布订阅模式
- 4.2.5 路由模式
- 4.2.5 主题模式
- 五、总结
一、mall开源项目
1.1 来源
mall学习教程,架构、业务、技术要点全方位解析。mall项目(50k+star)是一套电商系统,使用现阶段主流技术实现。涵盖了SpringBoot 2.3.0、MyBatis 3.4.6、Elasticsearch 7.6.2、RabbitMQ 3.7.15、Redis 5.0、MongoDB 4.2.5、Mysql5.7等技术,采用Docker容器化部署。
项目github地址: github.com
1.2 项目转移
可以把github上的项目转移到gitee上,方便克隆到idea。
具体步骤如下:

1.3 项目克隆
由于github部署在国外,虽然idea也支持从github上拉取,但是克隆速度太慢,所以才推荐上述导入gitee后在克隆项目到idea。
具体的克隆步骤过于简单和常规化,读者可自行完成,或百度一下~
二、RabbitMQ 消息中间件
RabbitMQ 消息的传递:是由『 生产者 -> 交换机 -> 队列 -> 消费者 』这么一个模式,只不过点对点模式和工作队列模式我们可以理解成是一个匿名的交换机进行投递队列。
2.1 rabbit简介
RabbitMQ 官网:官网
RabbitMQ是一个消息代理 - 一个消息系统的媒介。它可以为你的应用提供一个通用的消息发送和接收平台,并且保证消息在传输过程中的安全。
RabbitMQ是一款使用Erlang语言开发的,实现AMQP(高级消息队列协议)的开源消息中间件。首先要知道一些RabbitMQ的特点如下:
- 可靠性。支持持久化,传输确认,发布确认等保证了MQ的可靠性。
- 灵活的分发消息策略。这应该是RabbitMQ的一大特点。在消息进入MQ前由Exchange(交换机)进行路由消息。分发消息策略有:简单模式、工作队列模式、发布订阅模式、路由模式、通配符模式。
- 支持集群。多台RabbitMQ服务器可以组成一个集群,形成一个逻辑Broker。
- 多种协议。RabbitMQ支持多种消息队列协议,比如 STOMP、MQTT 等等。
- 支持多种语言客户端。RabbitMQ几乎支持所有常用编程语言,包括 Java、.NET、Ruby 等等。
- 可视化管理界面。RabbitMQ提供了一个易用的用户界面,使得用户可以监控和管理消息 Broker。
- 插件机制。RabbitMQ提供了许多插件,可以通过插件进行扩展,也可以编写自己的插件。
rabbit开发文档地址: [java客户端开发文档]( Java客户端指南 · RabbitMQ in Chinese (mr-ping.com) )
2.2 分布式后端项目的使用流程
下图是结合项目经历,外加百度查找资料,自行总结的基本使用流程。
rabbitmq的使用流程图如下:

2.3 分布式后端项目的使用场景
下图是结合项目经历,外加百度查找资料,自行总结的基本使用场景。
rabbitmq的使用场景图如下:

三、安装RabbitMQ(Win10)
由于以前都是在Linux上操作rabbitmq( 一般用Docker拉一个RabbitMQ的镜像下来,省去环境的部署 ),现在解读源码,尝试一下在win10下操作,需要先有环境, 首先先下载Erlang ,再下载RabbitMQ服务端。
ps: RabbitMQ和Erlang是紧密相关的,因此在选择RabbitMQ版本时,需要确保它与您安装的特定Erlang版本兼容。
( Erlang/OTP 26.0.2与之兼容版本是RabbitMQ 3.8.x 或者 更高 )
❌写到后面我憨住了,早知道不选这么高的版本了
经过:安装好两个版本后,忘记看项目中 spring-boot-starter-amqp版本为2.1.3作为RabbitMQ客户端库,结果版本不兼容,导致一直连不上,网上百度一堆问题,我都仔细刷选过了,都是正确的。后面只能把问题定位到版本不兼容上了,然后说退而求其次,去升级spring-boot-starter-amqp版本为2.3.x就可以完美解决,没想到的是…
阿里云仓库太坑了,居然没有。。。
Could not find artifact org.springframework.boot:spring-boot-starter-amqp:pom:2.3.3 in alimaven
然后百度找了许多教程,说改范围的还有换镜像的,结果都试了一下,结果这个找不到就算了,其它的依赖也全报错,应该是仓库的依赖冲突啥的,就不深究了。。。
✒️还是跟着项目走,将 Erlang 和RabbitMQ服务端版本降下来。
spring-boot-starter-amqp的版本为2.1.3 是与 RabbitMQ 3.7.x 版本兼容的版本
这里下载RabbitMQ服务端:rabbitmq-server-3.7.3.exe。
对应的Erlang 版本在19.3 - 20.x(记住一定要卸载干净,版本一定要兼容,不然安装插件会报版本不兼容的错误)
下面截图就不更新了,没啥必要,只是版本号不同,操作几乎大同小异。(最终是连接上了,确实是版本不兼容的问题,真是各处坑都踩完……)
3.1安装erLang语言,配置环境变量
1、先到官网下载,Erlang官网:官网(下载win10版)

2、下载完成为otp_win64_26.0.exe,接着双击安装,一直点next就行了(可以切换安装路径),安装完之后,配置环境变量。

3、 环境变量配置完毕,使用cmd命令,输入erl -version验证是否成功。
成功截图类似下图:

3.2 安装RabbitMQ服务端
1、在RabbitMQ的github上下载window版本的服务端安装包。
下载地址:Release RabbitMQ 3.8.32 · rabbitmq/rabbitmq-server (github.com) )

2、下载为rabbitmq_server-3.8.32.exe,接着到双击安装,一直点下一步安装即可(可以切换安装路径),安装完成后,找到安装目录下\rabbitmq\rabbitmq_server-3.8.32\sbin 打开cmd命令,输入rabbitmq-plugins enable rabbitmq_management命令安装管理页面的插件。

3、 双击rabbitmq-server.bat启动脚本,然后打开服务管理可以看到RabbitMQs是否正在运行。(降低版本后,没有注册到服务上,需要启动脚本,不要关闭命令行窗口,使得服务在其上跑着)

3.3 测试安装效果
1、 打开浏览器输入http://localhost:15672
账号密码默认是:guest/guest,成功效果:

2、安装成功,登录后的效果如下图。

四、源码解析
看源码自我总结出来的看新项目时的基本步骤,首先先看集成和配置,在从业务的角度来分析,结合集成的框架和组件,来依次剥削系统的架构。
**解析内容:**下方的解析内容大部分在图中解释,外面就不做过多的阐述。
4.1 集成与配置
直接拿源码分析,只分析与rabbitmq有关的部分,其它部分读者请,自行看源码分析。
**项目启动:**只需要启动mall-tiny-rabbit模块的部分即可。
**启动所需:**启动RabbitMQ的服务(前面有安装win10版)
4.1.1 导入依赖
在pom文件中导入rabbitmq的相关依赖spring-boot-starter-amqp(rabbitmq集成进springboot)。

4.1.2 添加配置
在application.yml中添加rabbitmq的相关配置。

4.1.3 创建用户,密码,绑定角色(在命令行下)
rabbitmq的用户管理包括增加用户,删除用户,查看用户列表,修改用户密码。
1、 查看已有用户及用户的角色:
rabbitmqctl.bat list_users

2、 新增一个用户:
// rabbitmqctl.bat add_user username password
rabbitmqctl.bat add_user mall mall

3、删除一个用户:
// 注意观察查询、添加、删除都是只换前缀,更新亦然,就不列举了
rabbitmqctl.bat delete_user mall
4、绑定角色:
rabbitmqctl.bat set_user_tags mall administrator

4.1.4 创建用户,密码,绑定角色(在web界面管理工具下)
1、介绍web界面管理工具页

2、 添加用户和给予角色

3、由于yml文件中配置有virtual-host: /mall, 添加Virtual Hosts(可以理解成一个数据库,类似于mysql、oracle之类的)

4.1.5 拓展
rabbitmq用户角色可分为五类:超级管理员, 监控者, 策略制定者, 普通管理者以及其他。
(1) 超级管理员(administrator)
可登陆管理控制台(启用management plugin的情况下),可查看所有的信息,并且可以对用户,策略(policy)进行操作。
(2) 监控者(monitoring)
可登陆管理控制台(启用management plugin的情况下),同时可以查看rabbitmq节点的相关信息(进程数,内存使用情况,磁盘使用情况等)
(3) 策略制定者(policymaker)
可登陆管理控制台(启用management plugin的情况下), 同时可以对policy进行管理。
(4) 普通管理者(management)
仅可登陆管理控制台(启用management plugin的情况下),无法看到节点信息,也无法对策略进行管理。
(5) 其他的
无法登陆管理控制台,通常就是普通的生产者和消费者。
4.2 深入浅出
4.2.1 六种消息模式介绍
六种消息模式的官网:RabbitMQ Tutorials — RabbitMQ
Simple Work Queue(简单工作队列):也就是常说的点对点模式,一条消息由一个消费者进行消费。(当有多个消费者时,默认使用轮训机制把消息分配给消费者)。Work Queues(工作队列):也叫公平队列,能者多劳的消息队列模型。队列必须接收到来自消费者的 手动ack 才可以继续往消费者发送消息。Publish/Subscribe(发布订阅模式):一条消息被多个消费者消费。Routing(路由模式):有选择的接收消息。Topics(主题模式):通过一定的规则来选择性的接收消息。RPC模式:发布者发布消息,并且通过 RPC 方式等待结果。(使用场景少,在源码中没有,想了解的可以去官网了解)
ps:官网最后有一个 Publisher Confirms 为消息确认机制。指的是生产者如何发送可靠的消息。
4.2.2 简单工作队列模式
一条消息由一个消费者进行消费 (当有多个消费者时,默认使用轮训机制把消息分配给消费者)
1、 配置类
配置 RabbitMQ 的 Spring 配置类 SimpleRabbitConfig,其中创建了一个消息队列对象、一个发送消息的对象(SimpleSender),以及一个接收消息的对象(SimpleReceiver)。这些对象都将由 Spring 框架进行管理和注入。

2、消息发送者

3、消息消费者

4、简单工作队列模式的控制层接口

5、swagger发送效果
swagger无法启动的,请参考我上一篇博文: mall:redis项目源码解析_忆~遂愿的博客-CSDN博客

6、rabbitmq服务端的界面显示效果

7、idea控制台打印的日志信息

4.2.3 工作队列模式
公平队列,能者多劳的消息队列模型。队列必须接收到来自消费者的 手动ack 才可以继续往消费者发送消息。(模拟消费)
1、 定义了一些消息队列以及相应的消息接收器和发送器

2、消息发送者

3、消息消费者

4、工作队列模式的控制层接口

5、idea控制台打印的日志信息

4.2.4 发布订阅模式
一条消息被多个消费者消费。
1、配置类

2、消息发送者

3、消息消费者

4、发布/订阅模式的控制层接口

5、rabbitmq服务端的界面显示效果

6、idea控制台打印的日志信息

4.2.5 路由模式
有选择的接收消息。
1、配置类
通过配置不同的绑定键,可以将不同的队列绑定到同一个交换机上,以实现消息的路由和分发。

2、消息发送者

3、消息消费者

4、路由模式的控制层接口

5、idea控制台打印的日志信息

4.2.5 主题模式
通过一定的规则来选择性的接收消息。
1、配置类

2、消息发送者

3、消息消费者

4、路由模式的控制层接口

5、idea控制台打印的日志信息

五、总结
本文是有我先从实际项目中获取需求,从而对RabbitMQ消息队列的学习,结合源码来学习,从mall开源项目中学习RabbitMQ,感觉收获颇深,希望这篇文章对你们也会有所帮助。
后续我也会结合该框架学习一下其他的技术栈。
盈若安好,便是晴天
相关文章:
mall :rabbit项目源码解析
文章目录 一、mall开源项目1.1 来源1.2 项目转移1.3 项目克隆 二、RabbitMQ 消息中间件2.1 rabbit简介2.2 分布式后端项目的使用流程2.3 分布式后端项目的使用场景 三、安装RabbitMQ(Win10)3.1安装erLang语言,配置环境变量3.2 安装RabbitMQ服务端3.3 测试安装效果 四…...
JDBC连接数据库
目录 一.什么是JDBC 二.JDBC的实现步骤 三.简单使用JDBC 一.什么是JDBC JDBC是Java数据库连接,是java中提供数据库访问的Java API,它为关系型数据库的提供了统一访问规范。 二.JDBC的实现步骤 1.创建数据库连接 这里有两种方式: DataSource创建,提…...
Linux学习之Ubuntu 20中OpenResty的nginx目录里内容和配置文件
参考的文章是《nginx配置详解》 可以参考我以前的文章安装OpenResty。 cd /usr/local/openresty切换目录,ls -l查看目录里边的内容。 我的系统中,nginx目录是/usr/local/openresty/nginx,在这个目录里边有一些目录,如下ÿ…...
使用axi_quad_spi操作spi_flash
文章目录 基本测试情况IP支持的命令 基本测试情况 有spi_flash需要访问,为简单计,选择使用axi_quad_spi进行操作。开始时,将IP配置成如下参数, 这样配置,是想着能够适应各家的FLASH(实际使用的则是micron…...
Linux:tomcat (源码包安装)(官网下载-安装-启动-配置-等等等-----从入门到入土)
介绍 Apache Tomcat软件是一个开源实现 Jakarta Servlet、Jakarta Server Pages、Jakarta Expression Language、Jakarta WebSocket、Jakarta Annotations 和 Jakarta Authentication 规范。 这些规范是Jakarta EE平台的一部分。 Apache Tomcat软件是在开放和参与式中开发的。 …...
中科驭数以DPU先进计算技术,夯实下一代金融IT基础设施底座
由中国计算机学会主办的第19届CCF全国高性能计算学术年会(CCF HPC China 2023)于8月23日至26日在青岛成功召开。在“高性能金融计算”主题论坛上,中科驭数高级副总裁、CTO卢文岩应邀发表了题为《DPU先进计算技术助力下一代交易底座》的演讲&a…...
Android 手游聚合SDK小知识(二) 聚合分包
更新: 在上一篇文章中,我们介绍了如何聚合SDK的基本原理,介绍了聚合SDK的接口设计,那么当CP接入了我们的聚合SDK,给了我们游戏apk包时,这时我们又当如何分发渠道包呢? 分发渠道包:…...
【RISC-V】RISC-V寄存器
一、通用寄存器 32位RISC-V体系结构提供32个32位的整型通用寄存器寄存器别名全称说明X0zero零寄存器可做源寄存器(rs)或目标寄存器(rd)X1ra链接寄存器保存函数返回地址X2sp栈指针寄存器指向栈的地址X3gp全局寄存器用于链接器松弛优化X4tp线程寄存器常用于在OS中保存指向进程控…...
Python爬虫异常处理实践:处理被封禁和网站升级问题
在这篇文章中,我们将一起探讨Python爬虫异常处理实践,特别关注处理被封禁和网站升级问题。让我们一起来看看如何解决这些问题,提高我们爬虫程序的稳定性和可靠性。 首先,我们要了解为什么会遇到这些问题。网站封禁爬虫的原因主…...
重大工程建造云服务平台源码 SpringCloud+Vue
技术架构: 微服务JavaSpring Cloud VueUniApp MySql 开发语言:Java 开发工具:Idea 前端框架:Vue 后端框架:Spring Cloud 数 据 库:MySql 移 动 端:UniApp 系统端口:PC端&…...
MyBatisPlus简单入门
1、简单介绍MyBatisPlus MyBatisPlus是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,完全去SQL化,封装好了大量的CRUD操作。甚至吧CRUD操作封装到了Service层,可以直接在Controller调用现成的CRUD服务层,…...
神经网络入门
神经网络的基本骨架 1. nn.Module的使用 所有的模型都要继承 Module 类需要重写初始化函数和运算步骤函数 eg: import torch.nn as nn import torch.nn.functional as Fclass Model(nn.Module): # 继承父类Module def __init__(self): # 重写初始化函数super()…...
【面试经典150题】多数元素
🔗题目链接 ✈题目描述: 给定一个大小为 n 的数组 nums ,返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 ⌊ n/2 ⌋表示n/2结果向下取…...
c#垃圾回收(Garbage Collection)
在C#中,垃圾回收(Garbage Collection)是一种自动管理内存的机制。它负责跟踪和释放不再使用的内存,以便程序可以有效地使用内存资源。 C#中的垃圾回收器是由.NET运行时(CLR)提供和管理的。它使用了一种叫做…...
vue 基于element-plus el-button封装按钮组件
封装组件的原则是:组件只是数据流通的一个管道,不要糅合太多的逻辑在里面,是一个纯组件,还要根据自己项目的业务场景做具体的处理。 // MyButton.vue // 基于element-plus中el-button来封装按钮 <template><el-button c…...
smbus只能再python2.7下运行?不能再python3.8下运行吗?
不是的,SMBus并不只能在Python 2.7下运行,它也可以在Python 3.8及更高版本下运行。SMBus是用于访问系统上的I2C设备(Inter-Integrated Circuit,一种串行通信协议)的Python库,它应该与Python 3.8兼容。 要在…...
python中is和==的区别
is 和 的区别 在Python中,is和是两个用于比较对象的操作符,它们有不同的作用和用法。 is操作符: is用于比较两个对象的身份标识,即判断两个对象是否引用同一个内存地址的对象。当is操作符用于比较两个对象时,它会判断…...
Viobot回环使用
Viobot回环是使用词袋匹配的方式,,当新的关键帧能够匹配词袋里面记录过的关键帧时,触发回环,将设备的当前位姿拉到历史位姿。 一.上位机操作 词袋使用方法 连接上设备,先停止算法。UI上点 设置 选到 loop 选项卡&…...
React钩子函数之forward结合useImperativeHandle钩子的基本使用
React钩子函数是React框架中非常重要的一部分,其中forward和useImperativeHandle是两个常用的钩子函数。这两个钩子函数可以结合使用,用来实现一些高级的功能。 首先,让我们来了解一下forward钩子函数。它的作用是将父组件中的props传递给子…...
c++中移动语义和完美转发
C 中的移动语义和完美转发是 C11 引入的两个重要特性,它们分别用于提高性能和灵活性。 移动语义(Move Semantics): 移动语义允许有效地将资源(如堆上分配的内存或其他资源)从一个对象转移到另一个对象,而…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Unity3D中Gfx.WaitForPresent优化方案
前言 在Unity中,Gfx.WaitForPresent占用CPU过高通常表示主线程在等待GPU完成渲染(即CPU被阻塞),这表明存在GPU瓶颈或垂直同步/帧率设置问题。以下是系统的优化方案: 对惹,这里有一个游戏开发交流小组&…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
基于SpringBoot在线拍卖系统的设计和实现
摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统,主要的模块包括管理员;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...
【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看
文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...
MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用
文章目录 一、背景知识:什么是 B-Tree 和 BTree? B-Tree(平衡多路查找树) BTree(B-Tree 的变种) 二、结构对比:一张图看懂 三、为什么 MySQL InnoDB 选择 BTree? 1. 范围查询更快 2…...
《Docker》架构
文章目录 架构模式单机架构应用数据分离架构应用服务器集群架构读写分离/主从分离架构冷热分离架构垂直分库架构微服务架构容器编排架构什么是容器,docker,镜像,k8s 架构模式 单机架构 单机架构其实就是应用服务器和单机服务器都部署在同一…...
