# RocketMQ 实战:模拟电商网站场景综合案例(一)

RocketMQ 实战:模拟电商网站场景综合案例(一)

========================================================

一、内容介绍

1、案例介绍:

1.1 业务分析

1)下单业务
2)支付业务

1.2 问题分析

2、技术分析

2.1 技术选型:

1)SpringBoot
2)Dubbo
3)Zookeeper
4)RocketMQ
5)Mysql

2.2 SpringBoot 整合 RocketMQ

1)消息生产者
2)消息消费者。

2.3 SpringBoot 整合 Dubbo

1)搭建 Zookeeper 集群
2)RPC 服务接口
3)服务提供者
4)服务消费者。

3、环境搭建

3.1 数据库

1)优惠券表
2)商品表
3)订单表
4)订单商品日志表
5)用户表
6)用户余额日志表
7)订单支付表
8)MQ 消息生产表
9)MQ 消息消费表。

3.2 项目初始化

1)工程浏览

  • shop-api 接口层
  • shop-common 工具工程
  • shop-coupon-service 优惠券服务
  • shop-goods-service 商品服务
  • shop-order-service 订单服务
  • shop-order-web 订单系统
  • shop-parent 父工程
  • shop-pay-service 支付服务
  • shop-pay-web 支付系统
  • shop-pojo 实体类
  • shop-user-service 用户服务。
  • shop-dao 持久层 。

2)工程关系:12个系统

  • shop-common 工具工程

  • shop-parent 父工程

  • shop-pojo 实体类

  • shop-dao 持久层。

  • 1)web 层 :

  • shop-order-web 订单系统

  • shop-pay-web 支付系统

  • 接口层:shop-api 接口层

  • 2)服务层:

  • shop-coupon-service 优惠券服务

  • shop-goods- 商品服务

  • shop-order-service 订单服务

  • shop-pay-service 支付服务

  • shop-user-service 用户服务。

  • 3)储存层:数据库 Mysql

3.3 MyBatis 逆向工程使用

1)代码生成
2)代码导入。

3.4 公共类介绍

1)ID 生成器
2)异常处理类
3)常量类
4)响应实体类。

4、下单业务

4.1 下单基本流程
  • 1)接口定义
  • 2)业务类实现
  • 3)校验订单
  • 4)生成预订单
  • 5)扣减库存
  • 6)扣减优惠券
  • 7)扣减用户余额
  • 8)确认订单
  • 9)小结
4.2 失败补偿机制
  • 1)消息发送方
  • 2)消费接收方
4.3 测试

5、支付业务

5.1 创建支付订单
5.2 支付回调

6、整体联调

6.1 准备工作

1)配置 RestTemplate 类。
2)配置请示地址。

6.2 下单测试
6.3 支付测试。

二、综合案例功能介绍

1、业务分析

模拟电商网站场景主要业务分为:订单业务 和 支付业务。

1.1、订单业务流程:
  • 1)用户请求订单系统下单
  • 2)订单系统通过RPC调用订单服务下单
  • 3)订单服务调用优惠券服务,扣减优惠券
  • 4)订单服务调用调用库存服务,校验并扣减库存
  • 5)订单服务调用用户服务,扣减用户余额
  • 6)订单服务完成确认订单

在这里插入图片描述

1.2、支付业务流程:
  • 1)用户请求支付系统
  • 2)支付系统调用第三方支付平台API进行发起支付流程
  • 3)用户通过第三方支付平台支付成功后,第三方支付平台回调通知支付系统
  • 4)支付系统调用订单服务修改订单状态
  • 5)支付系统调用积分服务添加积分
  • 6)支付系统调用日志服务记录日志。

在这里插入图片描述

2、问题分析

2.1、问题1

用户提交订单后,扣减库存成功、扣减优惠券成功、使用余额成功,但是在确认订单操作失败,需要对库存、库存、余额进行回退。如何保证数据的完整性?

解决方案:

使用 RocketMQ 保证在下单失败后系统数据的完整性。

在这里插入图片描述

2.2、问题2

用户通过第三方支付平台(支付宝、微信)支付成功后,第三方支付平台要通过回调 API 异步通知商家支付系统用户支付结果,支付系统根据支付结果修改订单状态、记录支付日志和给用户增加积分。

商家支付系统如何保证在收到第三方支付平台的异步通知时,如何快速给第三方支付凭条做出回应?

解决方案:

通过 RocketMQ 进行数据分发,提高系统处理性能。

在这里插入图片描述

三、项目技术介绍

1、技术分析:技术选型:

