返回
SpringCloudAlibaba之Integrated Example示例工程源码解读二
后端
2023-10-15 20:30:09
1. 分布式事务概述
分布式事务是指一组分布在不同节点上的事务,这些事务作为一个整体来执行,要么都成功,要么都失败。分布式事务的实现面临着许多挑战,包括但不限于:
- 数据一致性 :确保分布式事务中的所有数据操作都按照预期的顺序执行,并且在所有节点上保持一致。
- 原子性 :确保分布式事务中的所有操作要么都成功,要么都失败,不会出现部分成功的情况。
- 隔离性 :确保分布式事务中的每个操作都独立于其他操作,不会受到其他操作的影响。
- 持久性 :确保分布式事务中的所有数据操作都能够持久化存储,即使发生故障也不会丢失。
2. Seata分布式事务框架
Seata是一个开源的分布式事务框架,它采用TCC(Try-Confirm-Cancel)模式来实现分布式事务。TCC模式将一个分布式事务分为三个阶段:
- Try阶段 :在Try阶段,事务参与者(即分布式事务中的每个参与节点)会执行本地事务,并对相关资源进行预留。
- Confirm阶段 :如果Try阶段的所有操作都成功,则会进入Confirm阶段。在Confirm阶段,事务参与者会提交本地事务,并释放预留的资源。
- Cancel阶段 :如果Try阶段或Confirm阶段有任何操作失败,则会进入Cancel阶段。在Cancel阶段,事务参与者会回滚本地事务,并释放预留的资源。
3. SpringCloudAlibaba之Integrated Example示例工程源码解读
SpringCloudAlibaba的Integrated Example示例工程是一个分布式事务的示例项目,它演示了如何在Spring Cloud Alibaba中使用Seata框架来实现分布式事务。该项目包含了两个模块:
- order-service模块 :这是一个订单服务模块,它负责处理订单的创建、修改和删除操作。
- storage-service模块 :这是一个库存服务模块,它负责处理商品库存的增加、减少和查询操作。
这两个模块都使用了Seata框架来实现分布式事务,以确保订单和库存数据的一致性。
3.1 工程结构
Integrated Example示例工程的工程结构如下:
├── order-service
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ ├── com
│ │ │ │ │ ├── example
│ │ │ │ │ │ ├── config
│ │ │ │ │ │ │ ├── DataSourceProxyAutoConfiguration.java
│ │ │ │ │ │ │ ├── StorageServiceAutoConfiguration.java
│ │ │ │ │ │ │ ├── TransactionConfiguration.java
│ │ │ │ │ │ │ ├── main
│ │ │ │ │ │ │ │ ├── Application.java
│ │ │ │ │ │ │ │ ├── CloudAlibabaConfiguration.java
│ │ │ │ │ │ │ │ ├── TransactionExceptionAdvice.java
│ │ │ │ │ │ │ │ └── TransactionBeanFactoryPostProcessor.java
│ │ │ │ │ │ │ ├── test
│ │ │ │ │ │ │ │ ├── AbstractTest.java
│ │ │ │ │ │ │ │ ├── OrderServiceTest.java
│ │ │ │ │ │ │ │ └── SeataAutoConfigurationTest.java
│ │ │ │ │ │ │ ├── util
│ │ │ │ │ │ │ │ └── TransactionUtils.java
│ │ │ │ │ │ │ └── vo
│ │ │ │ │ │ │ │ ├── Order.java
│ │ │ │ │ │ │ │ ├── OrderDTO.java
│ │ │ │ │ │ │ │ └── OrderVO.java
│ │ │ │ │ │ │ └── web
│ │ │ │ │ │ │ │ ├── OrderController.java
│ │ │ │ │ │ │ │ └── OrderFeignClient.java
│ │ │ │ │ │ │ ├── model
│ │ │ │ │ │ │ │ ├── Product.java
│ │ │ │ │ │ │ │ ├── Storage.java
│ │ │ │ │ │ │ │ └── TransactionLog.java
│ │ │ │ │ │ │ └── repository
│ │ │ │ │ │ │ │ ├── OrderRepository.java
│ │ │ │ │ │ │ │ ├── ProductRepository.java
│ │ │ │ │ │ │ │ ├── StorageRepository.java
│ │ │ │ │ │ │ │ └── TransactionLogRepository.java
│ │ │ │ │ │ │ └── service
│ │ │ │ │ │ │ │ ├── OrderService.java
│ │ │ │ │ │ │ │ ├── ProductService.java
│ │ │ │ │ │ │ │ ├── StorageService.java
│ │ │ │ │ │ │ │ └── TransactionLogService.java
│ │ │ │ │ │ │ └── util
│ │ │ │ │ │ │ │ ├── FeignConfiguration.java
│ │ │ │ │ │ │ │ └── WebConfiguration.java
│ │ │ │ │ │ │ └── vo
│ │ │ │ │ │ │ │ ├── PageRequest.java
│ │ │ │ │ │ │ │ ├── PageResult.java
│ │ │ │ │ │ │ │ ├── OrderRequest.java
│ │ │ │ │ │ │ │ ├── OrderResponse.java
│ │ │ │ │ │ │ │ ├── PageOrderRequest.java
│ │ │ │ │ │ │ │ ├── PageOrderResponse.java
│ │ │ │ │ │ │ │ ├── ReduceStockRequest.java
│ │ │ │ │ │ │ │ └── StorageResponse.java
│ │ │ │ │ │ │ └── web
│ │ │ │ │ │ │ │ ├── AbstractController.java
│ │ │ │ │ │ │ │ ├── ExceptionController.java
│ │ │ │ │ │ │ │ ├── GlobalExceptionHandler.java
│ │ │ │ │ │ │ │ ├── OrderController.java
│ │ │ │ │ │ │ │ ├── ProductController.java
│ │ │ │ │ │ │ │ ├── StorageController.java
│ │ │ │ │ │ │ │ ├── TransactionLogController.java
│ │ │ │ │ │ │ │ └── TransactionLogFeignClient.java
├── storage-service
│ ├── pom.xml
│ ├── src
│ │ ├── main
│ │ │ ├── java
│ │ │ │ ├── com
│ │ │ │ │ ├── example
│ │ │ │ │ │ ├── config
│ │ │ │ │ │ │ ├── DataSourceProxyAutoConfiguration.java
│ │ │ │ │ │ │ ├── Storage