阿里云全局事务服务(GTS)已通知于2024年1月22日停止服务。本文介绍如何将GTS云服务迁移至可替代的分布式事务解决方案。
前提条件
已开通并使用GTS云服务,是否开通GTS云服务可通过控制台查看事务分组列表有无数据进行判断。
支持以下地域开通GTS云服务:
华北2(北京)
华东1(杭州)
华东2(上海)
华南1(深圳)
华北3(张家口)
华北1(青岛)
迁移方案
由于GTS可支持多类型数据库、分库分表和跨服务的分布式事务解决方案,请根据下述几种场景选择对应的迁移方案。
分库分表事务
PolarDB-X (DRDS) 5.2及以下版本与GTS产品集成用于解决分库分表事务问题。升级PolarDB-X(DRDS) 版本至5.3及以上版本或PolarDB-X 2.0版本,可消除对GTS服务的依赖。
按照如下方法,判断 PolarDB-X(DRDS)是否开启了GTS云服务,若未开启GTS云服务请忽略升级操作。
连接DRDS-Server,GTS按照库粒度开启,在对应数据库中执行以下SQL。
set autocomit=false;
select last_txc_xid();
commit;
set autocomit=tue;
若执行select last_txc_xid();
返回信息中包含8091
,则可以判定已使用GTS来解决PolarDB-X (DRDS)分库分表事务。
若在业务中还涉及到跨服务的分布式事务,请参考下一节中的处理方案。
跨服务事务
如何判断业务侧是否使用了GTS跨服务事务场景?
搜索
@TxcTransaction
注解。在业务代码侧全文搜索该注解,若存在,说明业务中使用到了GTS;若不存在,继续第2步。搜索
TxcDataSource
API。在业务代码侧全文搜索是否有引用该类,若存在,说明业务中使用到了GTS;若不存在,继续第3步。搜索
txc-client
依赖。根据业务侧所使用的不同依赖包管理工具Maven或Gradle,在pom.xml或build.gradle搜索com.taobao.txc:txc-client
包依赖。若存在,说明业务中使用到了GTS;若不存在,说明未使用GTS服务。
针对此场景的GTS使用,推荐迁移至开源Seata,仅需要少量的代码改造成本。
Seata于2019年1月正式开源,提供了涵盖多种事务模式的一站式分布式事务解决方案,符合未来技术演进的方向。
目前 Seata 提供了丰富 RPC框架和数据库支持。
RPC框架:Alibaba Dubbo、Apache Dubbo、Apache bRPC、Spring Cloud、gRPC、EDAS HSF、Motan、sofa-RPC、http-jakarta。
数据库:MySQL、PostgreSQL、Oracle、阿里云RDS 、SQLServer、TiDB for MySQL、Oceanbase for MySQL、PolarDB-X 2.0(开发中)。
若已使用GTS云服务,但RPC框架和数据库不在上述列表中,请工单咨询。
由于目前开源Seata尚未提供对GTS完全的支持,因此业务侧需要参考下文完成GTS到开源Seata的开发适配。
依赖迁移
迁移前GTS依赖如下所示。
<dependency>
<groupId>com.taobao.txc</groupId>
<artifactId>txc-client</artifactId>
<version>${gts.sdk.version}</version>
</dependency>
<dependency>
<groupId>com.taobao.txc</groupId>
<artifactId>txc-client-springcloud</artifactId>
<version>${gts.sdk.version}</version>
</dependency>
迁移后Seata依赖如下所示。
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>${seata.version}</version>
</dependency>
seata.version
建议使用1.7.1版本。
配置迁移
迁移前GTS配置如下。
spring.cloud.txc.txcAppName=sc_demo_business
# - txcServerGroup: spring.cloud.txc.txcServerGroup事务分组。
# txc_test_public.1129361738553704.QD 是公网测试的专用事务分组。
# 在阿里云环境运行时,请使用自己在官网开通的事务分组(GTS实例)。
spring.cloud.txc.txcServerGroup=default
# - mode: spring.cloud.txc.mode工作模式。
# AT=1,MT=2,不配置,则默认为1。
# spring.cloud.txc.mode=1
# - url: spring.cloud.txc.url服务发现地址。
# 本地公网测试的服务发现地址,配置如下。
# 在阿里云环境运行时,有默认地址,请删除该配置。
# spring.cloud.txc.url=https://test-cs-gts.aliyuncs.com
# 下面两个配置对应TxcTransactionScaner的accessKey/secretKey两个属性。
# 在阿里云环境运行时,请配置拥有spring.cloud.txc.txcServerGroup指定的事务分组(GTS实例)运行权限的用户的AK/SK。
# 本地公网测试不需要该配置。
#spring.cloud.txc.accessKey=xxxxxxxxx's AK
#spring.cloud.txc.secretKey=xxxxxxxxx's SK
迁移后Seata配置如下所示。
请根据实际业务需要搭建Seata需要的注册配置中心,目前Seata支持主流的注册配置中心如Nacos、Eureka、Zookeeper等,推荐使用开源 Nacos 或 MSE Nacos云产品。以下配置以Nacos为例。
seata.application-id=sc_demo_business
seata.tx-service-group=default
seata.registry.type=nacos
seata.registry.nacos.server-addr=localhost:8848
seata.registry.nacos.group=SEATA_GROUP
seata.config.type=nacos
seata.config.nacos.server-addr=localhost:8848
seata.config.nacos.group=SEATA_GROUP
API迁移
此部分将适配如何改造业务中使用的GTS API 到 Seata API。一般来说业务使用GTS API 只需要一行注解即可,但对于复杂和更精细的事务场景GTS也提供了底层API。
常用API映射如下表所示。
对比项 | 迁移前GTS API | 迁移后 Seata API |
创建事务(注解) | @TxcTransaction | @GlobalTransaction |
创建事务(API) | TxcTransaction.getInstance(String vgroup, String ak, String sk) | GlobalTransactionContext.getCurrentOrCreate() |
获取事务XID | TxcContext.getCurrentXid() | RootContext.getXID() |
事务挂起 | TxcContext.suspendTxcTransaction() | GlobalTransaction.suspend() |
事务恢复 | TxcContext.resumeTxcTransaction(String xid) | GlobalTransaction.resume(SuspendedResourcesHolder suspendedResourcesHolder) |
事务上下文绑定 | TxcContext.bind(String xid, String nextSvrAddr) | RootContext.bind(String xid) |
事务上下文清除 | TxcContext.unbind() | RootContext.unbind() |
TM初始化 | 无需 | TMClient.init(String applicationId, String transactionServiceGroup) |
RM初始化 | 无需 | RMClient.init(String applicationId, String transactionServiceGroup) |
开启事务 | TxcTransaction.begin(long timeout) | RootContext.unbind() |
二阶段提交事务 | TxcTransaction.commit() | GlobalTransaction.commit() |
二阶段回滚事务 | TxcTransaction.rollback() | GlobalTransaction.rollback() |
GTS中存在AT和TCC事务模式,可根据下述方法迁移至Seata的AT和TCC事务模式。
AT事务模式
AT模式是通过代理数据源来完成JDBC的增强,如下表所示。
对比项 | 迁移前GTS API | 迁移后 Seata API |
代理数据源 | TxcDataSource | DatasourceProxy |
GTS使用代理数据源需要业务手动组装,方法如下所示。
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DruidDataSource dataSource() {
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Bean("dataSourceProxy")
public TxcDataSource dataSourceProxy(DruidDataSource dataSource) {
return new TxcDataSource(dataSource);
}
切换到Seata后,具体会分为3种用法,3种用法任选其一即可。
仅依赖
seata-all
,将上述代码中的TxcDataSource
替换为DatasourceProxy
。仅依赖
seata-all
,去掉dataSourceProxy
的bean
逻辑,加入@EnableAutoDataSourceProxy
注解。依赖
seata-spring-boot-starter
,去掉dataSourceProxy
的bean
逻辑,seata-spring-boot-starter
会将Datasource
接口自动代理为DatasourceProxy
,无需额外处理。
TCC事务模式
TCC模式仅支持注解方式使用,API映射关系如下表所示。
对比项 | 迁移前GTS API | 迁移后 Seata API |
分支事务 | @MtBranch | @TwoPhaseBusinessAction |