1)SpringBoot :使用框架,快速开发。
2)Dubbo :实现 微服务分布式系统的 RPC 远程调用。
3)Zookeeper :服务注册中心,搭建高可用集群系统
4)RocketMQ :消息中间件实现系统解藕。
5)Mysql :存储基础数据。
在这里插入图片描述

2、技术分析:SpringBoot 整合 RocketMQ

1)消息生产者
2)消息消费者。

3、技术分析:SpringBoot 整合 Dubbo

1)搭建 Zookeeper 集群
2)RPC 服务接口
3)服务提供者
4)服务消费者。


四、SpringBoot 整合 RocketMQ :springboot 集成 rocketmq 生产者

1、下载 rocketmq-spring 项目,

https://github.com/apache/rocketmq-spring.git

rocketmq-spring-rocketmq-spring-all-2.0.3.zip

2、将 rocketmq-spring 安装到本地仓库。

mvn install -Dmaven.skip.test=true 

3、打开 idea 创建 springboot-rocketmq-producer 项目,并在项目 pom.xml 中添加 依赖。


	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( springboot-rocketmq-producer )
		Version : 1.0-SNAPSHOT
	--> Name: ( springboot-rocketmq-producer )
		Location: ( ...\springboot-rocketmq-producer\ )	
	--> Finish


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>djh.it</groupId>
    <artifactId>springboot-rocketmq-producer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <properties>
        <rocketmq-spring-boot-starter-version>2.0.3</rocketmq-spring-boot-starter-version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>${rocketmq-spring-boot-starter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
<!-- Dspringboot-rocketmq-producer\pom.xml -->

4、在项目 springboot-rocketmq-producer 中,添加 application.properties 配置文件


##  springboot-rocketmq-producer\src\main\resources\application.properties 

rocketmq.name-server=192.168.25.135:9876;192.168.25.138:9876   # nameserver
rocketmq.producer.group=my-group   # 发送者组名


5、在项目 springboot-rocketmq-producer 中,创建启动类 ProducerApplication.java


/**
 *   springboot-rocketmq-producer\src\main\java\djh\it\shop\springboot\rocketmq\ProducerApplication.java
 *
 *   2024-6-3 创建启动类 ProducerApplication.java
 */

package djh.it.shop.springboot.rocketmq;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ProducerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ProducerApplication.class, args);
    }
}


6、在项目 springboot-rocketmq-producer 中,创建 测试 类 ProducerTest。java 进行测试。


/**
 *   idea\springboot-rocketmq-producer\src\test\java\djh\it\shop\test\ProducerTest.java
 *
 *   2024-6-3 创建 测试 类 ProducerTest。java
 */

package djh.it.shop.test;

import djh.it.shop.springboot.rocketmq.ProducerApplication;

import lombok.extern.slf4j.Slf4j;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ProducerApplication.class})
@Slf4j
public class ProducerTest {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @Test
    public void testSendMessage(){
        rocketMQTemplate.convertAndSend("springboot-rocketmq", "Hello Springboot Rocketmq");
        log.info("消息发送成功");
    }
}

7、如果安装了RocketMQ 控制台,可以进行后台查看。

浏览器地址栏输入:虚拟机 IP :8080 登录到 RocketMQ 控制台,进行测试

如:http://192.168.25.135:8080/
http://172.18.30.110:8080/

点击【主题】,查看到 【springboot-rocketmq】。

在这里插入图片描述

在这里插入图片描述


五、SpringBoot 整合 RocketMQ :springboot 集成 rocketmq 消费者

1、打开 idea 创建 springboot-rocketmq-consumer 项目,并在项目 pom.xml 中添加 依赖。


	--> idea --> File 
	--> New --> Project 
	--> Maven 
		Project SDK: ( 1.8(java version "1.8.0_131" ) 
	--> Next 
	--> Groupld : ( djh.it )
		Artifactld : ( springboot-rocketmq-consumer )
		Version : 1.0-SNAPSHOT
	--> Name: ( springboot-rocketmq-consumer )
		Location: ( ...\springboot-rocketmq-consumer\ )	
	--> Finish


<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>djh.it</groupId>
    <artifactId>springboot-rocketmq-consumer</artifactId>
    <version>1.0-SNAPSHOT</version>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.1.RELEASE</version>
    </parent>

    <properties>
        <rocketmq-spring-boot-starter-version>2.0.3</rocketmq-spring-boot-starter-version>
    </properties>

    <dependencies>
        <!-- 添加web起步依赖 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>${rocketmq-spring-boot-starter-version}</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.6</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

</project>
<!-- D:\Java\java-test\idea\springboot-rocketmq-consumer\pom.xml -->

2、在项目 springboot-rocketmq-consumer 中,添加 application.properties 配置文件


##  springboot-rocketmq-consumer\src\main\resources\application.properties

# nameserver :集群配置
# rocketmq.name-server=192.168.25.135:9876;192.168.25.138:9876

# nameserver :单机配置
rocketmq.name-server=172.18.30.110:9876

# 消费者组名
rocketmq.consumer.group=my-group

3、在项目 springboot-rocketmq-consumer 中,创建启动类 ConsumerApplication.java


/**
 *   springboot-rocketmq-consumer\src\main\java\djh\it\shop\springboot\rocketmq\ConsumerApplication.java
 *
 *   2024-6-4 创建启动类 ConsumerApplication.java
 */

package djh.it.shop.springboot.rocketmq;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@Slf4j
public class ConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class, args);
        log.info("消费者启动成功");
    }
}


