分布式事务之TX-LCN

Posted 北漂码农有话说

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了分布式事务之TX-LCN相关的知识,希望对你有一定的参考价值。

分布式事务-Tx-lcn



点击上方蓝字可以订阅哦

Tx-lcn


1. TX-LCN是什么?

TX-LCN 框架在2017年6月份发布第一个版本,从开始的1.0,已经发展到了5.0版本。LCN名称是由早期版本的LCN框架命名,在设计框架之初的1.0 ~ 2.0的版本时框架设计的步骤是如下,各取其首字母得来的LCN命名。

锁定事务单元(lock) 确认事务模块状态(confirm) 通知事务(notify)

5.0以后由于框架兼容了LCN、TCC、TXC三种事务模式,为了避免区分LCN模式,特此将LCN分布式事务改名为TX-LCN分布式事务框架。

2. 框架定位

LCN并不生产事务,LCN只是本地事务的协调工

TX-LCN定位于一款事务协调性框架,框架其本身并不操作事务,而是基于对事务的协调从而达到事务一致性的效果。

3. 解决方案

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

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

方案:

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

4. SpringCloud集成TX-LCN

4.1 TX-LCN模块说明

Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务

4.2 TM 配置与启动

4.2.1 所需配置

jdk1.8+

mysql5.6+

redis3.2+

4.2.2 导入数据库脚本

 
   
   
 
  1. /*

  2. Navicat Premium Data Transfer


  3. Source Server : local

  4. Source Server Type : MySQL

  5. Source Server Version : 100309

  6. Source Host : localhost:3306

  7. Source Schema : tx-manager


  8. Target Server Type : MySQL

  9. Target Server Version : 100309

  10. File Encoding : 65001


  11. Date: 29/12/2018 18:35:59

  12. */

  13. CREATE DATABASE IF NOT EXISTS `tx-manager` DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

  14. USE `tx-manager`;


  15. SET NAMES utf8mb4;

  16. SET FOREIGN_KEY_CHECKS = 0;


  17. -- ----------------------------

  18. -- Table structure for t_tx_exception

  19. -- ----------------------------

  20. DROP TABLE IF EXISTS `t_tx_exception`;

  21. CREATE TABLE `t_tx_exception`(

  22. `id` bigint(20) NOT NULL AUTO_INCREMENT,

  23. `group_id` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

  24. `unit_id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

  25. `mod_id` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL,

  26. `transaction_state` tinyint(4) NULL DEFAULT NULL,

  27. `registrar` tinyint(4) NULL DEFAULT NULL,

  28. `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 待处理 1已处理',

  29. `remark` varchar(10240) NULL DEFAULT NULL COMMENT '备注',

  30. `create_time` datetime(0) NULL DEFAULT NULL,

  31. PRIMARY KEY (`id`) USING BTREE

  32. ) ENGINE = InnoDB AUTO_INCREMENT = 967 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;


  33. SET FOREIGN_KEY_CHECKS = 1;

4.2.3 TM版本下载

https://github.com/codingapi/tx-lcn/releases

4.2.4 源码编译

编辑配置文件/tx-lcn/txlcn-tm/src/main/resources/application.properties如下:

 
   
   
 
  1. spring.application.name=TransactionManager

  2. server.port=7970

  3. spring.datasource.driver-class-name=com.mysql.jdbc.Driver

  4. spring.datasource.url=jdbc:mysql://114.55.34.44:3306/tx-manager?characterEncoding=UTF-8

  5. spring.datasource.username=root

  6. spring.datasource.password=root


  7. #spring.jpa.database-platform=org.hibernate.dialect.MySQL5InnoDBDialect

  8. #spring.jpa.hibernate.ddl-auto=update



  9. mybatis.configuration.map-underscore-to-camel-case=true

  10. mybatis.configuration.use-generated-keys=true


  11. #tx-lcn.logger.enabled=true

  12. # TxManager Host Ip

  13. #tx-lcn.manager.host=127.0.0.1

  14. # TxClient连接请求端口

  15. #tx-lcn.manager.port=8070

  16. # 心跳检测时间(ms)

  17. #tx-lcn.manager.heart-time=15000

  18. # 分布式事务执行总时间

  19. #tx-lcn.manager.dtx-time=30000

  20. #参数延迟删除时间单位ms

  21. #tx-lcn.message.netty.attr-delay-time=10000

  22. #tx-lcn.manager.concurrent-level=128

  23. # 开启日志

  24. #tx-lcn.logger.enabled=true

  25. #logging.level.com.codingapi=debug

  26. #redis 主机

  27. spring.redis.host=114.55.34.44

  28. #redis 端口

  29. spring.redis.port=6379

  30. #redis 密码

  31. spring.redis.password=root

