# 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.rhkb.cn/news/348630.html

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

相关文章

“人事助理转产品经理”历险记

​好久没写就业喜报了 去年太忙&#xff0c;年后了&#xff0c;必须给大家把同学们就业的情况梳理一下分享出来。希望对大家有所帮助。 同学档案 原岗位&#xff1a;HR 地点&#xff1a;西安 工作年限&#xff1a;2年 转岗级别&#xff1a;中级产品经理 转岗工资&#xff1…

东胜物流软件 GetProParentModuTreeList SQL注入漏洞复现

0x01 产品简介 东胜物流软件是青岛东胜伟业软件有限公司一款集订单管理、仓库管理、运输管理等多种功能于一体的物流管理软件。该公司初创于2004年11月(前身为青岛景宏物流信息技术有限公司),专注于航运物流相关环节的产品和服务。东胜物流信息管理系统货代版采用MS-SQLser…

Windows同一文件夹下支持大小写同名文件

举例&#xff1a;同一文件目录下需要存在A.java, a.java, Windows是不支持的&#xff0c;这时候需要建一个Linux子系统的文件夹 创建教程 1、在启用或关闭Windows功能下面找到 适用于Linux系统的Windows子系统 2、cmd 执行命令 fsutil file SetCaseSensitiveInfo 文件夹路径 …

二十三、生成帮助文档

二十一、Java工具类的创建 二十二、Jar包制作及使用 这一篇开始学习如何生成帮助文档。为什么要学习生成帮助文档&#xff1f; 1、工具类已经制作好了&#xff0c;Java工具类的创建的类是一个.java文件&#xff0c;编译后成.class文件看不懂&#xff0c;所以需要对应的帮助文档…

自动化办公03 用xlrd和xlwt库操作excel.xls文件(老版本)

目录 一、读操作 二、写操作 三、设置单元格格式 0.综合案例 1.设置行高和列宽 2.设置字体样式 3.设置边框样式 4.设置对齐方式 5.设置背景颜色 6.合并单元格 四、 xlutils修改Excel⽂件内容 1.安装 2.使用 一、读操作 import xlrd# 1. 打开excel文件 wb xlrd.op…

电脑蓝屏怎么办?7个方法为你解决问题!

“我今天开电脑时&#xff0c;不知道为什么电脑突然就蓝屏了。大家有什么方法可以解决电脑蓝屏问题吗&#xff1f;” 在现代社会的快节奏中&#xff0c;电脑已经成为了我们工作和生活的重要伙伴。然而&#xff0c;当这个“伙伴”突然展现出它的“任性”一面——蓝屏时&#xff…

焦化行业排放平台简介

在当今社会&#xff0c;环保事业日益受到人们的关注。焦化行业作为重要的工业领域之一&#xff0c;其排放问题一直是环保工作的重点。为了有效控制焦化行业的排放&#xff0c;实施焦化行业排放平台成为了必不可少的措施。朗观视觉小编将详细探讨焦化行业排放平台的实施范围&…

MySQL之高级特性(三)

高级特性 分布式(XA)事务 存储引擎的事务特性能够保证在存储引擎级别实现ACID,而分布式事务则让存储引擎级别的ACID可以扩展到数据库层面&#xff0c;甚至可以扩展到多个数据库之间——这需要通过两阶段提交实现。MySQL5.0和更新版本的数据库已经开始支持XA事务了。XA事务中需…

最短路径Bellman-Ford算法和SPFA算法详解

目录 Bellman-Ford算法介绍 Bellman-Ford算法证明 Bellman-Ford算法实现 SPFA算法详解 Bellman-Ford算法介绍 Dijkstra算法可以很好的解决无负权图的最短路径问题&#xff0c;但是如果出现了负权边&#xff0c;Dijkstra算法就会失效。为了更好地求解有负权边的最短路径问…

第 5 章:面向生产的 Spring Boot

