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服务端
。
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项目源码解析的更多相关文章
- Android 开源项目源码解析(第二期)
Android 开源项目源码解析(第二期) 阅读目录 android-Ultra-Pull-To-Refresh 源码解析 DynamicLoadApk 源码解析 NineOldAnimations ...
- [原创]android开源项目源码解析(一)----CircleImageView的源码解析
CircleImageView的代码很简洁,因此先将此工程作为源码解析系列的第一篇文章. 解析说明都在代码里了. /* * Copyright 2014 - 2015 Henning Dodenhof ...
- 开源项目源码解析-PhotoView 源码解析
1. 功能介绍 特性(Features): 支持 Pinch 手势自由缩放. 支持双击放大/还原. 支持平滑滚动. 在滑动父控件下能够运行良好.(例如:ViewPager) 支持基于 Matrix 变 ...
- Github star 1.7k 的项目源码解析
先拜读源码,最后总结,以及其他实现思路.如有错误,欢迎指正! 项目介绍 名称:Darkmode.js 功能:给你的网站添加暗色模式 项目链接:https://github.com/sandoche/D ...
- 源码解析-Volley(转自codeKK)
Volley 源码解析 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo分析者:grumoon ...
- Volley 源码解析(转)
项目:Volley,分析者:grumoon,校对者:Trinea 本文为 Android 开源项目源码解析 中 Volley 部分项目地址:Volley,分析的版本:35ce778,Demo 地址:V ...
- 【转载】Xutils3源码解析
Github源码地址:https://github.com/wyouflf/xUtils3 原文地址 :http://www.codekk.com/blogs/detail/54cfab086c476 ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 【原】Android热更新开源项目Tinker源码解析系列之一:Dex热更新
[原]Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Tinker是微信的第一个开源项目,主要用于安卓应用bug的热修复和功能的迭代. Tinker github地址:http ...
- 【原】Android热更新开源项目Tinker源码解析系列之二:资源文件热更新
上一篇文章介绍了Dex文件的热更新流程,本文将会分析Tinker中对资源文件的热更新流程. 同Dex,资源文件的热更新同样包括三个部分:资源补丁生成,资源补丁合成及资源补丁加载. 本系列将从以下三个方 ...
随机推荐
- Vulnhub-Durian
Durian 一.靶机信息 # 靶机地址 http://www.vulnhub.com/entry/durian-1,553/ s #参考 https://blog.csdn.net/LYJ20010 ...
- Java设计模式中的几种常用设计模式总结
一.设计模式概念 1.定义 Java包含23种设计模式,是一套对代码设计经验的总结,被人们反复利用,多人熟知的代码设计方式. 2.目的 为了提高代码的可读性,可扩展性以及代码的复用性,为了解决 ...
- 2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] = a, 表示i号员工一开始得分是a, 给定一个长度为M的二维数组operatio
2023-06-18:给定一个长度为N的一维数组scores, 代表0~N-1号员工的初始得分, scores[i] = a, 表示i号员工一开始得分是a, 给定一个长度为M的二维数组operatio ...
- 【对比】ChatGPT Plus与ChatGPT实操对比体验
前言 缘由 20美刀大洋充值ChatGPT Plus,必须分享让它物尽其用 应单位追求科技前沿需求,以及花钱就是香的原则.遂找了远在他乡的高中老同学,斥资20美刀为公司身先士卒怒充会员.秉承分享至上原 ...
- CHATGPT制作AI绘画
CHATGPT是一种基于机器学习和自然语言处理技术的人工智能应用.它可以生成自然语言文本,并且可以通过训练来学习各种不同的技能. 其中,CHATGPT制作AI绘画指的是将CHATGPT应用于绘画领域, ...
- Typora 主题Mo Dark 样式
Mo Dark 主题样式 html { font-size: 16px; } /*加粗字体样式*/ strong { -webkit-background-clip: text; -webkit-te ...
- NextJS项目的部署以及多环境的实现
背景 开发了个Next项目,将部署过程记录一下.另外由于项目准备了两个服务器分别作为开发自测的开发环境和交付给客户的生产环境使用:因此也介绍一下NextJS项目中多环境的配置. 项目结构 计划是让Ng ...
- 【AI新趋势期刊#1】GPT自动理解视频、AI法律顾问、大模型安全围栏
每天都要浏览大量AI相关新闻,是不是感到信息量爆炸,有效信息少? 这么多新产品和新工具,到底哪些是真正是有价值的,哪些只是浮躁的一时热点? 想参与AI产品和工具的开发,从哪里能够获得大量的灵感和思路? ...
- 使用libswresample库实现音频重采样
一.初始化音频重采样器 在音频重采样时,用到的核心结构是SwrContext,我们可以通过swr_alloc()获取swr_ctx实例,然后通过av_opt_set_int()函数和av_opt_se ...
- 4.3 x64dbg 搜索内存可利用指令
发现漏洞的第一步则是需要寻找到可利用的反汇编指令片段,在某些时候远程缓冲区溢出需要通过类似于jmp esp等特定的反汇编指令实现跳转功能,并以此来执行布置好的ShellCode恶意代码片段,LyScr ...