分布式事物

关于LCN分布式事务框架

基于LCN框架解决分布式事务

 

LCN官网 https://www.txlcn.org/

"LCN并不生产事务,LCN只是本地事务的搬运工"

兼容 dubbo、springcloud、motan 框架,支持各种关系型数据库

LCN框架底层实现原理

详细参考: https://github.com/codingapi/tx-lcn/wiki/LCN%E5%8E%9F%E7%90%86

 

 

1.LCN客户端(发起方和参与方都必须要注册到事务协调者中), 建立一个长连接。(长连接 减宽带 但是消耗内存  连接后不断开)

2.订单服务(发起方)调用库存服务接口(参与方)之前,会向TxManager事务协调者创建一个事务的分组id
3.订单服务(发起方)调用库存服务接口(参与方)的时候,会在请求头(底层是HTTP协议,LCN底层重写了Feigin客户端)中存放该事务的分组id,给库存服务

     (TxClient的代理连接池实现了Javax.sql.DataSource接口,并重写了close方法,事务模块在提交关闭后,TxClient连接池将执行‘假关闭’操作,等待TxManager协调完成事务后再关闭连接)
4.如果库存服务获取到请求头中有对应的事务分组id,库存服务业务逻辑代码执行完毕的,会采用假关闭,不会提交该事务

 

微服务里面的服务和服务之间 协调在一起 通过注册中心。

分布式是事务中, 解决事务和事务之间的关系  靠的是类似的平台  TxManager  去协调事务 

 

5.参与方在什么时候提交事务,不能一直不提交。
肯定在发起方 执行成功下。
订单服务(发起方)调用库存服务接口(参与方)之后,如果订单服务(发起方)执行没有问题的下,
订单服务(发起方)使用对应的事务分组id,通知给TxManager事务协调者,让后TxManager事务协调者在根据该事务分组id,通知给所有的参与方提交事务。

 


PS:长连接 好处减少宽带传输 弊端比较占内存。

 

使用LCN很简单 加个注解就OK了  

补充个小知识: RabbitMQ 可以可以跨语言

导入LCN的依赖jar包

 

LCN项目,先搭建 事务协调者:

需要redis,事务分组ID都是缓存到Redis中的

 

 导入TxManager的整合项目,配置

redis 信息:  用于缓存分组ID

 

 

 启动项目的Eureka

然后启动 管理者 TxManager

访问:

 

底层通信的端口号是 999 走的是netty协议

 

 

 整合到项目中去:

  pom.xml

 添加:

复制代码

        <dependency>
            <groupId>com.codingapi</groupId>
            <artifactId>transaction-springcloud</artifactId>
            <version>4.1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>com.codingapi</groupId>
            <artifactId>tx-plugins-db</artifactId>
            <version>4.1.2</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

复制代码

 

 添加到servive实现类的项目 代码pom中

 

同时添加两个实现:

  

 

 同时每个的application.yml中添加:

  

tm: 
  manager: 
     url: http://127.0.0.1:8899/tx/manager/

注册到LCN事务管理者里面

 

代码中:

 

  

这样就OK了

启动Eureka,启动TxManager ,启动order 启动 stock

TxMmanager 的管理界面:

默认5S时间内 参与方没有收到 提交事务的通知  会自动进行回滚

 可以修改源码

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值