在 4.1.2 节中&#xff0c;我们介绍了 Spring Boot 的四大核心组成部分&#xff0c;第 4 章主要介绍了其中的起步依赖与自动配置&#xff0c;本章将重点介绍 Spring Boot Actuator&#xff0c;包括如何通过 Actuator 提供的各种端点&#xff08;endpoint&#xff09;了解系统的…

STM32程序启动过程

&#xff08;1&#xff09;首先对栈和堆的大小进行定义&#xff0c;并在代码区的起始处建立中断向量表&#xff0c;其第一个表项是栈顶地址&#xff08;32位&#xff09;&#xff0c;第二个表项是复位中断服务入口地址&#xff1b; &#xff08;2&#xff09;然后执行复位中断&…

人工智能AI概览

1、达特茅斯会议 2、人工智能元老 3、人工智能发展史 4、符号主义 5、连接主义 6、行为主义 7、三大学派优劣分析 8、人工智能 9、人工智能层次结构 10、机器学习、深度学习 11、人工智能现状 12、人工智能未来

HTML列表和表格标签

目录 1.列表标签 1.1无序列表 1.2有序列表 1.3定义列表 2. 表格标签、 2.1表格标签的属性 2.2合并单元格 1.列表标签 1.1无序列表 <ul>: [type 属性&#xff1a; disc( 实心圆点 )( 默认 ) 、 circle( 空心圆圈 ) 、 square( 实心方块 )] <li>: 列表中…

在VSCode中安装python

引言 Python 是一种广泛使用的高级编程语言&#xff0c;因其易学、易用、强大而受到欢迎。它由 Guido van Rossum 于 1991 年首次发布&#xff0c;并以简洁的语法和丰富的库生态系统而著称。 以下是 Python 的一些关键特点和优势&#xff1a; 关键特点 易于学习和使用&#x…

SolidWorks对设计电脑硬件配置要求是怎么样的

SolidWorks&#xff0c;作为达索系统&#xff08;Dassault Systemes&#xff09;旗下的子公司&#xff0c;一直以其出色的机械设计软件解决方案而著称。它是基于Parasolid内核开发&#xff0c;是单核三维设计软件&#xff0c;面上使用比较多的版本有SolidWorks2022、SolidWorks…

Java 数据类型 -- Java 语言的 8 种基本数据类型、字符串与数组

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 004 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…

6.每日LeetCode-数组类,找到所有数组中消失的数字(Go)

题目 448找到所有数组中消失的数字.go 给你一个含 n 个整数的数组 nums &#xff0c;其中 nums[i] 在区间 [1, n] 内。请你找出所有在 [1, n] 范围内但没有出现在 nums 中的数字&#xff0c;并以数组的形式返回结果。 示例 1&#xff1a; 输入&#xff1a;nums [4,3,2,7,8,2,…

MySQL 8.0 安装、配置、启动、登录、连接、卸载教程

目录 前言1. 安装 MySQL 8.01.1 下载 MySQL 8.01.2 安装 MySQL 8.0 2. 配置 MySQL 8.02.1打开环境变量2.2新建变量 MYSQL_HOME2.3编辑 Path 变量 3. 启动MySQL 8.03.1验证安装与配置是否成功3.2初始化并注册MYSQL3.3 启动MYSQL服务 4.登录MySQL4.1修改账户默认密码4.2登录MYSQL…

基于springboot实现小型诊疗预约平台系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现小型诊疗预约平台系统的设计演示 摘要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本小型诊疗预约平台就是在这样的大环境下诞生&#xff0c…

西安交通大学联合中科院半导体所通过龙讯旷腾PWmat发表最新《iScience》:固定电势法揭示质子转移过程中的电子转移之谜

电化学是研究电能和化学能之间相互转换的科学。在能源日趋紧张的今天&#xff0c;研究电化学中的能量转换特性对能源科学的进步具有深远的意义。电子是电能的载体&#xff0c;因此研究电子在电化学过程中的转移是加深对电化学反应能量交换机制理解的关键。以质子电化学还原反应…