TX-LCN分布式事务框架

随着互联化的蔓延,各种项目都逐渐向分布式服务做转换。如今微服务已经普遍存在,本地事务已经无法满足分布式的要求,由此分布式事务问题诞生。 分布式事务被称为世界性的难题,目前分布式事务存在两大理论依据:CAP定律 BASE理论。

官网地址:https://www.txlcn.org/zh-cn/

GitHun:https://github.com/yizhishang/tx-lcn/

在一个分布式系统下存在多个模块协调来完成一次业务。那么就存在一次业务事务下可能横跨多种数据源节点的可能。TX-LCN将可以解决这样的问题。

​ 例如存在服务模块A 、B、 C。A模块是mysql作为数据源的服务,B模块是基于redis作为数据源的服务,C模块是基于mongo作为数据源的服务。若需要解决他们的事务一致性就需要针对不同的节点采用不同的方案,并且统一协调完成分布式事务的处理。

方案:

​ 若采用TX-LCN分布式事务框架,则可以将A模块采用LCN模式、B/C采用TCC模式就能完美解决。

TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务。

  1. 安装TM需要依赖的中间件: JRE1.8+, Mysql5.6+, Redis3.2+

如果需要手动编译源码, 还需要Git, Maven, JDK1.8+

  1. 创建MySQL数据库, 名称为: tx-manager
  2. 创建数据表
