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在启用服务时,会有不稳定问题 ,一般待服务启动一段时间就不会出现事务链接超时的异常。