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

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

一、RocketMQ 实战:模拟电商网站场景综合案例-- web 端项目开发

1、在 shop-order-web 工程模块中,创建 Controller 类 OrderControllre.java


/***   shop\shop-order-web\src\main\java\com\itheima\shop\controller\OrderControllre.java**   2024-6-12  创建 Controller 类 OrderControllre.java*/
package com.itheima.shop.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.api.IOrderService;
import com.itheima.entity.Result;
import com.itheima.shop.pojo.TradeOrder;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/order")
public class OrderControllre {@Referenceprivate IOrderService orderService;@RequestMapping("/confirm")public Result confirmOrder(@RequestBody TradeOrder order){return orderService.confirmOrder(order);}
}

2、在 shop-order-web 工程模块中,创建 启动 类 OrderWebApplication.java


/***   shop\shop-order-web\src\main\java\com\itheima\shop\OrderWebApplication.java**   2024-6-12  创建 启动 类 OrderWebApplication.java*/
package com.itheima.shop;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubboConfiguration
@SpringBootApplication
public class OrderWebApplication {public static void main(String[] args) {SpringApplication.run(OrderWebApplication.class,args);}
}

3、在 shop-pay-web 工程模块中,创建 Controller 类 PayController.java


/***   shop\shop-pay-web\src\main\java\com\itheima\shop\controller\PayController.java**   2024-6-12  创建 Controller 类 PayController.java*/
package com.itheima.shop.controller;import com.alibaba.dubbo.config.annotation.Reference;
import com.itheima.api.IPayService;
import com.itheima.entity.Result;
import com.itheima.shop.pojo.TradePay;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/pay")
public class PayController {@Referenceprivate IPayService payService;@RequestMapping("/createPayment")public Result createPayment(@RequestBody TradePay pay){return payService.createPayment(pay);}@RequestMapping("/callBackPayment")public Result callBackPayment(@RequestBody TradePay pay) throws Exception {return payService.callbackPayment(pay);}
}

4、在 shop-pay-web 工程模块中,创建 启动 类 PayWebApplication.java

/***   shop\shop-pay-web\src\main\java\com\itheima\shop\PayWebApplication.java**   2024-6-12  创建 启动 类 PayWebApplication.java*/
package com.itheima.shop;import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubboConfiguration
@SpringBootApplication
public class PayWebApplication {public static void main(String[] args) {SpringApplication.run(PayWebApplication.class,args);}
}

二、RocketMQ 实战:模拟电商网站场景综合案例-- 整体联调:Rest 测试准备工作

1、在 shop-order-web 工程模块中,创建 配置 RestTemplate 类 RestTemplateConfig.java


