# 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…

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;系统会提示…

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

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

客厅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…

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;不断推动企业数字化转型…

Kali Linux 2022.2 发布,包含 10 个新工具和WSL 改进

Offensive Security发布了Kali Linux 2022.2&#xff0c;这是2022年的第二个版本&#xff0c;具有桌面增强功能&#xff0c;有趣的愚人节屏幕保护程序&#xff0c;WSL GUI改进&#xff0c;终端调整&#xff0c;最重要的是&#xff0c;新的工具&#xff01; Kali Linux是一个Li…

element 树组件 tree 横向纵向滚动条

Html <el-cardshadow"hover"class"solo flex-2"style"height: calc(100vh - 1.6rem); border: 1px solid #ebeef5"><div slot"header" class"clearfix"><span>问题分类</span></div><div …

uniapp地图导航

我们只需要给图标加一个点击事件 我这里的数据都是动态的&#xff0c;想测试的朋友可以写固定值 然后跳转之后首先会调到选择软件导航 点击导航之后会显示使用哪个app 最后我们选择之后将会直接跳转到app进行导航

LMDeploy 量化部署

LMDeploy简介 LMDeploy是一个由MMDeploy和MMRazor团队联合开发的工具包&#xff0c;旨在为大型语言模型&#xff08;LLM&#xff09;提供全套的轻量化、部署和服务解决方案。以下是对LMDeploy的简介&#xff0c;采用分点表示和归纳的方式&#xff1a; 核心功能&#xff1a; 高…

Stable Diffusion: ControlNet 插件安装

前面介绍了一些通过代码实现ControlNet进行控制的案例。现在通过Stable Diffusion体验一下更便捷的操作。 Stable Diffusion插件安装办法大致相同。启动Stable Diffusion后&#xff0c;点击最右边的“扩展”&#xff0c;点击“可下载”&#xff0c;点击“加载扩展列表”。 视网…

正大国际期货:小小的钱如何在期货市场翻身?

小小的钱 &#xff0c;莫名喜感→在小小的花园里面哇呀哇呀挖 有可能性&#xff0c;因为有杠杆所以收益大&#xff0c;同时风险亏损起来也快&#xff0c;&#xff0c;所以必须用小亏损换大收益&#xff0c;&#xff0c;比如跌过这个位置就止损退出&#xff08;永远在低点附近买…

【递归、搜索与回溯】综合练习一

综合练习一 1.找出所有子集的异或总和再求和2.全排列 II3.电话号码的字母组合4.括号生成 点赞&#x1f44d;&#x1f44d;收藏&#x1f31f;&#x1f31f;关注&#x1f496;&#x1f496; 你的支持是对我最大的鼓励&#xff0c;我们一起努力吧!&#x1f603;&#x1f603; 1.找…