Seata案例-完成下单和扣除库存代码|学习笔记

简介: 快速学习Seata案例-完成下单和扣除库存代码

开发者学堂课程【全面讲解Spring Cloud Alibaba技术栈(知识精讲+项目实战)第五阶段Seata案例-完成下单和扣除库存代码】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/687/detail/11928


Seata案例-完成下单和扣除库存代码


内容介绍

一、图文概述

二、代码修改


一、图文概述

1、总述

使用Seata实现分布式事务的控制,处理的案例是电商中的下订单

和扣库存的过程。要通过订单微服务执行下单操作,然后由订单微服

务调用商品微服务扣除相应的库存。

2、图文分析

image.png

左半部分为订单微服务,右半部分为商品微服务。在之前的案例中已

经完成了前两个步骤。订单请求出现后,由订单微服务向商品微服务

发送请求,查询一件商品的具体信息。而后就在订单微服务执行一个

创建订单的操作,也就是写数据库。

接下来所要完成的事情就是在创建订单之后要调用商品微服务执行

一个扣减库存的操作。这样就相当于从两个微服务上分别进行写数据

库的操作。这样就出现了分布式事务的场景。代码模拟完毕之后,再

使用 Seata 实现两个步骤的分布式事务的控制。


二、代码修改

首先把创建订单和扣减库存这样的功能开发出来,对此需要在原有的

order 微服务上作出一些修改。

找到订单微服务,把其中的 Controller 部分复制一份,并把第一个

进行注销。而后对第五个做出修改,并把删除其中无用的部分。需要

注意的是下订单的操作其实是应该放在业务层的,为了简便所以把其

放在 Controller 之中,但是现在需要把它转移至业务层中。

转移至业务层中就意味着在 orderService 中要提供一个新的创建

订单的方法。

为了简单所以在 Service 中也新建一个,对原本的第一个进行复制。

这样对于其他的代码就不会造成影响了。考虑到简单需要把

implementsorderService 删除,不使用接口了。

重新创建一个方法,创建订单返回值变成 order,请求变成 integer

类型的 pid。也就是提供了一个pid,以此创建一个订单。此外需要

把 Control 中的所有内容进行转移,把其中所需要的内容进行调整。

报错的地方有一个 log,所以需要添加一个 Slf4j。其他地方还有一

个 orderService 创建订单,在这个地方创建订单直接更名为

orderDao,保存订单就可以了。这是一个代码的基本修改,接下来继

续进行调整。

其中先把一些容错的信息删除,以免影响代码编写。在此需要注意一

下 productService,把里面的一些容错信息全部删除,同时把对应

的容错类 fallback 中的内容全部清理。返回到 Control 中,如果

调用的话就使用 orderServiceimpl5,调用 orderService 下单,

接着创建订单,把pid传输进去。结果直接 return 就可以了。

调用一条日志,然后调用商品微服务查询商品信息,查询完毕之后进

行下单的操作。下单结束以后打一条日志,接下来就向 mq 投递一个

下单成功的消息。

在投递消息之前加入一个扣减库存的步骤,扣减库存需要调用商品的

微服务。这里有两个参数,分别为商品标识和扣减库存数量。在远程

调用传递多个参数的时候需要添加一个 RequestParam。

接下来要在 product 的微服务中添加一个扣减库存的方法,在其中

找到 Controller。首先为了简单把这个Controller进行注销,然

后在 productController 中添加一个扣减库存的方法,把扣减库存

改为 reduceInventory。

成功之后调用 service 把库存扣除就可以了。把两个参数传进去,

分别为 pid 和 number。接下来商承一下扣减库存的方法。对于实现

的话直接调用 productDao 通过商品的ID查询,得到的就是一个商

品。在此就不再判断库存是否足够的问题,直接进行库存的减少,称

作省略校验。

第一步为查询商品,而后省略校验;第二步是在内存中扣减库存;第

三步就是保存。

接下来要在进行相应的调整,这个调整是与上次学习的内容相关。曾

经把 product 中的一些内容 Nacos 中,为了测试的简单化就把这些

内容进行删除了。删除它以后需要相应地调整 application,同时对

bootstrap 中的一些内容进行调整,只要制定一个Nacos的地址就

可以了。因为之后仍需要用到 Nacos。

代码调整完毕,但是需要重新启动一下两个微服务,检查一番是否有

问题。因为改动的内容比较多,可能会出现问题。首先第一个 product

是没有太大的问题,然后等待 order 启动。

Order 中存在一些问题,找到订单微服务中的 java,粘贴的时候缺

少了一些内容。对此找到 service 中的 ProductService,会发现粘

贴的时候缺少了一些内容。之后重新启动一下 order,启动完毕之后

就没有问题了。确认没有问题之后做一个下单的请求。下单之前首先

来看一下数据库,在 order 的表格中是存在一些用户的,而后找到

product,库存均是5000。现在就是对一号进行下载请求,下单成功

之后再次看一下数据库的变化,在 order 的表格中增添了一份数据,

