mall :rabbit项目源码解析

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: mall :rabbit项目源码解析

一、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服务端

psRabbitMQErlang是紧密相关的,因此在选择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

然后百度找了许多教程,说改范围的还有换镜像的,结果都试了一下,结果这个找不到就算了,其它的依赖也全报错,应该是仓库的依赖冲突啥的,就不深究了。。。

✒️还是跟着项目走,将 ErlangRabbitMQ服务端版本降下来。

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

  1. Simple Work Queue(简单工作队列):也就是常说的点对点模式,一条消息由一个消费者进行消费。(当有多个消费者时,默认使用轮训机制把消息分配给消费者)。
  2. Work Queues (工作队列):也叫公平队列,能者多劳的消息队列模型。队列必须接收到来自消费者的 手动ack 才可以继续往消费者发送消息。
  3. Publish/Subscribe (发布订阅模式):一条消息被多个消费者消费。
  4. Routing(路由模式):有选择的接收消息。
  5. Topics(主题模式):通过一定的规则来选择性的接收消息。
  6. 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,感觉收获颇深,希望这篇文章对你们也会有所帮助。

后续我也会结合该框架学习一下其他的技术栈。

盈若安好,便是晴天

目录
相关文章
|
5天前
|
安全 虚拟化
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力
在数字化时代,网络项目的重要性日益凸显。本文从前期准备、方案内容和注意事项三个方面,详细解析了如何撰写一个优质高效的网络项目实施方案,帮助企业和用户实现更好的体验和竞争力。通过具体案例,展示了方案的制定和实施过程,强调了目标明确、技术先进、计划周密、风险可控和预算合理的重要性。
20 5
|
5天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
1月前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
67 0
|
1月前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
52 0
|
1月前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
60 0
|
1月前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
80 0
|
5天前
|
存储 安全 Linux
Golang的GMP调度模型与源码解析
【11月更文挑战第11天】GMP 调度模型是 Go 语言运行时系统的核心部分,用于高效管理和调度大量协程(goroutine)。它通过少量的操作系统线程(M)和逻辑处理器(P)来调度大量的轻量级协程(G),从而实现高性能的并发处理。GMP 模型通过本地队列和全局队列来减少锁竞争,提高调度效率。在 Go 源码中,`runtime.h` 文件定义了关键数据结构,`schedule()` 和 `findrunnable()` 函数实现了核心调度逻辑。通过深入研究 GMP 模型,可以更好地理解 Go 语言的并发机制。
|
18天前
|
消息中间件 缓存 安全
Future与FutureTask源码解析,接口阻塞问题及解决方案
【11月更文挑战第5天】在Java开发中,多线程编程是提高系统并发性能和资源利用率的重要手段。然而,多线程编程也带来了诸如线程安全、死锁、接口阻塞等一系列复杂问题。本文将深度剖析多线程优化技巧、Future与FutureTask的源码、接口阻塞问题及解决方案,并通过具体业务场景和Java代码示例进行实战演示。
38 3
|
1月前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
53 5
|
1月前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
110 5

推荐镜像

更多