# springcloud-eureka-seata-saga **Repository Path**: istorktech/springcloud-eureka-seata-saga ## Basic Information - **Project Name**: springcloud-eureka-seata-saga - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 1 - **Created**: 2020-09-21 - **Last Updated**: 2024-07-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springcloud-eureka-seata-saga 完整微服务Seata Saga模式解决方案样例 ## Seata 是什么? Seata是一款开源的分布式解决方案,致力于提供高性能和简单易用的分布式事务服务。它设计的初衷是: - **对业务无侵入:** 这里的 侵入 是指,因为分布式事务这个技术问题的制约,要求应用在业务层面进行设计和改造。这种设计和改造往往会给应用带来很高的研发和维护成本。把分布式事务问题在中间件这个层次解决掉,不要求应用在业务层面做额外的工作。 - **高性能:** 引入分布式事务的保障,必然会有额外的开销,引起性能的下降。把分布式事务引入的性能损耗降到非常低的水平,让应用不因为分布式事务的引入导致业务的可用性受影响 Seata为用户提供了AT模式、TCC模式、Soga模式以及XA事务模式,为用户打造一站式的分布式事务解决方案。 我们先来了解一下Seata的重要的组件: - **Transcation Coordinator(TC)**:事务协调器, 维护全局事务的事务状态,负责协调并驱动全局事务的提交或回滚 即Seata-server - **Transaction Manager(TM)**: 维护全局事务的边界,负责开启一个全局事务,并负责发起全局事务的提交或者回滚的决议 即Seata-Client,事务的发起者,整个微服务调用链的起点 - **Resource Manger(RM)**: 控制分支事务,负责注册分支事务,分支事务状态的汇报,并接受事务协调器的指令,驱动本地事务的提交或者回滚 即Seata-Client, 事务的参与者,负责本地事务的处理以及与Seata-server的交互 一个典型的分布式事务过程: 1. TM 向TC发起创建一个全局事务,TC创建全局事务成功并生成一个全局唯一的XID 2. XID在整个服务调用上下文中传递 3. RM向TC注册分支事务,并入对应XID的全局事务的管辖下 4. TM 向TC 发起对应XID全局事务的提交或回滚决议 5. TC 调度 XID 下管辖的全部分支事务完成提交或回滚请求。 ![image-20200412143244576](http://www.iocoder.cn/images/Seata/2017-01-01/01.png) ## SEATA Saga 模式 **Soga模式** 官网文档说明: https://seata.io/zh-cn/docs/user/saga.html Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。 ![image-20200412162608605](https://img.alicdn.com/tfs/TB1Y2kuw7T2gK0jSZFkXXcIQFXa-445-444.png) **Saga的实现** 目前SEATA提供的Saga模式是基于状态机引擎来实现的,机制是: 1. 通过状态图来定义服务调用的流程并生成 json 状态语言定义文件 2. 状态图中一个节点可以是调用一个服务,节点可以配置它的补偿节点 3. 状态图 json 由状态机引擎驱动执行,当出现异常时状态引擎反向执行已成功节点对应的补偿节点将事务回滚 ​ 注意: 异常发生时是否进行补偿也可由用户自定义决定 4. 可以实现服务编排需求,支持单项选择、并发、子流程、参数转换、参数映射、服务执行状态判断、异常捕获等功能 **适用场景:** - 业务流程长、业务流程多 - 参与者包含其它公司或遗留系统服务,无法提供 TCC 模式要求的三个接口 **优势:** - 一阶段提交本地事务,无锁,高性能 - 事件驱动架构,参与者可异步执行,高吞吐 - 补偿服务易于实现 **缺点:** - 不保证隔离性 ## 安装运行seata-server - 下载seata-server-1.3.0.zip ~~~ https://gitee.com/istorktech/springcloud-seata-doc/raw/master/software/seata-server-1.3.0.zip ~~~ - 运行程序 ~~~ 解压seata-server-1.3.0.zip 切换到seata-server-1.3.0\seata\bin 执行seata-server.bat ~~~ ## 启动服务 - 运行EurekaServerApplication - 运行OrderServerApplication - 运行StorageServerApplication - 运行AccountServerApplication ## 测试Sage默认的分布式事务 - 正常流程请求访问: ~~~ http://localhost:8180/order/create?userId=1&productId=1&count=1&count=1&payAmount=1&status=0 ~~~ - 异常流程请求模块: 1.找到storage-server工程中io.seata.sample.service.StorageServiceImpl#decrease方法中: 取消异常注释语句 throw new RuntimeException(); ~~~ @Override public boolean decrease(Long productId, Integer count) { LOGGER.info("扣减库存, commit, productId:{}, count:{}", productId, count); storageDao.decrease(productId, count); // throw new RuntimeException(); return true; } ~~~ 2.再请求下面地址 ~~~ http://localhost:8180/order/create?userId=1&productId=1&count=1&count=1&payAmount=1&status=0 ~~~