4、在项目 springboot-rocketmq-consumer 中,创建监听器类 Consumer.java


/**
 *   springboot-rocketmq-consumer\src\main\java\djh\it\shop\springboot\rocketmq\listener\Consumer.java
 *
 *   2024-6=4 创建监听器类 Consumer.java
 */

package djh.it.shop.springboot.rocketmq.listener;

import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

@RocketMQMessageListener(topic = "springboot-rocketmq", consumeMode = ConsumeMode.CONCURRENTLY, consumerGroup="${rocketmq.consumer.group}")
@Component
public class Consumer implements RocketMQListener<String> {
    @Override
    public void onMessage(String message) {
        System.out.println("接收到消息:" + message);
    }
}


5、提前安装配置好 RocketMQ 服务,并启动服务,然后启动 ConsumerApplication.java 启动类 和 启动类 ProducerApplication.java 进行测试。

在这里插入图片描述

上一节关联链接请点击:
# 全面解剖 消息中间件 RocketMQ-(5)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Zynq7000 系列FPGA模块化仪器

• 基于 XilinxXC7Z020 / 010 / 007S • 灵活的模块组合 • 易于嵌入的紧凑型外观结构 • 高性能的 ARM Cortex 处理器 • 成熟的 FPGA 可编程逻辑 &#xff0c;基于 IP 核的软件库 FPGA 控制器 Zynq7000 系列模块是基于 Xilinx XC7Z020/010/007S 全可编程片上系统 (SoC) 的…

【PPT技巧】PPT文件设置了修改权限,如何取消权限编辑文件?

不知道大家在使用PPT文件的时候&#xff0c;是否遇到过下面的提示框&#xff0c;这就是PPT文件设置了修改权限&#xff0c;只有输入密码才可以编辑文件。 如果我们没有输入密码&#xff0c;以只读方式进入&#xff0c;那么我们会发现功能栏中的按钮全是灰色&#xff0c;无法使用…

Vue3【二】 VSCode需要安装的Vue语法插件

VSCode需要安装的 适配Vue3的插件 Vue-Official插件安装

DeepSORT(目标跟踪算法)中的马氏距离详解(很详细)

DeepSORT&#xff08;目标跟踪算法&#xff09;中的马氏距离详解&#xff08;很详细&#xff09; flyfish 马氏距离的公式是由印度统计学家【普拉萨纳钱德拉马哈拉诺比斯&#xff08;Prasanta Chandra Mahalanobis&#xff09;】&#xff09;&#xff08;好长的名字&#xff…

STM32F103C8T6 HAL库 USART1 DMA方式接收数据

前言&#xff1a; 前面的两篇文章都说关于发送的&#xff0c;HAL库发送数据可以调用现成的函数&#xff0c;而接收数据&#xff0c;现成函数不太好用。这里为了记录了一下自己参考了网上几个大佬的代码&#xff0c;整理了一下USART1 DMA方式接受数据的代码&#xff0c;…

【python】OpenCV—Histogram Matching(9.2)

学习来自OpenCV基础&#xff08;17&#xff09;基于OpenCV、scikit-image和Python的直方图匹配 文章目录 直方图匹配介绍scikit-image 中的直方图匹配小试牛刀风格迁移 直方图匹配介绍 直方图匹配&#xff08;Histogram Matching&#xff09;是一种图像处理技术&#xff0c;旨…

一文详解大模型微调全流程

节前&#xff0c;我们星球组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友、参加社招和校招面试的同学. 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 汇总合集&…

11-数组与指针深入理解——题型理解

11-数组与指针深入理解——题型理解 文章目录 11-数组与指针深入理解——题型理解一、理解题1二、理解题二三、理解题三四、理解题四五、理解题五六、理解题六 一、理解题1 #include <stdio.h>int main(void) {int (*p)[5] NULL; // 定义一个指向 拥有5个整型数据的数组…

Tessy学习系列(三):单元测试——官方例程isValueInRange

