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

1:依赖引入

  1.         
  2. <dependency>
  3. <groupId>org.springframework.boot groupId>
  4. <artifactId>spring-boot-starter-jdbc artifactId>
  5. dependency>
  6. <dependency>
  7. <groupId>mysql groupId>
  8. <artifactId>mysql-connector-java artifactId>
  9. dependency>
  10. <dependency>
  11. <groupId>com.alibaba groupId>
  12. <artifactId>druid artifactId>
  13. <version>1.1.3 version>
  14. dependency>
  15. <dependency>
  16. <groupId>com.taobao.txc groupId>
  17. <artifactId>txc-client artifactId>
  18. <version>${txc.version} version>
  19. <scope>system scope>
  20. <systemPath>${project.basedir}/../../../../lib/txc-client-2.0.69.jar systemPath>
  21. dependency>
  22. <dependency>
  23. <groupId>com.alibaba.dauth groupId>
  24. <artifactId>sdk-client artifactId>
  25. <version>1.2.3 version>
  26. dependency>
  27. <dependency>
  28. <groupId>commons-logging groupId>
  29. <artifactId>commons-logging artifactId>
  30. <version>1.1.1 version>
  31. dependency>
  32. <dependency>
  33. <groupId>org.slf4j groupId>
  34. <artifactId>slf4j-log4j12 artifactId>
  35. <version>1.6.4 version>
  36. dependency>
  37. <dependency>
  38. <groupId>io.netty groupId>
  39. <artifactId>netty-all artifactId>
  40. <version>4.1.0.Final version>
  41. dependency>
  42. <dependency>
  43. <groupId>com.taobao.middleware groupId>
  44. <artifactId>logger.api artifactId>
  45. <version>0.1.5 version>
  46. dependency>
  47. <dependency>
  48. <groupId>com.taobao.diamond groupId>
  49. <artifactId>diamond-client artifactId>
  50. <version>edas-3.7.3 version>
  51. dependency>
  52. <dependency>
  53. <groupId>ch.qos.logback groupId>
  54. <artifactId>logback-core artifactId>
  55. <version>1.1.7 version>
  56. 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> value>
  6. property>
  7. <property name="driverClassName" value="${jdbc.driverClassName}"/>
  8. bean>
  9. <bean class="com.taobao.txc.client.aop.TxcTransactionScaner">
  10. <constructor-arg value="myapp"/>
  11. <constructor-arg value="dXXXXXXXXXXX"/>
  12. <constructor-arg value="1"/>
  13. <constructor-arg value="https://test-cs-gts.aliyuncs.com"/>
  14. 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. class="language-java">    @TxcTransaction(timeout = 1000 * 6)  
  2.     public Map getMoney(String id) {  
  3.         String xid = TxcContext.getCurrentXid();  
  4.         TxcContext.bind(xid,null);  
  5.         logger.info("查询service : " + xid);  
  6.         Map 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.     }  

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

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

jar包下载地址


你可能感兴趣的:(Spring Cloud 中 分布式事务解决方案 -- 阿里GTS的使用)