springboot+openFeign+nacos+seata开发实战上篇

本文来编写一个程序实例说下seata的使用,使用的分布式环境是openFeign整合nacos。如何想要使用dubbo整合nacos也是同样的道理,只要注意openFeign和dubbo在使用上的细微区别就可以了。

文章目录

  • seata理论知识
    • seata是什么
    • seata整体机制
    • seata设计原理
    • seata环境准备
  • 分布式事务理论
    • 什么是分布式事务
    • 为什么会有分布式事务
  • 本文小结


seata理论知识

seata是什么

Seata 是一款开源的分布式事务解决方案,致力于在微服务架构下提供高性能和简单易用的分布式事务服务。在 Seata 开源之前,Seata 对应的内部版本在阿里经济体内部一直扮演着分布式一致性中间件的角色,帮助经济体平稳的度过历年的双11,对各BU业务进行了有力的支撑。经过多年沉淀与积累,商业化产品先后在阿里云、金融云进行售卖。2019.1 为了打造更加完善的技术生态和普惠技术成果,Seata 正式宣布对外开源,未来 Seata 将以社区共建的形式帮助其技术更加可靠与完备。

Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。

springboot+openFeign+nacos+seata开发实战上篇_第1张图片


seata整体机制

两阶段提交协议的演变:

一阶段

  • 业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段

  • 提交异步化,非常快速地完成。
  • 回滚通过一阶段的回滚日志进行反向补偿。

文档说明:http://seata.io/zh-cn/docs/overview/what-is-seata.html

springboot+openFeign+nacos+seata开发实战上篇_第2张图片


seata设计原理

Seata的设计目标是对业务无侵入,因此从业务无侵入的2PC方案着手,在传统2PC的基础上演进。它把一个分布式事务理解成一个包含了若干分支事务的全局事务。全局事务的职责是协调其下管辖的分支事务达成一致,要么一起成功提交,要么一起失败回滚。此外,通常分支事务本身就是一个关系数据库的本地事务。

springboot+openFeign+nacos+seata开发实战上篇_第3张图片

Seata主要由三个重要组件组成

  • TC:Transaction Coordinator事务协调器,管理全局的分支事务的状态,用于全局性事务的提交和回滚。
  • TM:Transaction Manager事务管理器,用于开启、提交或者回滚全局事务。
  • RM:Resource Manager资源管理器,用于分支事务上的资源管理,向TC注册分支事务,上报分支事务的状态,接受TC的命令来提交或者回滚分支事务。

springboot+openFeign+nacos+seata开发实战上篇_第4张图片


seata环境准备

因为我使用nacos作为注册中心,seata作为一个服务,注册到nacos中。启动nacos,本文使用的是nacos1.4.3版本

springboot+openFeign+nacos+seata开发实战上篇_第5张图片

下载安装seata,修改配置文件后启动

springboot+openFeign+nacos+seata开发实战上篇_第6张图片

创建seata数据库,执行mysql脚本

springboot+openFeign+nacos+seata开发实战上篇_第7张图片

启动seata服务

springboot+openFeign+nacos+seata开发实战上篇_第8张图片

打开nacos控制面板,查看seata服务是否注册成功

springboot+openFeign+nacos+seata开发实战上篇_第9张图片

seata服务的默认端口为8091

springboot+openFeign+nacos+seata开发实战上篇_第10张图片


分布式事务理论

在这里讲解一点分布式事务相关的理论知识,不作详细的描述,便于理解下面的seata程序实例。


什么是分布式事务

分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器「分别位于不同的分布式系统的不同节点之上」

一个大的操作由N多的小的操作共同完成。而这些小的操作又分布在不同的服务上。针对于这些操作,「要么全部成功执行,要么全部不执行」

springboot+openFeign+nacos+seata开发实战上篇_第11张图片


为什么会有分布式事务

举个例子

springboot+openFeign+nacos+seata开发实战上篇_第12张图片
转账是最经典的分布式事务场景,假设用户 A 使用银行 app 发起一笔跨行转账给用户 B,银行系统首先扣掉用户 A 的钱,然后增加用户 B 账户中的余额。

如果其中某个步骤失败,此时就有可能会出现 2 种「异常」情况:

  • 用户 A 的账户扣款成功,用户 B 账户余额增加失败
  • 用户 A 账户扣款失败,用户 B 账户余额增加成功。

对于银行系统来说,以上 2 种情况都是「不允许发生」,此时就需要事务来保证转账操作的成功。

在「单体应用」中,我们只需要贴上@Transactional注解就可以开启事务来保证整个操作的「原子性」。

但是看似以上简单的操作,在实际的应用架构中,不可能是单体的服务,我们会把这一系列操作交给「N个服务」去完成,也就是拆分成为「分布式微服务架构」。

springboot+openFeign+nacos+seata开发实战上篇_第13张图片

比如下订单服务,扣库存服务等等,必须要「保证不同服务状态结果的一致性」,于是就出现了分布式事务


本文小结

由于springboot+openFeign+nacos+seata开发实战内容过多,故分成两篇来完成,剩下的内容请看下篇。

你可能感兴趣的:(微服务开发实战,java,dubbo,后端)