product中的库存就已经被扣除了。至此就已经完成了代码的改造。

代码如下

(1)Controller

@RestController

@slf4j

publicclassOrderController5{

@Autowired

privateOrderServiceImpl5OrderService:

//下单

@RequestMapping(〝/order/prod/{pid}〞)

publicorderorder(@PathVariable(〝pid〞)integerpid){

log.info(“接收到{}号商品的下单请求,接下来调用商品微服务查

询此商品信息”,pid),

returnorderService.createOrder(pid)

(2)OrderService

@Autowired

privateProductServiceProductService

@Autowired

privateRocketMQTemplateRocketMQTemplate

publicordercreateOrder(Integerpid){

log.info(“接收到{}号商品的下单请求,接下来调用商品微服务查

询此商品信息”,pid);

//1调用商品微服务,查询商品信息

productproduct=productService.findByPid(pid);

log.info(“查询到{}号商品的信息,内容是:{}”,pid,

JSON.toJSONString(product))

//2下单(创建下单)

Orderorder=newOrder();

order.setUid(1);

order.setUsername(〞测试用户〝);

order.setPid(pid)

order.setPname(product.getPname());

order.setPprice(product.getPprice);

order.setNumber(1);

orderDao.save(order);

log.info(“创建订单成功,订单信息

{}”,JSON.toJSONString(order))

//3扣减库存

productService.reduceInventory(pid,order.getNumber());

//4向mq中投递一个下单成功的消息

//参数一:指定topic

//参数二:指定消息体

rocketMQTemplate.convertAndSend(destination:

〝order-topic〞,order);

returnorder

(3)ProductService

Packagecom.itheima.service

import

//value用于指定nacos下哪个微服务

//fallback指定当调用出现问题之后,要进入哪个类中的同名方法

之下执行备用逻辑

@FeignClient

Value=〞service-product〝

//fallback=ProductServiceFallback.class,

//fallbackFactory=ProductServiceFallbackFactory.class

PublicinterfaceProductService{

//@FeignClient的value+@RequestMapping的value值,其实就

是完成的请求地址〝http://service-product/product/〞+pid

//指定请求的URI部分

@RequestMapping(〝/product/{pid}〞)

ProductfindByPid(@PathVariableIntegerpid);

//扣减库存

//参数一:商品标识

//参数二:扣减数量

VoidreduceInventory(@RequestPararm(〞pid〝)Integerpid),

@RequestPararm(〞number〝)Integernumber)

相关实践学习
消息队列RocketMQ版:基础消息收发功能体验
本实验场景介绍消息队列RocketMQ版的基础消息收发功能,涵盖实例创建、Topic、Group资源创建以及消息收发体验等基础功能模块。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
相关文章
|
5月前
|
SQL Oracle 关系型数据库
seata版本问题之码云拉取代码异常如何解决
Seata是一款开源的分布式事务解决方案,旨在提供高效且无缝的分布式事务服务;在集成和使用Seata过程中,开发者可能会遇到不同的异常问题,本合集针对Seata常见异常进行系统整理,为开发者提供详细的问题分析和解决方案,助力高效解决分布式事务中的难题。
273 6
|
5月前
|
Java Nacos Sentinel
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
【Springcloud Alibaba微服务分布式架构 | Spring Cloud】之学习笔记(九)Nacos+Sentinel+Seata
733 0
|
5月前
|
SQL SpringCloudAlibaba 中间件
SpringCloud Alibaba Seata处理分布式事务--学习笔记
SpringCloud Alibaba Seata处理分布式事务--学习笔记
70 0
|
Java Nacos 数据库
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(下)应用整合shardingsphere集成seata完整代码及订单-库存完整模拟案例
|
Java 中间件 Unix
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
153 0
【分布式技术专题】「架构实践于案例分析」总结和盘点目前常用分布式事务特别及问题分析(Seata-终)
|
SQL 消息中间件 缓存
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(中)shardingshere 多库读写分离/分库分表下分布式事务完整代码及案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(中)shardingshere 多库读写分离/分库分表下分布式事务完整代码及案例
从0到1 手把手搭建spring cloud alibaba 微服务大型应用框架(五) SEATA分布式事务篇(中)shardingshere 多库读写分离/分库分表下分布式事务完整代码及案例
|
存储 运维 监控
Seata-微服务架构开发的必备利器 | 学习笔记
快速学习 Seata-微服务架构开发的必备利器
Seata-微服务架构开发的必备利器 | 学习笔记
|
Java 中间件 FESCAR
Seata介绍|学习笔记
快速学习Seata介绍
299 0
Seata介绍|学习笔记
|
1月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
5月前
|
存储 关系型数据库 MySQL
基于Seata实现分布式事务
通过以上步骤,你可以使用 Seata 实现分布式事务,确保在微服务架构中的事务一致性。Seata 支持多种语言和框架,能够满足不同业务场景的需求。欢迎关注威哥爱编程,一起学习成长。
142 1