Spring Cloud 中 分布式事务解决方案 -- 阿里GTS的使用

1:依赖引入
        <!--gts相关-->
        <!--数据库连接-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <!--阿里druid数据库链接依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.3</version>
        </dependency>
        <dependency>
            <groupId>com.taobao.txc</groupId>
            <artifactId>txc-client</artifactId>
            <version>${txc.version}</version>
            <scope>system</scope>
            <systemPath>${project.basedir}/../../../../lib/txc-client-2.0.69.jar</systemPath>
        </dependency>

        <dependency>
            <groupId>com.alibaba.dauth</groupId>
            <artifactId>sdk-client</artifactId>
            <version>1.2.3</version>
        </dependency>

        <!-- OTHERS -->
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.1</version>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.4</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.0.Final</version>
        </dependency>
        <dependency>
            <groupId>com.taobao.middleware</groupId>
            <artifactId>logger.api</artifactId>
            <version>0.1.5</version>
        </dependency>
        <dependency>
            <groupId>com.taobao.diamond</groupId>
            <artifactId>diamond-client</artifactId>
            <version>edas-3.7.3</version>
        </dependency>
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-core</artifactId>
            <version>1.1.7</version>
        </dependency>
2:配置相关
    <bean id="dataSource" class="com.taobao.txc.datasource.cobar.TxcDataSource">
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password">
            <value><![CDATA[${jdbc.password}]]></value>
        </property>
        <property name="driverClassName" value="${jdbc.driverClassName}"/>
    </bean>

    <!-- 定义声明式事务,要想让事务annotation感知的话,要在这里定义一下,spring才能感知到 -->
    <!--<property name="accessKey" value="xxx"/>-->
    <!--<property name="secretKey" value="xxx"/>-->
    <bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
        <constructor-arg value="myapp"/><!-- 应用名,用户自定义 -->
        <constructor-arg value="dXXXXXXXXXXX"/><!-- 事务分组名 -->
        <constructor-arg value="1"/>
        <constructor-arg value="https://test-cs-gts.aliyuncs.com"/>
    </bean> 
3:注意事项

  • 启动类将第二步的配置文件引入 
    @ImportResource({"classpath:META-INF/applicationContext.xml"})
  • 微服务中所有的模块都需要做第一步和第二步的操作,并注意scaner设置的应用名应唯一
  • 第二步的配置文件中的scaner只适用于本地化开发,线上修改如下
        <bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
            <constructor-arg value="myapp"/><!-- 应用名,用户自定义 -->
            <constructor-arg value="xxxxxxxx"/><!-- 事务分组名 -->
            <constructor-arg value="1"/>
            <property name="accessKey" value="xxx"/>
            <property name="secretKey" value="xxx"/>
        </bean>

  • 事务发起方业务处理类添加注解 
    @TxcTransaction(timeout = 1000 * 6) timeout默认为6000,为事务超时时间。
    @TxcTransaction(timeout = 1000 * 6)
    public Map<String, String> getMoney(String id) {
        String xid = TxcContext.getCurrentXid();
        TxcContext.bind(xid,null);
        logger.info("查询service : " + xid);
        Map<String, String> map = new HashMap<>();
        map.put("one", feignHelloService.getOne(id, xid));
        map.put("two", feignHelloService2.getOne(id, xid));
        TxcContext.unbind();
        return map;
    }

注意代码中我们获取了TXC中的事务ID - > xid  ,这个xid需要延服务链路传递到服务下游,这样下游的事务就按照最外层事务发起方的事务走。注意bind & unbind 两个方法,是为我们的事务和阿里GTS-SERVER的绑定操作,业务下游得到xid之后同样需要进行同样的绑定操作。若项目采用阿里EDAS分布式服务框架,xid的绑定操作无须编码,edas会自己传递。

  • 本地启用GTS事务分组需阿里技术人员将分组分配到公网,因为GTS默认只支持经典网络类型的ECS。或直接采用阿里内部公网事务分组 txc_test_public.1129361738553704.QD  免费版GTS在启用服务时,会有不稳定问题 ,一般待服务启动一段时间就不会出现事务链接超时的异常。

jar包下载地址


  • 4
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Hmily是柔性分布式事务解决方案,提供了TCC 与 TAC 模式。它以零侵入以及快速集成方式能够方便的被业务进行整合。在性能上,日志存储异步(可选)以及使用异步执行的方式,不损耗业务方法方法。之前是由我个人开发,目前由我在京东数科已经重新启动,未来将会是金融场景的分布式事务解决方案。 功能: 高可靠性:支持分布式场景下,事务异常回滚,超时异常恢复,防止事务悬挂 易用性:提供零侵入性式的 Spring-Boot,Spring-Namespace 快速与业务系统集成 高性能:去心化设计,与业务系统完全融合,天然支持集群部署 可观测性:Metrics多项指标性能监控,以及admin管理后台UI展示 多种RPC:支持 Dubbo,SpringCloud,Motan,Sofa-rpc,brpc,tars 等知名RPC框架 日志存储:支持 mysql,oracle,mongodb,redis,zookeeper 等方式 复杂场景:支持RPC嵌套调用事务 必要前提: 必须使用 JDK8+ TCC模式必须要使用一款 RPC 框架,比如:Dubbo,SpringCloud,Montan TCC模式 当使用TCC模式的时候,用户根据自身业务需求提供 try,confirm,cancel 等三个方法, 并且 confirm,cancel 方法由自身完成实现,框架只是负责来调用,来达到事务的一致性。 TAC模式 当用户使用TAC模式的时候,用户必须使用关系型数据库来进行业务操作,框架会自动生成回滚SQL,当业务异常的时候,会执行回滚SQL来达到事务的一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值