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

1:依赖引入
  1.          <!--gts相关-->
  2. <!--数据库连接-->
  3. <dependency>
  4. <groupId>org.springframework.boot </groupId>
  5. <artifactId>spring-boot-starter-jdbc </artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>mysql </groupId>
  9. <artifactId>mysql-connector-java </artifactId>
  10. </dependency>
  11. <!--阿里druid数据库链接依赖-->
  12. <dependency>
  13. <groupId>com.alibaba </groupId>
  14. <artifactId>druid </artifactId>
  15. <version>1.1.3 </version>
  16. </dependency>
  17. <dependency>
  18. <groupId>com.taobao.txc </groupId>
  19. <artifactId>txc-client </artifactId>
  20. <version>${txc.version} </version>
  21. <scope>system </scope>
  22. <systemPath>${project.basedir}/../../../../lib/txc-client-2.0.69.jar </systemPath>
  23. </dependency>
  24. <dependency>
  25. <groupId>com.alibaba.dauth </groupId>
  26. <artifactId>sdk-client </artifactId>
  27. <version>1.2.3 </version>
  28. </dependency>
  29. <!-- OTHERS -->
  30. <dependency>
  31. <groupId>commons-logging </groupId>
  32. <artifactId>commons-logging </artifactId>
  33. <version>1.1.1 </version>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.slf4j </groupId>
  37. <artifactId>slf4j-log4j12 </artifactId>
  38. <version>1.6.4 </version>
  39. </dependency>
  40. <dependency>
  41. <groupId>io.netty </groupId>
  42. <artifactId>netty-all </artifactId>
  43. <version>4.1.0.Final </version>
  44. </dependency>
  45. <dependency>
  46. <groupId>com.taobao.middleware </groupId>
  47. <artifactId>logger.api </artifactId>
  48. <version>0.1.5 </version>
  49. </dependency>
  50. <dependency>
  51. <groupId>com.taobao.diamond </groupId>
  52. <artifactId>diamond-client </artifactId>
  53. <version>edas-3.7.3 </version>
  54. </dependency>
  55. <dependency>
  56. <groupId>ch.qos.logback </groupId>
  57. <artifactId>logback-core </artifactId>
  58. <version>1.1.7 </version>
  59. </dependency>
2:配置相关
  1.      <bean id="dataSource" class="com.taobao.txc.datasource.cobar.TxcDataSource">
  2. <property name="url" value="${jdbc.url}"/>
  3. <property name="username" value="${jdbc.username}"/>
  4. <property name="password">
  5. <value><![CDATA[${jdbc.password}]]> </value>
  6. </property>
  7. <property name="driverClassName" value="${jdbc.driverClassName}"/>
  8. </bean>
  9. <!-- 定义声明式事务,要想让事务annotation感知的话,要在这里定义一下,spring才能感知到 -->
  10. <!--<property name="accessKey" value="xxx"/>-->
  11. <!--<property name="secretKey" value="xxx"/>-->
  12. <bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
  13. <constructor-arg value="myapp"/> <!-- 应用名,用户自定义 -->
  14. <constructor-arg value="dXXXXXXXXXXX"/> <!-- 事务分组名 -->
  15. <constructor-arg value="1"/>
  16. <constructor-arg value="https://test-cs-gts.aliyuncs.com"/>
  17. </bean>
3:注意事项

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

  • 事务发起方业务处理类添加注解 
    @TxcTransaction(timeout = 1000 * 6) timeout默认为6000,为事务超时时间。
[java]  view plain  copy
  1. <code class="language-java">    @TxcTransaction(timeout = 1000 * 6)  
  2.     public Map<String, String> getMoney(String id) {  
  3.         String xid = TxcContext.getCurrentXid();  
  4.         TxcContext.bind(xid,null);  
  5.         logger.info("查询service : " + xid);  
  6.         Map<String, String> map = new HashMap<>();  
  7.         map.put("one", feignHelloService.getOne(id, xid));  
  8.         map.put("two", feignHelloService2.getOne(id, xid));  
  9.         TxcContext.unbind();  
  10.         return map;  
  11.     }</code>  

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

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

jar包下载地址


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值