mall :rabbit项目源码解析

news2024/11/28 9:27:24

文章目录

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

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,感觉收获颇深,希望这篇文章对你们也会有所帮助。

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

盈若安好,便是晴天

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

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

相关文章

webservice调用对接第三方系统

#webservice调用对接第三方系统# 最近接到一个任务,需要对接第三方数据,第三方提供对接方式的是通过webservice调用,webservice调用有好几种方式,具体可以自行了解,我选择的是通过wsdl文件自动生成客户端代码对接。 …

专门针对开发人员,攻击者利用Rust获取操作系统信息

近日,研究人员在 Rust 编程语言的 crate 注册表中发现了一些恶意软件包,专门针对开发人员。 Phylum 在上周发布的一份报告中称,这些库是由一个名为 "amaperf "的用户在 2023 年 8 月 14 日至 16 日之间上传的。现已删除的软件包名…

2461. 长度为 K 子数组中的最大和

2461. 长度为 K 子数组中的最大和 C代码&#xff1a;滑动窗口 long long maximumSubarraySum(int* nums, int numsSize, int k){int hash[100001] {0};long long sum 0;int l 0;long long ans 0;for (int r 0; r < numsSize; r) {hash[nums[r]];sum nums[r];while ((…

ZooKeeper基础命令和Java客户端操作

1、zkCli的常用命令操作 &#xff08;1&#xff09;Help &#xff08;2&#xff09;ls 使用 ls 命令来查看当前znode中所包含的内容 &#xff08;3&#xff09;ls2查看当前节点数据并能看到更新次数等数据 &#xff08;4&#xff09;stat查看节点状态 &#xff08;5&#xf…

【Unity-Cinemachine相机】Cinemachine Brain属性详解

在Package Manager中下载Cinemachine 创建一个Virtual Camera&#xff0c;然后会发现Main Camera后面多出了个标志&#xff0c;而且属性也不能再修改了 因为绑定了CinemachineBrain&#xff0c;它会读取场景中某个虚拟相机的配置&#xff0c;并以此配置来控制相机的行为&#x…

C#---第二十:不同类型方法的执行顺序(new / virtual / common / override)

本文介绍不同类型的方法&#xff0c;在代码中的执行顺序问题&#xff1a; 构造方法普通方法&#xff08;暂用common代替&#xff09;、虚方法&#xff08;Virtual修饰&#xff09;、New方法&#xff08;new修饰&#xff09;三个优先级相同overide方法&#xff08;会替换virtual…

Docker 中下载各版本的 CentOS、CentOS Steam 方式

如果你跟我一样&#xff0c;想要在docker下载centos的镜像&#xff0c;但是无奈访问不了 https://hub.docker.com/&#xff0c;于是不知道有哪些tag可以下载&#xff0c;该如何办呢&#xff1f; 方法如下&#xff0c;以供参考。 访问&#xff1a;https://quay.io/repository/…

【Terraform学习】Terraform模块基础操作(Terraform模块)

本站以分享各种运维经验和运维所需要的技能为主 《python》&#xff1a;python零基础入门学习 《shell》&#xff1a;shell学习 《terraform》持续更新中&#xff1a;terraform_Aws学习零基础入门到最佳实战 《k8》暂未更新 《docker学习》暂未更新 《ceph学习》ceph日常问题解…

Python 及 Pycharm 的安装 2023.8

Python 及 PyCharm 的安装 仅适用于 Windows 系统&#xff01; 视频教程&#xff1a;【Python及Pycharm的安装 2023.8】 https://www.bilibili.com/video/BV1A34y1T7Gu 文章目录 Python 及 PyCharm 的安装安装 Python安装 PyCharmHi, PyCharmPyCharm 汉化 安装 Python 进入 …

Linux音频了解

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01; 本章将会讨论如下主题内容。 ⚫ Linux 下 ALSA 框架概述&#xff1b; ⚫ alsa-lib 库介绍&#xff1b; ⚫ alsa-lib 库移植&#xff1b; ⚫ alsa-l…

8.30 QT界面 常用组件 和 类的 设置

this -> setFixedSize(540, 410); //固定窗口大小this -> setWindowTitle("啊啊啊"); //设置窗口标题this -> setWindowIcon(QIcon("E:/1.png")); //设置窗口图标QLabel *lab1 new QLabel(this); //构造一个标签lab1 -> setPixmap(QPi…

Doris数据库BE——Stream load流程中事务状态

Stream Load的事务管理由FE负责&#xff0c;Doris的事务状态包括&#xff1a;PREPARE、COMMITTED、VISIBLE和ABORTED。 数据导入开始之前&#xff0c;Coordinator BE节点会向FE发送Begin Transaction请求&#xff0c;FE会为当前label开启一个新的事务&#xff0c;并为事务分配…

从零开始探索C语言(四)----循环

文章目录 1. C 循环1.1 while 循环1.2 for 循环1.3 do...1.4 嵌套循环 2. 循环控制语句2.1 break 语句2.2 continue 语句2.3 goto 语句 1. C 循环 有的时候&#xff0c;我们可能需要多次执行同一块代码。一般情况下&#xff0c;语句是按顺序执行的&#xff1a;函数中的第一个语…

Servlet与过滤器

目录 Servlet 过滤器 Servlet Servlet做了什么 本身不做任何业务处理,只是接收请求并决定调用哪个JavaBean去处理请求,确定用哪个页面来显示处理返回的数据 Servlet是什么 ServerApplet&#xff0c;是一种服务器端的Java应用程序 只有当一个服务器端的程序使用了Servlet…

Hive-启动与操作(2)

&#x1f947;&#x1f947;【大数据学习记录篇】-持续更新中~&#x1f947;&#x1f947; 个人主页&#xff1a;beixi 本文章收录于专栏&#xff08;点击传送&#xff09;&#xff1a;【大数据学习】 &#x1f493;&#x1f493;持续更新中&#xff0c;感谢各位前辈朋友们支持…

基于FPGA的图像sobel边缘提取算法开发,包括tb测试文件以及matlab验证代码

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer: // // Create Date: 202…

(一)KITTI数据集用于3D目标检测

KITTI数据集介绍 数据基本情况 KITTI是德国卡尔斯鲁厄科技学院和丰田芝加哥研究院开源的数据集,最早发布于2012年03月20号。 对应的论文Are we ready for Autonomous Driving? The KITTI Vision Benchmark Suite发表在CVPR2012上。 KITTI数据集搜集自德国卡尔斯鲁厄市&…

QT基础教程之九Qt文件系统

QT基础教程之九Qt文件系统 文件操作是应用程序必不可少的部分。Qt 作为一个通用开发库&#xff0c;提供了跨平台的文件操作能力。Qt 通过QIODevice提供了对 I/O 设备的抽象&#xff0c;这些设备具有读写字节块的能力。下面是 I/O 设备的类图&#xff08;Qt5&#xff09;&#…

Leetcode Top 100 Liked Questions(序号105~139)

105. Construct Binary Tree from Preorder and Inorder Traversal105. Construct Binary Tree from Preorder and Inorder Traversal 题意&#xff1a;根据前序遍历和中序遍历来构造二叉树 我的思路 要用递归造树&#xff0c;要同时递归左子树和右子树&#xff0c;造树需要…

Ansible学习笔记9

yum_repository模块&#xff1a; yum_repository模块用于配置yum仓库的。 测试下&#xff1a; [rootlocalhost ~]# ansible group1 -m yum_repository -a "namelocal descriptionlocalyum baseurlfile:///mnt/ enabledyes gpgcheckno" 192.168.17.106 | CHANGED &g…