开源分布式事务中间件Seata使用指南-创新互联
介绍
10年的天河网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整天河建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联公司从事“天河网站设计”,“天河网站推广”以来,每个客户项目都认真落实执行。Seata 是阿里巴巴开源的分布式事务中间件,一种分布式事务解决方案,具有高性能和易于使用的微服务架构。
初衷
对业务无侵入:即减少技术架构上的微服务化所带来的分布式事务问题对业务的侵入
高性能:减少分布式事务解决方案所带来的性能消耗
分布式事务定义
分布式事务是一个全局事务,由一批分支事务组成,通常分支事务只是本地事务。
设计
Seata中有两种分布式事务实现方案,AT和TCC。
AT
AT模式是基于XA事务演进而来,核心是对业务无侵入,是一种改进后的两阶段提交,需要数据库支持。
基本组件:
事务协调器(TC):事务协调器,维护全局事务的运行状态,负责协调并驱动全局事务的提交或回滚。
Transaction Manager(TM): 控制全局事务的边界,负责开启一个全局事务,并最终发起全局提交或全局回滚的决议。
资源管理器(RM):控制分支事务,负责分支注册、状态汇报,并接收事务协调器的指令,驱动分支(本地)事务的提交和回滚。
处理流程:
TM要求TC开始新的全局事务。TC生成表示全局事务的XID。
XID通过微服务的调用链传播。
RM将本地事务注册为XID到TC的相应全局事务的分支。
TM要求TC提交或回滚XID的相应全局事务。
TC在XID的相应全局事务下驱动所有分支事务以完成分支提交或回滚。
TCC
Seata要求每个接口实现prepare、commit、rollback。
与 AT 模式一样,在运行时,该切面会拦截所有对 TCC 接口的调用。每调用一次 Try 接口,切面会先向 TC 注册一个分支事务,然后才去执行原来的 RPC 调用。当请求链路调用完成后,TC 通过分支事务的资源 ID 回调到正确的参与者去执行对应 TCC 资源的 Confirm 或 Cancel 方法。
初步操作 Try:完成所有业务检查,预留必须的业务资源。
确认操作 Confirm:真正执行的业务逻辑,不做任何业务检查,只使用 Try 阶段预留的业务资源。因此,只要 Try 操作成功,Confirm 必须能成功。另外,Confirm 操作需满足幂等性,保证一笔分布式事务能且只能成功一次。
取消操作 Cancel:释放 Try 阶段预留的业务资源。同样的,Cancel 操作也需要满足幂等性。
Seata Server安装
1.下载最新版本的 Seata Sever
https://github.com/seata/seata/releases
2. 解压并启动 Seata server
unzip seata-server-xxx.zip
cd distribution
sh ./bin/seata-server.sh 8091 file
示例
场景:
把数据库zeroa中proxy表的一条数据转移到数据库zerob中proxy表里面。
模块:
zero-discovery-server:注册中心
zero-gateway-server:服务网关
zero-consumer:服务消费者
zero-provider-a:服务提供者A
zero-provider-b:服务提供者B
架构及版本:
Spring-cloud:Finchley.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-server:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-netflix-eureka-client:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-gateway:2.0.4.BUILD-SNAPSHOT
spring-cloud-starter-openfeign:2.0.0.RELEASE
spring-boot:2.0.0.RELEASE
spring-boot-starter-data-jpa:2.0.0.RELEASE
spring-cloud-alibaba-seata:0.9.1.BUILD-SNAPSHOT
seata-all:0.6.1
mysql-connector-java:8.0.11
druid-spring-boot-starter:1.1.18
mysql:5.7
seata-server-0.6.1
实现:
zero-gateway-server
配置application.yml
zero-provider-a:
配置application.yml
File.conf
主要配置应用名称和seata server地址
vgroup_mapping.${spring.application.name}-fescar-service-group="default"
default.grouplist = "127.0.0.1:8091"
Registry.conf
编写Entity
编写Repository
编写Service
编写代码Controller
DataSource
zero-provider-b
配置同zero-provider-a工程,编写相应的业务逻辑。
在处理添加业务时,抛出异常。
zero-consumer
配置同zero-provider-a工程,编写相应的业务逻辑。
feignClient
feignclient
Service
Controller
测试
启动Seata Server
启动Mysql,并初始化(每个库都要创建undo_log表)
DROP SCHEMA IF EXISTS zeroa;
CREATE SCHEMA zeroa;
USE zeroa;
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
DROP SCHEMA IF EXISTS zerob;
CREATE SCHEMA zerob;
USE zerob;
CREATE TABLE `undo_log` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`branch_id` bigint(20) NOT NULL,
`xid` varchar(100) NOT NULL,
`context` varchar(128) NOT NULL,
`rollback_info` longblob NOT NULL,
`log_status` int(11) NOT NULL,
`log_created` datetime NOT NULL,
`log_modified` datetime NOT NULL,
`ext` varchar(100) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;
启动
zero-discovery-server
zero-gateway-server
zero-provider-a
zero-provider-b
zero-consumer
添加数据
正常执行事务
可在两张表中查看数据(a库中删除id=2的数据,b库中添加了一条数据)。
执行事务回滚
查看数据库数据(没有变化)。
另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。
网站标题:开源分布式事务中间件Seata使用指南-创新互联
文章网址:http://ybzwz.com/article/dsgigp.html