LCN 分布式事务框架

1、LCN 框架的由来

在设计框架之初的1.0 ~ 2.0的版本时,框架设计的步骤是如下的,各取其首字母得来的LCN命名:

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

2、LCN 框架相关资料

tx-lcn 官方地址:https://www.txlcn.org/
tx-lcn Github地址:https://github.com/codingapi/tx-lcn
tx-lcn 服务下载地址:https://pan.baidu.com/s/1cLKAeE#list/path=%2F
tx-lcn 服务源码地址:https://github.com/codingapi/tx-lcn/tree/master/tx-manager

3、LCN 框架核心执行步骤

创建事务组:
是指在事务发起方开始执行业务代码之前先调用 TxManager 创建事务组对象,然后拿到事务标示GroupId的过程。

添加事务组:
添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给 TxManager 的操作。

关闭事务组:
是指在发起方执行完业务代码以后,将发起方执行结果状态通知给 TxManager 的动作。当执行完关闭事务组的方法以后, TxManager 将根据事务组信息来通知相应的参与模块提交或回滚事务。

4、LCN应用

4.1、搭建 tx-manager 服务

LCN 是通过一个独立的微服务 tx-manager 作为分布式事务控制服务端(事务协调器)。需要执行分布式事务控制的微服务应用都通过远程服务调用的方式,在 tx-manager 上标记事务组,在执行事务处理后,将本地事务状态发送到 tx-manager 中对应的事务组上,tx-manager 会根据具体的状态来通知相应的微服务应用提交或回滚。

tx-manager 也是使用 Spring Cloud 开发的一个微服务应用,在搭建过程上是非常简单的。
下载 tx-manager 事务协调器zip压缩包:
https://pan.baidu.com/s/1cLKAeE#list/path=%2F

压缩包解压后内容如下:
在这里插入图片描述

修改 application.properties 配置文件,提供本地微服务应用的 Eureka 注册中心配置、redis配置。其中redis是事务协调器在处理事务组时使用的临时存储。

##########################txmanager-start#######################
#服务端口
server.port=8899

#tx-manager不得修改
spring.application.name=tx-manager

spring.mvc.static-path-pattern=/**
spring.resources.static-locations=classpath:/static/
###########################txmanager-end#######################

#eureka 地址
eureka.client.service-url.defaultZone=http://127.0.0.1:8761/eureka/
eureka.instance.prefer-ip-address=true

#############################redis-start#########################
##redis 单点环境配置
#redis
spring.redis.database=0
spring.redis.timeout=0
spring.redis.host=192.168.1.136
spring.redis.port=6379
spring.redis.pool.max-active=100
spring.redis.pool.max-wait=3000
spring.redis.pool.max-idle=200
spring.redis.pool.min-idle=50
spring.redis.pool.timeout=600
##############################redis-end##########################

###############################LCN-start########################
tm.transaction.netty.delaytime = 5
tm.transaction.netty.hearttime = 15
tm.redis.savemaxtime=30
tm.socket.port=9999
tm.socket.maxconnection=100
tm.compensate.auto=false
tm.compensate.notifyUrl=http://ip:port/path
tm.compensate.tryTime=30
tm.compensate.maxWaitTime=5000

logging.level.com.codingapi=debug

将修改后的 application.properties 配置文件打包到 tx-manager-x.x.x.jar 中,替代jar中原有的默认配置文件。

使用命令: java -jar tx-manager-x.x.x.jar 启动微服务。
测试tx-manager事务协调器是否启动成功可以访问 http://ip:8899/ 。如下结果代表事务协调器启动成功:

在这里插入图片描述

4.2、在微服务中使用LCN实现分布式事务管理

在所有需要处理分布式事务的微服务中增加下述依赖:为统一资源版本,使用 properties 统一管理版本信息。

<properties>
	<lcn.last.version>4.1.0</lcn.last.version>
</properties>

<dependencies>

	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>transaction-springcloud</artifactId>
		<version>${lcn.last.version}</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

	<dependency>
		<groupId>com.codingapi</groupId>
		<artifactId>tx-plugins-db</artifactId>
		<version>${lcn.last.version}</version>
		<exclusions>
			<exclusion>
				<groupId>org.slf4j</groupId>
				<artifactId>*</artifactId>
			</exclusion>
		</exclusions>
	</dependency>

</dependencies>

在全局配置文件中增加下述配置:

# 定义事务协调器所在位置。根据具体环境定义其中的IP地址和端口。
tm.manager.url=http://127.0.0.1:8899/tx/manager/

使用LCN做分布式事务管理时,微服务应用内必须提供一个用于获取 txUrl( txUrl就是全局配置文件中定义的 tm.manager.url )的类型实现,这个类可以使用独立应用定义,在微服务应用中引入。

本案例中为了方便,直接在所有的微服务应用中提供对应代码实现。具体如下:

@Service
public class TxManagerTxUrlServiceImpl implements TxManagerTxUrlService {

	@Value("${tm.manager.url}")
	private String url;

	@Override
	public String getTxUrl() {
		return url;
	}
}

在分布式事务管理代码中增加注解 @TxTransaction 。在业务调用方增加的注解需要属性isStart=true 。而被调用方则不需要定义任何的注解属性。

如:交易服务调用了订单服务,那么交易服务中代码:

@TxTransaction(isStart=true)
@Transactional
public void trade() {
    //本地调用
    tradeDao.save();
    //远程调用方
    orderService.order();
}

订单服务中代码:

@Transactional
@TxTransaction
public void order() {
    //本地调用
    orderDao.save();
}

猜你喜欢

转载自blog.csdn.net/xiaojin21cen/article/details/86497258