/***   shop\shop-order-web\src\main\java\com\itheima\shop\config\RestTemplateConfig.java**   2024-6-12  创建 配置 RestTemplate 类 RestTemplateConfig.java*/
package com.itheima.shop.config;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;@Configuration
public class RestTemplateConfig {@Bean@ConditionalOnMissingBean({ RestOperations.class, RestTemplate.class })public RestTemplate restTemplate(ClientHttpRequestFactory factory) {RestTemplate restTemplate = new RestTemplate(factory);// 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为"ISO-8859-1")List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();while (iterator.hasNext()) {HttpMessageConverter<?> converter = iterator.next();if (converter instanceof StringHttpMessageConverter) {iterator.remove();}}messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));return restTemplate;}@Bean@ConditionalOnMissingBean({ClientHttpRequestFactory.class})public ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();// msfactory.setReadTimeout(15000);// msfactory.setConnectTimeout(15000);return factory;}
}

2、在 shop-order-web 工程模块中,创建 application.properties 配置文件。


# shop\shop-order-web\src\main\resources\application.propertiesserver.host=http://localhost
server.servlet.path=/order-web
# 端口不能冲突
server.port=8080  # dubbo
spring.application.name=dubbo-order-consumer
spring.dubbo.application.id=dubbo-order-consumer
spring.dubbo.application.name=dubbo-order-consumer
spring.dubbo.registry.address=zookeeper://192.168.25.140:2181;zookeeper://192.168.25.140:2182;zookeeper://192.168.25.140:2183order.port=8080
shop.order.baseURI=${server.host}:${order.port}${server.servlet.path}
shop.order.confirm=/order/confirm

3、在 shop-pay-web 工程模块中,创建 配置 RestTemplate 类 RestTemplateConfig.java


/***   shop\shop-pay-web\src\main\java\com\itheima\shop\config\RestTemplateConfig.java**   2024-6-12  创建 配置 RestTemplate 类 RestTemplateConfig.java*/
package com.itheima.shop.config;import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.web.client.RestOperations;
import org.springframework.web.client.RestTemplate;import java.nio.charset.Charset;
import java.util.Iterator;
import java.util.List;@Configuration
public class RestTemplateConfig {@Bean@ConditionalOnMissingBean({ RestOperations.class, RestTemplate.class })public RestTemplate restTemplate(ClientHttpRequestFactory factory) {RestTemplate restTemplate = new RestTemplate(factory);// 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为"ISO-8859-1")List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();while (iterator.hasNext()) {HttpMessageConverter<?> converter = iterator.next();if (converter instanceof StringHttpMessageConverter) {iterator.remove();}}messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));return restTemplate;}@Bean@ConditionalOnMissingBean({ClientHttpRequestFactory.class})public ClientHttpRequestFactory simpleClientHttpRequestFactory() {SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();// msfactory.setReadTimeout(15000);// msfactory.setConnectTimeout(15000);return factory;}
}

4、在 shop-pay-web 工程模块中,创建 application.properties 配置文件。


# shop\shop-pay-web\src\main\resources\application.propertiesserver.host=http://localhost
server.servlet.path=/pay-web
# 端口不能冲突
server.port=9090# dubbo
spring.application.name=dubbo-pay-consumer
spring.dubbo.application.id=dubbo-pay-consumer
spring.dubbo.application.name=dubbo-pay-consumer
spring.dubbo.registry.address=zookeeper://192.168.25.140:2181;zookeeper://192.168.25.140:2182;zookeeper://192.168.25.140:2183pay.port=9090shop.pay.baseURI=${server.host}:${pay.port}${server.servlet.path}shop.pay.createPayment=/pay/createPaymentshop.pay.callbackPayment=/pay/callBackPayment

三、RocketMQ 实战:模拟电商网站场景综合案例-- 整体联调:Rest 方式测试下单

1、在 shop-order-web 工程模块中,创建 测试类 OrderWebTest.java


/***   shop\shop-order-web\src\test\java\com\itheima\test\OrderWebTest.java**   2024-6-12 创建 测试类 OrderWebTest.java*/
package com.itheima.test;import com.itheima.entity.Result;
import com.itheima.shop.OrderWebApplication;
import com.itheima.shop.pojo.TradeOrder;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;@RunWith(SpringRunner.class)
@SpringBootTest(classes = OrderWebApplication.class)
public class OrderWebTest {@Autowiredprivate RestTemplate restTemplate;@Value("${shop.order.baseURI}")private String baseURI;@Value("${shop.order.confirm}")private String confirmOrderPath;@Testpublic void confirmOrder(){Long coupouId = 345988230098857984L;Long goodsId = 345959443973935104L;Long userId = 345963634385633280L;TradeOrder order = new TradeOrder();order.setGoodsId(goodsId);order.setUserId(userId);order.setCouponId(coupouId);order.setAddress("北京");order.setGoodsNumber(1);order.setGoodsPrice(new BigDecimal(1000));order.setShippingFee(BigDecimal.ZERO);order.setOrderAmount(new BigDecimal(1000));order.setMoneyPaid(new BigDecimal(100));Result result = restTemplate.postForEntity(baseURI + confirmOrderPath, order, Result.class).getBody();System.out.println(result);}
}

2、启动各 service 工程模块的 启动类,进行测试。

在这里插入图片描述
在这里插入图片描述

四、RocketMQ 实战:模拟电商网站场景综合案例-- 整体联调:Rest 方式测试支付下单和支付回调

1、在 shop-pay-web 工程模块中,创建 测试类 PayWebTest.java


/***   shop\shop-pay-web\src\test\java\com\itheima\test\PayWebTest.java**   2024-6-12 创建 测试类 PayWebTest.java*/
package com.itheima.test;import com.itheima.constant.ShopCode;
import com.itheima.entity.Result;
import com.itheima.shop.PayWebApplication;
import com.itheima.shop.pojo.TradePay;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.web.client.RestTemplate;import java.math.BigDecimal;@RunWith(SpringRunner.class)
@SpringBootTest(classes = PayWebApplication.class)
public class PayWebTest {@Autowiredprivate RestTemplate restTemplate;@Value("${shop.pay.baseURI}")private String baseURI;@Value("${shop.pay.createPayment}")private String createPaymentPath;@Value("${shop.pay.callbackPayment}")private String callBackPaymentPath;@Testpublic void createPayment(){long orderId = 352537369385242624L;  //对应数据库中的 orderId 唯一性TradePay tradePay = new TradePay();tradePay.setOrderId(orderId);tradePay.setPayAmount(new BigDecimal(880));Result result = restTemplate.postForEntity(baseURI + createPaymentPath, tradePay, Result.class).getBody();System.out.println(result);}@Testpublic void callBackPayment(){long payId = 352542415984402432L;long orderId = 352537369385242624L;TradePay tradePay = new TradePay();tradePay.setPayId(payId);tradePay.setOrderId(orderId);tradePay.setIsPaid(ShopCode.SHOP_ORDER_PAY_STATUS_IS_PAY.getCode());Result result = restTemplate.postForEntity(baseURI + callBackPaymentPath, tradePay, Result.class).getBody();System.out.println(result);}
}

2、启动各 service 工程模块的 启动类,进行测试。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

五、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 持久层
  • web 层 :
  • shop-order-web 订单系统
  • shop-pay-web 支付系统
  • 接口层:shop-api 接口层
  • 服务层:
  • shop-coupon-service 优惠券服务
  • shop-goods- 商品服务
  • shop-order-service 订单服务
  • shop-pay-service 支付服务
  • shop-user-service 用户服务。
  • 储存层:数据库 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 支付测试。

上一节关联链接请点击:
# RocketMQ 实战:模拟电商网站场景综合案例(十)

环境搭建:数据库表结构介绍–项目工程初始化 查看 请点击:
# RocketMQ 实战:模拟电商网站场景综合案例(三)

mybatis 逆向工程 生成 POJO 类 源文件 和 mapper 映射文件 查看 请点击:
RocketMQ 实战:模拟电商网站场景综合案例(四)

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

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

相关文章

DBeaverUE Mac版:数据库管理新纪元,一键掌控所有数据

DBeaverUE for Mac是一款卓越的数据库管理软件&#xff0c;专为Mac用户设计&#xff0c;提供了一套高效、稳定且全面的数据库解决方案。以下是关于这款插件的详细介绍&#xff1a; 1. 强大的数据库支持 DBeaverUE for Mac支持多种数据库系统&#xff0c;包括但不限于MySQL、Po…

电脑自带录屏在哪?电脑录屏,4个详细方法

在现代社会中&#xff0c;越来越多的人需要在电脑上录制视频&#xff0c;比如录制游戏操作、制作教学视频、演示文稿等等。因此&#xff0c;电脑录屏成为了一项非常重要的功能。那么电脑自带录屏在哪&#xff1f;本文将带领大家看看可以使用哪些方法进行录屏。 录屏方法一&…

比人工快100倍!给3D模型用上轻量化,老爷机也能起飞!!!!!!

3D可视化开发&#xff0c;考虑最多的要素&#xff0c;当属模型加载流畅度和应用性。但面对单位的电脑、不能升级硬盘的笔记本等&#xff0c;可能还是无法体会到模型丝滑加载的畅快。 况且3D模型数据、格式等&#xff0c;也在不断发展扩充&#xff0c;昔日手工就能“调教”的3D…

数据结构——栈(Stack)详解

1. 栈&#xff08;Stack&#xff09; 1.1 概念 栈&#xff1a;一种特殊的线性表&#xff0c;只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中数据元素遵循后进先出LIFO(Last In First Out)的原则 压栈&am…

centos7.5安装Node.js 20.5.1后报段错误(吐核)

centos7.5安装Node.js 20.5.1后报段错误 缘起 开发要求安装Node.js 20.5.1以解决dependencyCheck扫描出来的各种安全问题。安装过程 1、 下载安装Node.js 20.5.1 wget https://nodejs.org/download/release/v20.5.1/node-v20.5.1-linux-x64.tar.gztar -xzf node-v20.5.1-li…

linxu-Ubuntu系统上卸载Kubernetes-k8s

如果您想从Ubuntu系统上卸载Kubernetes集群&#xff0c;您需要执行以下步骤&#xff1a; 1.关闭Kubernetes集群&#xff1a; 如果您的集群还在运行&#xff0c;首先您需要使用kubeadm命令来安全地关闭它&#xff1a; sudo kubeadm reset在执行该命令后&#xff0c;系统会提示…

编程猫怎么玩:深入探索编程猫的玩法与魅力

编程猫怎么玩&#xff1a;深入探索编程猫的玩法与魅力 编程猫&#xff0c;这个看似简单却充满无限可能的编程平台&#xff0c;吸引了众多编程爱好者的目光。那么&#xff0c;编程猫怎么玩呢&#xff1f;接下来&#xff0c;我们将从四个方面、五个方面、六个方面和七个方面&…

Java之等待唤醒方法

在Java中&#xff0c;wait(), notify(), 和 notifyAll() 方法是线程间通信和同步的关键机制&#xff0c;主要用于实现线程间的协作&#xff0c;特别是在处理共享资源时。这些方法是任何对象的内置方法&#xff0c;属于Object类的一部分&#xff0c;因此所有对象都可以调用它们。…

C++ 实现Python 列表list 的两种方法

1、vector里面放多种参数。在C中&#xff0c;如果你想要在std::vector中存储不同类型的参数&#xff0c;你可以使用std::any&#xff08;C17及以上&#xff09;或std::variant&#xff08;C17以前的版本需要使用Boost库或者C17及以上标准&#xff09;。以下是使用std::vector&l…

【OceanBase诊断调优】 —— DDL时报磁盘不足问题排查

1. 背景 由于在4.x的部分版本中&#xff0c;我们对于一些ddl操作还存在磁盘空间放大问题&#xff0c;本文主要介绍了这一类问题的排查。 2. 问题排查 2.1 整体排查链路 2.2 问题现象 DDL过程中报磁盘空间不足&#xff0c;需要确认是否符合预期&#xff0c;如果是符合预期&a…

一口价域名可以用多久?

在域名市场中&#xff0c;一口价域名因其价格固定、购买流程简便而受到许多企业和个人的青睐。然而&#xff0c;一口价域名的使用期限是多久&#xff0c;以及如何评估其价值&#xff0c;是许多潜在买家关心的问题。本文将探讨一口价域名的使用期限&#xff0c;并从多个角度分析…

客厅3d模型素材下载哪家好?

客厅是家庭生活中最重要的空间之一&#xff0c;承载着家人的欢聚、交流和休息。而客厅3D模型让家居设计师更好的完成设计布局和设计规划&#xff0c;为用户呈现出一个更加真实的家居空间。那么客厅3d模型素材下载哪家好? 1、建e网的3D模型库不仅数量庞大&#xff0c;而且质量上…

高考后志愿填报信息采集系统制作指南

在高考的硝烟散去之后&#xff0c;每位学生都面临着一个重要的任务——志愿填报。老师们如何高效、准确地收集和整理这些信息&#xff0c;成为了一个棘手的问题。难道我们只能依赖传统的手工登记方式&#xff0c;忍受其繁琐和易错吗&#xff1f; 易查分是一个简单易用的在线工具…

Kaggle -- Multi-Class Prediction of Obesity Risk

使用简单的决策树进行分类&#xff0c;代码如下&#xff1a; import pandas as pd import numpy as np from sklearn.preprocessing import OneHotEncoder from sklearn.model_selection import train_test_splitdf pd.read_csv("train.csv")df[Gender] df[Gender…

UE5.3报错

UE5.3报错 1. 报错问题: PackagingResults: Error: /GeoScene/BP/LocatedLline/CesiumCartographicPolygon_Blueprint : Failed import for Blueprint /GeoScene/CesiumCartographicPolygon_Blueprint.CesiumCartographicPolygon_Blueprint [redirection] in /GeoScene/BP/L…

【Docker】docker-compose常用的构建docker容器的yml文件

docker-compose的简单使用方法&#xff0c;在准备好的文件夹中&#xff0c;mkdir好要挂载的如data或者conf文件夹&#xff0c;及vim docker-compose.yml&#xff0c;将下方的要使用的内容粘贴进去&#xff0c;根据自己需要添加/删除/修改一下。最后在当前文件夹直接后台启动即可…

Word同行内的文字如何左右分别对齐

先打开标尺&#xff08;视图-标尺&#xff09; 开右边&#xff0c;选一个制表位置&#xff0c;比如我选34 切回开始&#xff0c;点段落段落右下角 然后 然后 我修改为35&#xff08;因为“6月13日”总共3个字符&#xff09; 在文字中间按下Tab键&#xff0c;效果如下

流程设计的基本步骤

背景 公司为什么要流程&#xff0c;已经有专门章节进行阐述&#xff1b; 什么是流程&#xff0c;已经有专门章节进行专门阐述&#xff1b; 那么接下来这个章节讨论&#xff0c;流程设计的基本步骤&#xff0c;那么谁来设计流程呢&#xff0c;让一个部门的员工来设计一份流程…

【嵌入式DIY实例】-Nokia 5110显示DHT11/DHT22传感器数据

Nokia 5110显示DHT11/DHT22传感器数据 文章目录 Nokia 5110显示DHT11/DHT22传感器数据1、硬件准备2、代码实现2.1 显示DHT11数据2.2 显示DHT22数据本文介绍如何将 ESP8266 NodeMCU 开发板 (ESP-12E) 与 DHT11 数字湿度和温度传感器以及诺基亚 5110 LCD 连接。 NodeMCU 从 DHT11…

某国资集团数据治理落地,点燃高质量发展“数字引擎”

​某国有资产经营控股集团为快速提升集团的内控管理能力和业务经营能力&#xff0c;以数字化促进企业转型的信息化建设势在必行。集团携手亿信华辰开启数据治理项目&#xff0c;在数据方面成功解决“哪里来、怎么盘、怎么管、怎么用”的问题&#xff0c;不断推动企业数字化转型…