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 plaincopy
  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包下载地址


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/387071.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《HTTP 权威指南》笔记:第十五章 实体与编码

&#xfffc; 如果把 「HTTP 报文」想象为因特网货运系统的「箱子」,那么「HTTP 实体」就是报文中的实际的「货物」. 其中,实体又包含了「实体首部」 和 「实体主体」,实体首部用于描述各种参数,实体主体就是原始货物. 常见的实体首部 实体的大小: Content-Length 定义: 报文的…

Spring Cloud Sleuth进阶实战

为什么需要Spring Cloud Sleuth 微服务架构是一个分布式架构&#xff0c;它按业务划分服务单元&#xff0c;一个分布式系统往往有很多个服务单元。由于服务单元数量众多&#xff0c;业务的复杂性&#xff0c;如果出现了错误和异常&#xff0c;很难去定位。主要体现在&#xff…

Element表格嵌入复选框以及单选框

1&#xff0c;element 表格嵌入CheckBox 效果图如下&#xff1a; 2&#xff0c;element结合checkBox实现单选效果如下&#xff1a; html代码&#xff1a; <template><div><p>shopInfo</p><el-tableref"multipleTable":data"tableDat…

温故之 “插入排序”

概念&#xff1a;将一个数据插入已经排好序的有序数组中&#xff0c;从而得到一个新的多一个数据的有序数组。 概念理解~~ 将要排序的是一个乱的数组int[] arrays {3, 2, 1, 3, 3}; 在未知道数组元素的情况下&#xff0c;我们只能把数组的第一个元素作为已经排好序的有序数据&…

实验二3

#include "stdafx.h" #include "stdio.h" int main(int argc, char* argv[]) {int a,b,c; scanf("%d %d %d",&a,&b,&c);if(ab&&bc) printf("等边三角形");else if((ab&&b!c)||(ac&&c!b)||(bc&a…

webpack来打包你的vue项目,如发现你的vendor.js过大

1.如果你使用了webpack来打包你的vue项目&#xff0c;如发现你的vendor.js过大则可以参考本文的解决方案. 2.造成过大的原因是因为在main.js导入第三库太多时,webpack合并js时生成了vendor.js(我们习惯把第三方库放在vendor里面)造成的.如下图在main.js引用element-ui等第三方…

TF01 简介

总览 如何从实体中提取特征&#xff0c;对于很多传统机器学习算法的性能有巨大影响。 一旦解决了数据表达和特征提取&#xff0c;很多人工智能任务也就解决了90%。 对许多机器学习算法来说&#xff0c;特征提取不是一件简单的事情。 深度学习解决的核心问题之一就是自动的将简…

K8s基本概念入门

序言 没等到风来&#xff0c;绵绵小雨&#xff0c;所以写个随笔&#xff0c;聊聊k8s的基本概念。 k8s是一个编排容器的工具&#xff0c;其实也是管理应用的全生命周期的一个工具&#xff0c;从创建应用&#xff0c;应用的部署&#xff0c;应用提供服务&#xff0c;扩容缩容应用…

idea出现找不到实体类

今天经理遇到一个很奇怪的问题&#xff1a; 在使用idea时&#xff0c;就是包真实存在&#xff0c;但是包中的实体类却无法智能提示&#xff0c;也无法导入成功&#xff1b; 我推荐的解决办法是重新导入&#xff0c;但是没有用&#xff0c;经理在网上找了很多解决方式&#xff0…

TF02 入门

计算模型——图 数据模型——张量 运行模型——会话 TensorFlow计算模型——计算图 计算图是TF中最基本的一个概念&#xff0c;TF中的所有计算都会被转化为计算图上的结点。 TF是一个通过计算图的形式来表述计算的编程系统。TF中的每一个计算都是计算图上的一个节点&#x…

ElasticSearch、Logstash和Kiabana三个开源工具。

一 方案背景 通常&#xff0c;日志被分散的储存不同的设备上。如果你管理数十上百台服务器&#xff0c;你还在使用依次登录每台机器的传统方法查阅日志。这样是不是感觉很繁琐和效率低下。开源实时日志分析ELK平台能够完美的解决日志收集和日志检索、分析的问题&#xff0c;ELK…

「一本通 6.4 例 4」曹冲养猪(CRT)

复习一下 扩展中国剩余定理 首先考虑两个同余方程\[ x \equiv a_1\; mod\; m_1\\ x \equiv a_2\; mod\; m_2 \]化成另一个形式\[ x n_1 * m_1 a_1\\ x n_2 * m_2 a_2 \] 联立可得\[ n_1 * m_1 a_1 n_2 * m_2 a_2\\ n_1 * m_1 - n_2 * m_2 a_2 - a_1 \]有解的前提是\[ \…

06 MapReduce工作机制

MapReduce作业的执行流程 1、提交作業 在提交JobConf對象之後&#xff0c;用戶程序調用JobClient的runJob方法。 runJob方法會先行調用JobSubmissionProtocol接口所定義的submitJob方法&#xff0c;並將作業提交給JobTracker。 緊接着&#xff0c;runJob不斷循環&#xff0…

solr elasticsearch比较

solr&#xff1a; 优点 1、Solr有一个更大、更成熟的用户、开发和贡献者社区。 2、支持添加多种格式的索引&#xff0c;如&#xff1a;HTML、PDF、微软 Office 系列软件格式以及 JSON、XML、CSV 等纯文本格式。 3、Solr比较成熟、稳定。 4、不考虑建索引的同时进行搜索&#xf…

力扣(LeetCode)292. Nim游戏 巴什博奕

你和你的朋友&#xff0c;两个人一起玩 Nim游戏&#xff1a;桌子上有一堆石头&#xff0c;每次你们轮流拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。你作为先手。 你们是聪明人&#xff0c;每一步都是最优解。 编写一个函数&#xff0c;来判断你是否可以在给定石头数…

Spring Cloud应用监控与管理Actuator

由于我们把一个复杂高耦合的单体系统拆分成了多个小型服务&#xff0c;所以部署应用的数量在不断增长&#xff0c;造成维护复杂度大大提升。所以我们需要一套自动化的监控运维机制&#xff0c;这套运维机制可以不间断的获取每个服务应用的各种指标&#xff0c;并根据这些指标信…

2019.04.09 电商25 结算功能1

结算功能要获取很多数据&#xff0c; 现在的主要问题是要知道获取对应的商品信息&#xff0c;要知道我选的是哪个的商品信息啊 它们选框的类名都一样啊&#xff0c;能遍历吗&#xff1f;遍历之后要去获取&#xff0c;它父级属性的值 有多少商品就有多少复选框&#xff0c;可以获…