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,为事务超时时间。
- <code class="language-java"> @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;
- }</code>
注意代码中我们获取了TXC中的事务ID - > xid ,这个xid需要延服务链路传递到服务下游,这样下游的事务就按照最外层事务发起方的事务走。注意bind & unbind 两个方法,是为我们的事务和阿里GTS-SERVER的绑定操作,业务下游得到xid之后同样需要进行同样的绑定操作。若项目采用阿里EDAS分布式服务框架,xid的绑定操作无须编码,edas会自己传递。
- 本地启用GTS事务分组需阿里技术人员将分组分配到公网,因为GTS默认只支持经典网络类型的ECS。或直接采用阿里内部公网事务分组 txc_test_public.1129361738553704.QD 免费版GTS在启用服务时,会有不稳定问题 ,一般待服务启动一段时间就不会出现事务链接超时的异常。