无法启动分布式事务_LCN 分布式事务框架tx-lcn

入门

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

385a3b8f5dc451e80c3204a1d55c4c85.png

CAP定律

这个定理的内容是指的是在一个分布式系统中、Consistency(一致性)、 Availability(可用性)、Partition tolerance(分区容错性),三者不可得兼。

一致性(C)

在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访问同一份最新的数据副本)

可用性(A)

在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据更新具备高可用性)

分区容错性(P)

以实际效果而言,分区相当于对通信的时限要求。系统如果不能在时限内达成数据一致性,就意味着发生了分区的情况,必须就当前操作在C和A之间做出选择。

BASE理论

BASE是Basically Available(基本可用)、Soft state(软状态)和 Eventually consistent(最终一致性)三个短语的缩写。BASE理论是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结, 是基于CAP定理逐步演化而来的。BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。

基本可用

基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性----注意,这绝不等价于系统不可用。比如:

(1)响应时间上的损失。正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障,查询结果的响应时间增加了1~2秒

(2)系统功能上的损失:正常情况下,在一个电子商务网站上进行购物的时候,消费者几乎能够顺利完成每一笔订单,但是在一些节日大促购物高峰的时候,由于消费者的购物行为激增,为了保护购物系统的稳定性,部分消费者可能会被引导到一个降级页面

软状态

软状态指允许系统中的数据存在中间状态,并认为该中间状态的存在不会影响系统的整体可用性,即允许系统在不同节点的数据副本之间进行数据同步的过程存在延时

最终一致性

最终一致性强调的是所有的数据副本,在经过一段时间的同步之后,最终都能够达到一个一致的状态。因此,最终一致性的本质是需要系统保证最终数据能够达到一致,而不需要实时保证系统数据的强一致性。

框架定位

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

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

解决方案

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

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

958b2f1a0bb3906c280ffc5d31d501b4.png

方案:

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

快速开始

说明

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

本教程带领大家了解框架的基本步骤,详细配置可参考 dubbo springcloud

一、TM配置与启动

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-managerserver.port=7970spring.datasource.driver-class-name=com.mysql.jdbc.Driverspring.datasource.url=jdbc:mysql://127.0.0.1:3306/tx-manager?characterEncoding=UTF-8spring.datasource.username=rootspring.datasource.password=rootmybatis.configuration.map-underscore-to-camel-case=truemybatis.configuration.use-generated-keys=true#tx-lcn.logger.enabled=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# 开启日志#tx-lcn.logger.enabled=true#logging.level.com.codingapi=debug#redis 主机#spring.redis.host=127.0.0.1#redis 端口#spring.redis.port=6379#redis 密码#spring.redis.password=
  • # 给出信息都是默认值
  • 关于详细配置说明见TM配置
  • application.properties 加载顺序如下:
  • 0、命令行启动参数指定
  • 1、file:./config/(当前jar目录下的config目录)
  • 2、file:./(当前jar目录)
  • 3、classpath:/config/(classpath下的config目录)
  • 4、classpath:/(classpath根目录)
  • 发布的二进制可执行Jar包含一个默认配置文件(也就是4),可按需要覆盖默认配置
  • 手动编译TM,简单指引
# git clone https://github.com/codingapi/tx-lcn.git & cd txlcn-tm# mvn clean package '-Dmaven.test.skip=true'

target文件夹下,即为TM executable jar.

二、TC微服务模块

微服务示例架构

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

TC引入pom依赖

 com.codingapi.txlcn txlcn-tc 5.0.2.RELEASEcom.codingapi.txlcn txlcn-txmsg-netty 5.0.2.RELEASE

TC开启分布式事务注解

在主类上使用@EnableDistributedTransaction

@SpringBootApplication@EnableDistributedTransactionpublic class DemoAApplication { public static void main(String[] args) { SpringApplication.run(DemoDubboClientApplication.class, args); }}

TC微服务A业务方法配置

@Servicepublic class ServiceA {  @Autowired private ValueDao valueDao; //本地db操作  @Autowired private ServiceB serviceB;//远程B模块业务  @LcnTransaction //分布式事务注解 @Transactional //本地事务注解 public String execute(String value) throws BusinessException { // step1. call remote service B String result = serviceB.rpc(value); // (1) // step2. local store operate. DTX commit if save success, rollback if not. valueDao.save(value); // (2) valueDao.saveBackup(value); // (3) return result + " > " + "ok-A"; }}

TC微服务B业务方法配置

@Servicepublic class ServiceB {  @Autowired private ValueDao valueDao; //本地db操作  @LcnTransaction //分布式事务注解 @Transactional //本地事务注解 public String rpc(String value) throws BusinessException { valueDao.save(value); // (4) valueDao.saveBackup(value); // (5) return "ok-B"; }}

TC配置信息说明

# 默认之配置为TM的本机默认端口tx-lcn.client.manager-address=127.0.0.1:8070 

尝试下简单的分布式事务

步骤引导

  1. 阅读快速开始
  2. 准备开发环境 JDK1.8+, Mysql5.6+, Redis3.2+, Consul(SpringCloud), ZooKeeper(Dubbo), Git, Maven
  3. 初始化数据
  4. 启动TxManager(TM)
  5. 配置微服务模块
  6. 启动模块与测试

3. 初始化数据

为了演示方便,我们接下来3个微服务用一个数据库,一张数据表。

  1. 创建MySQL数据库
create database if not exists `txlcn-demo` default charset utf8 collate utf8_general_ci;
  1. 创建数据表
create table `t_demo` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `kid` varchar(45) DEFAULT NULL, `group_id` varchar(64) DEFAULT NULL, `demo_field` varchar(255) DEFAULT NULL, `app_name` varchar(128) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=DYNAMIC;

4. 启动TxManager(TM)

TM启动详情,见快速启动

这里介绍如何在开发环境友好启动TM.

  1. 新建SpringBoot模块
  2. 新增依赖
com.codingapi.txlcn txlcn-tm 5.0.2.RELEASE
  1. 在主类上标注 @EnableTransactionManagerServer
@SpringBootApplication@EnableTransactionManagerServerpublic class TransactionManagerApplication { public static void main(String[] args) { SpringApplication.run(TransactionManagerApplication.class, args); }}
  1. 运行DemoTransactionManager
78b5e6f2d3586c08165798beeb3a1e98.png

5. 配置微服务模块

Dubbo Demo见Dubbo-Demo

SpringCloud Demo见SpringCloud-Demo

6. 启动模块与测试

  1. 正常提交事务
  2. 访问 发起方提供的Rest接口 /txlcn?value=the-value。发现事务全部提交
ae11b9eb8453f37e92c4b3a314289b82.png
  1. 回滚事务
  2. 访问 发起方提供的Rest接口 /txlcn?value=the-value&ex=throw。发现发起方由本地事务回滚,而参与方ServiceB、ServiceC,由于TX-LCN的协调,数据也回滚了。

Dubbo示例

Dubbo 示例说明

共三个模块如下:

DubboServiceA (发起方 | LCN模式)

DubboServiceB (参与方 | TXC模式)

DubboServiceC (参与方 | TCC模式)

代码地址:https://github.com/codingapi/txlcn-demo

一、调用关系说明:

  1. DubboServiceA -> DemoConsumerController的txlcn的Mapping是调用发起方法,代码如下。
@RestControllerpublic class DemoConsumerController { @Autowired private DemoApiService demoApiService; @RequestMapping("/txlcn") public String sayHello(@RequestParam("value") String value, @RequestParam(value = "ex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值