GTS云服务下线迁移方案

阿里云全局事务服务(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跨服务事务场景?

  1. 搜索@TxcTransaction注解。在业务代码侧全文搜索该注解,若存在,说明业务中使用到了GTS;若不存在,继续第2步。

  2. 搜索TxcDataSourceAPI。在业务代码侧全文搜索是否有引用该类,若存在,说明业务中使用到了GTS;若不存在,继续第3步。

  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,去掉dataSourceProxybean逻辑,加入@EnableAutoDataSourceProxy注解。

  • 依赖seata-spring-boot-starter,去掉dataSourceProxybean逻辑, seata-spring-boot-starter会将Datasource接口自动代理为DatasourceProxy,无需额外处理。

TCC事务模式

TCC模式仅支持注解方式使用,API映射关系如下表所示。

对比项

迁移前GTS API

迁移后 Seata API

分支事务

@MtBranch

@TwoPhaseBusinessAction