一、工程创建 &#xff08;1&#xff09;新建工程 注意&#xff1a;工程名称以及路劲不能包含空格和中文 &#xff08;2&#xff09;新建测试集与单元测试模块 新建测试集 新建单元测试模块 设置测试模块为单元测试模块并选择GNU GCC编译器如果需要其他的编译器&#xff0c;…

力扣每日一题 6/10

881.救生艇[中等] 题目&#xff1a; 给定数组 people 。people[i]表示第 i 个人的体重 &#xff0c;船的数量不限&#xff0c;每艘船可以承载的最大重量为 limit。 每艘船最多可同时载两人&#xff0c;但条件是这些人的重量之和最多为 limit。 返回 承载所有人所需的最小船…

kubesz(一键安装k8s)

引言 Kubernetes&#xff08;K8s&#xff09;是一个开源的容器编排系统&#xff0c;用于自动化部署、扩展和管理容器化应用程序。kubeasz 是一个用于快速搭建 Kubernetes 高可用集群的项目&#xff0c;它基于 Ansible&#xff0c;通过提供一套简单、易用的配置&#xff0c;使得…

杨校老师项目之基于SpringBoot的理发店的预约管理系统

原系统是SSMJSP页面构成&#xff0c;先被修改为SpringBoot JSP页面 自助下载渠道: https://download.csdn.net/download/kese7952/89417001&#xff0c;或 点我下载 理发师信息&#xff1a; 理发师详细信息 公告信息 员工登录&#xff1a; 管理员登录

94、二叉树的迭代遍历

实现对二叉树的前后序非递归遍历 题解&#xff1a; 递归的实现就是&#xff1a;递去&#xff0c;归来。每一次递归调用都会把函数的局部变量、参数值和返回地址等压入调用栈中&#xff0c;然后递归返回的时候&#xff0c;从栈顶弹出上一次递归的各项参数&#xff0c;所以这就是…

有点好玩的python运维脚本

python运维脚本 1. 常用端口扫描2. 文件整理 1. 常用端口扫描 在计算机网络中&#xff0c;端口是一个通信端点&#xff0c;允许不同的进程或服务通过网络连接和交换数据。端口通过数值来标识&#xff0c;并与特定的协议相关联。未采取适当安全措施而保持端口开放&#xff0c;可…

上位机图像处理和嵌入式模块部署(f407 mcu vs h750)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在目前工业控制上面&#xff0c;f103和f407是用的最多的两种stm32 mcu。前者频率低一点&#xff0c;功能少一点&#xff0c;一般用在低端的嵌入式设…

搞懂银行的各类号码 — Account Number, Routing Number 和 Swift Code

1. 前言2. 名词解释 2.1. Debit Card Number 储蓄卡卡号2.2. Account Number 账户号码2.3. Routing Number 路由号码2.4. SWIFT Code SWIFT 号码3. 查找信息 3.1. 支票3.2. 网上银行3.3. 手机银行4. SWFIT Code 4.1. 看懂 SWIFT Code4.2. 询问银行4.3. Google 大神4.4. 部分常用…

GitLab代码导出 gitlab4j-api 实现

目录 GitLab简介 GitLab 的主要特点包括&#xff1a; GitLab代码导出 gitlab4j-api 添加 gitlab4j-api 依赖 使用 gitlab4j-api 获取特定命名空间下的所有项目 说明 注意事项 GitLab简介 GitLab 是一个开源的代码仓库和协作平台&#xff0c;主要用于版本控制和源代码管理…

堆和栈(heap and stack)

1、堆&#xff1a;一块内存空间&#xff0c;可以从中分配一个小buffer&#xff0c;用完后再把它放回去。 2、栈&#xff1a;也是一块内存空间&#xff0c;cpu的sp寄存器指向它&#xff0c;它可以用于函数调用、局部变量、多任务系统里保存现场。 PUSH [r3-r6,lr]; #将r3到r6寄…

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗

未来几年,同样的性能,推理功耗降低为现在的几万分之一,有可能吗 一.数据二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数三.其它 有人说未来几年,推理功耗能降低为现在的几万分之一,好奇怎么能做到呢 一.数据 二.抓取LLM排行榜,相同的MMLU精度,模型参数量缩减倍数 import…

Docker Swarm集群部署管理

Docker Swarm集群管理 文章目录 Docker Swarm集群管理资源列表基础环境一、安装Docker二、部署Docker Swarm集群2.1、创建Docker Swarm集群2.2、添加Worker节点到Swarm集群2.3、查看Swarm集群中Node节点的详细状态信息 三、Docker Swarm管理3.1、案例概述3.2、Docker Swarm中的…