注意:pom.xml文件中添加如下配置,否则无法正常运行

 
   
   
 
  1. <build>

  2. <plugins>

  3. <plugin>

  4. <groupId>org.springframework.boot</groupId>

  5. <artifactId>spring-boot-maven-plugin</artifactId>

  6. </plugin>

  7. </plugins>

  8. </build>

编译:

 
   
   
 
  1. mvn clean package-Dmaven.test.skip=true

编译成功显示如下:

分布式事务-Tx-lcn

4.2.4 启动

 
   
   
 
  1. java -jar txlcn-tm-5.0.2.RELEASE.jar

成功启动,访问 http://127.0.0.1:7970/admin/index.html#/login 默认密码 codingapi

分布式事务-Tx-lcn

4.3 TC 微服务模块

4.3.1 微服务模块

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

4.3.2 引入maven依赖

 
   
   
 
  1. <dependency>

  2. <groupId>com.codingapi.txlcn</groupId>

  3. <artifactId>txlcn-tc</artifactId>

  4. <version>5.0.2.RELEASE</version>

  5. </dependency>


  6. <dependency>

  7. <groupId>com.codingapi.txlcn</groupId>

  8. <artifactId>txlcn-txmsg-netty</artifactId>

  9. <version>5.0.2.RELEASE</version>

  10. </dependency>

4.3.3 TC开启分布式事务注解

在主类上使用@EnableDistributedTransaction

 
   
   
 
  1. @SpringBootApplication

  2. @EnableDistributedTransaction

  3. publicclassDemoAApplication{


  4. publicstaticvoid main(String[] args) {

  5. SpringApplication.run(DemoDubboClientApplication.class, args);

  6. }


  7. }

TC微服务A业务方法配置

 
   
   
 
  1. @Service

  2. publicclassServiceA{


  3. @Autowired

  4. privateValueDao valueDao; //本地db操作


  5. @Autowired

  6. privateServiceB serviceB;//远程B模块业务


  7. @LcnTransaction//分布式事务注解

  8. @Transactional//本地事务注解

  9. publicString execute(String value) throwsBusinessException{

  10. // step1. call remote service B

  11. String result = serviceB.rpc(value); // (1)

  12. // step2. local store operate. DTX commit if save success, rollback if not.

  13. valueDao.save(value); // (2)

  14. valueDao.saveBackup(value); // (3)

  15. return result + " > "+ "ok-A";

  16. }

  17. }

TC微服务B业务方法配置

 
   
   
 
  1. @Service

  2. publicclassServiceB{


  3. @Autowired

  4. privateValueDao valueDao; //本地db操作


  5. @LcnTransaction//分布式事务注解

  6. @Transactional//本地事务注解

  7. publicString rpc(String value) throwsBusinessException{

  8. valueDao.save(value); // (4)

  9. valueDao.saveBackup(value); // (5)

  10. return"ok-B";

  11. }

  12. }

TC配置信息说明 默认之配置为TM的本机默认端口

tx-lcn.client.manager-address=127.0.0.1:8070

4.4 springcloud集成tx-lcn源码

https://github.com/FocusProgram/springcloud-txlcn


·END·

技术精选

专注技术,聚焦科技前沿



以上是关于分布式事务之TX-LCN的主要内容,如果未能解决你的问题,请参考以下文章

浅谈分布式事务与TX-LCN

TX-LCN:分布式事务框架

TX-LCN:分布式事务框架

tx-lcn探险

使用tx-lcn分布式事务框架无法连接远程TM管理服务

你知道什么是分布式事务吗