CREATE TABLE `t_tx_exception`  (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,
`transaction_state` tinyint(4) NULL DEFAULT NULL,
`registrar` tinyint(4) NULL DEFAULT NULL,
`remark` varchar(4096) NULL DEFAULT NULL,
`ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 未解决 1已解决',
`create_time` datetime(0) NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

TM下载与配置

  1. 历史版本TM下载找到5.0.2.RELEASE的TM, 下载.
  2. 修改配置信息
spring.application.name=tx-manager
server.port=7970
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true
# TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
# TxClient连接请求端口
tx-lcn.manager.port=8070
# 心跳检测时间(ms)
tx-lcn.manager.heart-time=15000
# 分布式事务执行总时间
tx-lcn.manager.dtx-time=30000
#参数延迟删除时间单位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128
# TM后台登陆密码,默认值为codingapi
tx-lcn.manager.admin-key=123456
logging.level.com.codingapi=debug
#redis 主机
spring.redis.host=127.0.0.1
#redis 端口
spring.redis.port=6379
#redis 密码
spring.redis.password=
# 开启日志,默认为false
tx-lcn.logger.enabled=true
tx-lcn.logger.driver-class-name=${spring.datasource.driver-class-name}
tx-lcn.logger.jdbc-url=${spring.datasource.url}
tx-lcn.logger.username=${spring.datasource.username}
tx-lcn.logger.password=${spring.datasource.password}
  • # 给出信息都是默认值

    关于详细配置说明见TM配置
  • application.properties 加载顺序如下:

    0、命令行启动参数指定

    1、file:./config/(当前jar目录下的config目录)

    2、file:./(当前jar目录)

    3、classpath:/config/(classpath下的config目录)

    4、classpath:/(classpath根目录)

    发布的二进制可执行Jar包含一个默认配置文件(也就是4),可按需要覆盖默认配置
  • 把txlcn-tm的pom打包方式修改成
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
  • 手动编译TM,简单指引
# git clone https://github.com/codingapi/tx-lcn.git & cd txlcn-tm
# mvn clean package '-Dmaven.test.skip=true'

target文件夹下,即为Ttxlcn-tm-5.0.2.RELEASE.jar

TC微服务模块

  • 服务A作为DTX发起方,远程调用服务B

工程说明

  1. finchley 父项目主要进行依赖管理
  2. common-config 可存方公共配置级工具
  3. common-eureka 服务注册中心
  4. gateway-zuul 网关
  5. user-server 服务1
  6. money-server 服务2

忽略其他工程搭建步骤。

事务操作实例

user-server 提供远程服务,money-server通过fegin发现服务调用进行事务回滚。

这两个服务需要加入依赖,如下:

<!-- springcloud 分布式事物 -->
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-tc</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.codingapi.txlcn</groupId>
<artifactId>txlcn-txmsg-netty</artifactId>
<version>5.0.2.RELEASE</version>
<exclusions>
<exclusion>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
</exclusion>
</exclusions>
</dependency>

依赖最好跟随TM管理器版本,方式出现奇怪问题。

两个工程的启动类使用该@EnableDistributedTransaction标记启动分布式事务。

两个工程properties需要加入事务管理器监控地址,如下:

#该配置根据TM打包时的配置进行
tx-lcn.client.manager-address=127.0.0.1:8070

user-servermoney-server插入数据,server实例:

/**
* user-server
* @Auhotr:SimpleWu
* @TxTransaction 使用该注解启动分布式事务
* @Transactional 同时使用spring事务开启本地事务
* 插入一个用户
*/
@Override
@TxTransaction
@Transactional
public int insertUser(Map<String, Object> map) {
userServerMapper.insert(map);
return "insertUser success";
}
 //fegin调用user-server服务
@Autowired
private UserFegin userFegin; //对money表操作mapper
@Autowired
private MoneyServerMapper moneyServerMapper; /**
* user-server
* @Auhotr:SimpleWu
* @TxTransaction 使用该注解启动分布式事务
* @Transactional 同时使用spring事务开启本地事务
* 插入一个用户
*/
@Override
@TxTransaction
@Transactional
public String insert() {
String userId = UUID.randomUUID().toString(); Map<String,Object> param = new HashMap<>();
param.put("ID",userId);
param.put("USER_ID",userId);
param.put("MONEY",100);
param.put("USERPASS","12321321"); //先调用远程服务测试事务回滚
System.out.println( userFegin.hello("张三","12321321",userId)); int i = 0 / 0; moneyServerMapper.insert(param); return "success " + param;
}

启动顺序:

  • 部署Redis
  • 部署TM的Jar包
  • 部署Eureka服务注册中心
  • 部署user-server服务
  • 部署money-server服务
  • 忽略网关等.....

访问money-server服务 :http://localhost:13000/hello 调用 insert();

int i = 0 / 0;

该行代码发生异常,UserFegin为user-server远程放服务调用后打印"insertUser success"代表调用成功,如果分布式事务没有效果,那么遇见该异常远程方不会进行回滚。

在本次测试是回滚成功的,就不贴图了,亲自尝试才能体会到,那种感觉。

然后删除money-server中删除int i = 0 / 0;重新启动。

再次调用http://localhost:13000/hello 调用 insert(),成功插入两条数据。

访问:http://localhost:7970进入TxManager系统后台,登录密码是我们设置的123456。里面可以看到配置信息,以及异常信息日志,系统日志。

该篇案例源代码与工具见:https://github.com/450255266/open-doubi

SpringCloud 分布式事务解决方案的更多相关文章

  1. Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案

    Java生鲜电商平台-SpringCloud微服务架构中分布式事务解决方案 说明:Java生鲜电商平台中由于采用了微服务架构进行业务的处理,买家,卖家,配送,销售,供应商等进行服务化,但是不可避免存在 ...

  2. 阿里微服务架构下分布式事务解决方案-GTS

    虽然微服务现在如火如荼,但对其实践其实仍处于初级阶段.即使互联网巨头的实践也大多是试验层面,鲜有核心业务系统微服务化的案例.GTS是目前业界第一款,也是唯一的一款通用的解决微服务分布式事务问题的中间件 ...

  3. 阿里分布式事务解决方案-GTS

    摘要: 本文将深入和大家探讨微服务架构下,分布式事务的各种解决方案,并重点为大家解读阿里巴巴提出的分布式事务解决方案----GTS.该方案中提到的GTS是全新一代解决微服务问题的分布式事务互联网中间件 ...

  4. 微服务架构下分布式事务解决方案——阿里GTS

    1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,很多互联网行业巨头.开源社区等都开始了微服务 ...

  5. 微服务架构下分布式事务解决方案——阿里云GTS

    https://blog.csdn.net/jiangyu_gts/article/details/79470240 1 微服务的发展 微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这 ...

  6. 分布式事务专题笔记(二)分布式事务解决方案之 2PC(两阶段提交)

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 前面已经了解了分布式事务的基础理论,以理论为基础,针对不同的分布式场景业界常见的解决方案有2PC.TCC ...

  7. springcloud分布式事务终极探讨

    2018阿里云全部产品优惠券(好东东,强烈推荐)领取地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userC ...

  8. 基于支付系统真实场景的分布式事务解决方案效果演示: http://www.iqiyi.com/w_19rsveqlhh.html

    基于支付系统真实场景的分布式事务解决方案效果演示:http://www.iqiyi.com/w_19rsveqlhh.html

  9. 阿里开源分布式事务解决方案 Fescar

    微服务倡导将复杂的单体应用拆分为若干个功能简单.松耦合的服务,这样可以降低开发难度.增强扩展性.便于敏捷开发.当前被越来越多的开发者推崇,系统微服务化后,一个看似简单的功能,内部可能需要调用多个服务并 ...

随机推荐

  1. mybatis枚举类型处理器

    1. 定义枚举值的接口 public abstract interface ValuedEnum { int getValue(); } 所有要被mybatis处理的枚举类继承该接口 2. 定义枚举类 ...

  2. DC 课程内容

  3. virtualbox安装win7系统报错(“FATAL:No bootable medium found!”)

    virtualbox属于傻瓜式安装虚拟系统,但博主安装win7系统时,无论怎么调试都还是出现截图所述样式,网上教程很多,但是都不行,其实只有一个根本原因安装的iso镜像不是原生镜像,下载的镜像已经是被 ...

  4. Jsoup -- 网络爬虫解析器

    需要下载jsoup-1.8.1.jar包 jsoup 是一款Java 的HTML解析器,可直接解析某个URL地址.HTML文本内容.它提供了一套非常省力的API,可通过DOM,CSS以及类似于jQue ...

  5. poj 1017 装箱子问题 贪心算法

    题意:有1*1到6*6的的东西,需要用6*6的箱子将它们装起来.问:至少需要多少个6*6箱子 思路: 一个瓶子怎么装东西最多?先装石头,在装沙子,然后装水. 同样放在本题就是先装6*6然后5*5... ...

  6. selenium2断言类Assert的使用

    测试中断言的重要性 一.断言的作用: 1.断言也就是检查点,重在判断我们通过页面得出来的值与期望值是否相等,如果相等,则代表断言成功,程序会继续往下执行,如果不相等,则代表断言失败,程序就会在断言失败 ...

  7. src与href的区别

    href: 是指向网络资源所在位置,建立和当前元素(锚点)或当前文档(链接)之间的链接,用于超链接. src:是指向外部资源的位置,指向的内容将会嵌入到文档中当前标签所在位置:在请求src资源时会将其 ...

  8. 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件

    原 解决使用intellij idea开发MAVEN项目在target目录下不存在mapper.xml文件 原文章链接:https://blog.csdn.net/beauxie/article/de ...

  9. [转载]ExtJs4 笔记(2) ExtJs对js基本语法扩展支持

    作者:李盼(Lipan)出处:[Lipan] (http://www.cnblogs.com/lipan/) 本篇主要介绍一下ExtJs对JS基本语法的扩展支持,包括动态加载.类的封装等. 一.动态引 ...

  10. stl vector 类

    目录 [-]说明构造方法例子vector 类中定义了4中种构造函数: · 默认构造函数,构造一个初始长度为0的空向量,如:vector<int> v1; · 带有单个整形参数的构造函数,此 ...