- ybchen-common:公共模块
- ybchen-order-service:订单微服务
- ybchen-product-service:商品微服务
文章插图
Seata依赖<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-seata</artifactId><exclusions><exclusion><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId></exclusion></exclusions></dependency><dependency><groupId>io.seata</groupId><artifactId>seata-spring-boot-starter</artifactId><version>1.4.1</version></dependency><!-- seata 自身序列化bug问题-开始 --><dependency><groupId>com.esotericsoftware</groupId><artifactId>kryo</artifactId><version>4.0.2</version></dependency><dependency><groupId>de.javakaffee</groupId><artifactId>kryo-serializers</artifactId><version>0.42</version></dependency><!-- seata 自身序列化bug问题-结束 -->分布式事务演示关键代码片段
order-service
@AutowiredOrderMapper orderMapper;@AutowiredProductStockControllerFeign productStockControllerFeign;@Override//开启分布式事务 Seta AT模式@GlobalTransactionalpublic ReturnT<String> add() {OrderDO orderDO = new OrderDO();int outTradeNo = new Random().nextInt(1000);orderDO.setOutTradeNo("T" + outTradeNo);orderDO.setCreateTime(new Date());int rows = orderMapper.insert(orderDO);if (rows > 0) {//扣减商品库存ReturnT<String> reduceReturn = productStockControllerFeign.reduce();if (ReturnT.isSuccess(reduceReturn)) {log.info("购买成功");//TODO 模拟异常方式二//int num = 1 / 0;return ReturnT.buildSuccess("购买成功");}// 解决全局拦截器问题 , 通过接口响应状态码,来判断是否主动抛异常?。。。。。。?if (reduceReturn.getCode() != 0) {log.info("扣减商品库存失败,接口响应:{}", reduceReturn);throw new BizException(110, "扣减商品库存失败");}log.info("扣减商品库存失败");return ReturnT.buildError("扣减商品库存失败");}log.info("购买失败");return ReturnT.buildError("购买失败");}product-service
@AutowiredProductStockMapper productStockMapper;@Overridepublic ReturnT<String> reduceProductStock() {ProductStockDO stockDO = new ProductStockDO();stockDO.setProductId(10086);stockDO.setBuyNum(1);stockDO.setCreateTime(new Date());int rows = productStockMapper.insert(stockDO);//TODO 模拟异常方式一//int num = 1 / 0;if (rows > 0) {log.info("扣减商品库存成功,rows=" + rows);return ReturnT.buildSuccess("扣减商品库存成功");} else {log.info("扣减商品库存失败,rows=" + rows);return ReturnT.buildError("扣减失败");}}正常情况场景描述:product微服务和order微服务均正常,2个微服务的事务全部提交成功 , 2个库都插入数据成功
文章插图
异常情况一(product微服务异常)场景描述:product微服务发生异常,order微服务正常情况 , 出现异常情况时 , 需要2个微服务的事务全部回滚,2个库插入的数据都回滚
文章插图
异常情况二(order微服务异常)场景描述:order微服务发生异常,product微服务正常,出现异常情况时 , 需要2个微服务的事务全部回滚,2个库插入的数据都回滚
文章插图
异常情况三(product微服务未启动)场景描述:order微服务正常启动,product微服务未启动,需要把order微服务插入的数据回滚
文章插图
项目源码https://gitee.com/yenbin_chen/ybchen-seatay
推荐阅读
- MassTransit | .NET 分布式应用框架
- 之四 2流高手速成记:SpringBoot整合redis及mongodb
- SpringBoot整合ES+Kibana
- 云原生分布式 PostgreSQL+Citus 集群在 Sentry 后端的实践
- 微服务系列之分布式日志 ELK
- Dubbo2.7详解
- 四 SpringBoot - 整合Mybatis,逆向工程,JPA
- 撸了一个简易的配置中心,顺带整合到了SpringCloud
- 【Spring boot】整合tomcat底层原理
- 15 基于SqlSugar的开发框架循序渐进介绍-- 整合代码生成工具进行前端界面的生成