springcloud整合LCN分布式事务

分布式事务(7):SpringCloud2.0整合LCN 目前LCN版本已经升级为4.0了,但是官方没有SpringCloud2.0的demo案例。因为LCN本身是开源的,有些大神对LCN框架源码做修改,可以支持SpringCloud2.0版本。 阅读详情

开发工具idea、jdk8,redis、maven

首先用idea搭建eureka-server

配置文件:

server.port=8761

eureka.instance.hostname=127.0.0.1
eureka.instance.prefer-ip-address=true

eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false

启动eureka-server

然后下载tx-lcn事务lcn4.1.0下载,选择-sprinfboot2.0.x分支进行下载

项目目录入上图,将该项目整体进行打包安装到maven本地仓库

找到刚下载的项目位置,进入到如图的目录文件夹内,按住ctrl+shift+鼠标右键  选择命令窗口,运行mvn package (maven环境变量要配置,否则找不到命令)这时maven会生成4.2.0版本的lcn

 

创建两个服务A,事务发起方

配置文件如下

eureka.client.serviceUrl.defaultZone= http://127.0.0.1:8761/eureka/
server.port= 8088
spring.application.name=service-hi
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true

spring.thymeleaf.cache=false
spring.thymeleaf.enabled=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20

spring.datasource.maxWait=60000

spring.datasource.timeBetweenEvictionRunsMillis=60000

spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false

spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

spring.datasource.filters=stat,wall,log4j

mybatis.mapper-locations=classpath:mapper/*.xml



#Ribbon的负载均衡策略
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
ribbon.MaxAutoRetriesNextServer=0


#txmanager地址
tm.manager.url=http://127.0.0.1:9010/tx/manager/

logging.level.com.codingapi=debug

tm.manager.url为事务协调者服务的url

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>service1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>service1</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
        <lcn.last.version>4.2.0</lcn.last.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.0.1</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <!--分布式事物-->
        <dependency>
            <groupId>com.codingapi</groupId>
            <artifactId>tx-client</artifactId>
            <version>${lcn.last.version}</version>
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>*</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <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>


        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.1.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

启动类,@EnableFeignClients注解一定要加扫描com.codingapi.tx包,否则因扫描不到jar内的feignclient导致报错

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients(basePackages = {"com.example.service1.client","com.codingapi.tx"})
@MapperScan("com.example.service1.dao")
public class Service1Application {

    public static void main(String[] args) {
        SpringApplication.run(Service1Application.class, args);
    }

}
    @Autowired
    private com.example.service1.client.TbUserService userService;


    /**
     * 通过主键删除数据
     *
     * @param id 主键
     * @return 是否成功
     */
    @TxTransaction(isStart = true)
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean deleteById(String id,String exFlag) {
        int i = tbUserDao.deleteById(id);
        Result del = userService.del("2");
        int a = 1/0;
        return  true;
    }
@FeignClient(value = "service-hi2",fallback = TbUserServiceImpl.class)
public interface TbUserService {

    @RequestMapping(value = "/tbUser/del")
    public Result del(String id);

    @RequestMapping(value = "/tbUser/update")
    public Result update(@RequestBody TbUserDTO userDTO);
}

class TbUserServiceImpl implements TbUserService{

    @Override
    public Result del(String id) {
        return Result.error(10001,"请稍后重试");
    }

    @Override
    public Result update(TbUserDTO userDTO) {
        return Result.error(10001,"请稍后重试");
    }
}

服务B,事务参与方

 

配置文件


eureka.client.serviceUrl.defaultZone= http://127.0.0.1:8761/eureka/
server.port= 8089
spring.application.name=service-hi2
eureka.client.registerWithEureka=true
eureka.client.fetchRegistry=true

feign.hystrix.enabled=true

spring.thymeleaf.cache=false
spring.thymeleaf.enabled=false
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/work?useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456

spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20

spring.datasource.maxWait=60000

spring.datasource.timeBetweenEvictionRunsMillis=60000

spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false

spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

spring.datasource.filters=stat,wall,log4j

mybatis.mapper-locations=classpath:mapper/*.xml


#Ribbon的负载均衡策略
ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
ribbon.MaxAutoRetriesNextServer=0


#txmanager地址
tm.manager.url=http://127.0.0.1:9010/tx/manager/

logging.level.com.codingapi=debug

pom文件同serviceA的pom文件

main方法

@SpringBootApplication
@EnableEurekaClient
@EnableCircuitBreaker
@EnableFeignClients(basePackages = {"com.example.service1.client","com.codingapi.tx"})
@MapperScan("com.example.service2.dao")
public class Service2Application {

    public static void main(String[] args) {
        SpringApplication.run(Service2Application.class, args);
    }

}

feign调用http接口

  /**
     * 删除
     * @param id
     * @return
     */
    @RequestMapping("/del")
    @ResponseBody
    public Result del(String id){
        try {
            tbUserService.deleteById("2");
        }catch (Exception e){
            return  Result.ok(10001,"系统错误");
        }

        return Result.ok();
    }

service:

  */
    @TxTransaction
    @Transactional(rollbackFor = Exception.class)
    @Override
    public boolean deleteById(String id) {
        return tbUserDao.deleteById(id) > 0;
    }

两个服务都配置好了,然后启动事务协调者,第一张图的tx-manager项目,启动成功后可以测试

 结果,成功

两条数据都正常存在 

eureka源码 :git@gitlab.com:boss_along/lcn-eureka.git

serviceA服务发起方git@gitlab.com:boss_along/lcn-service-a.git

serviceB服务参与方 git@gitlab.com:boss_along/lcn-service-b.git

SpringBoot2.x集成LCN分布式事务 修改LCN4.1.0源码的打成相关的jar包,完美解决LCN4.1.0不支持springBoot2.x的问题。以及修改后的源码 立即下载

相关推荐

springcloud2整合LCN解决分布式事务

基于springboot2整合LCN4.2.0 我自己改了源码 解决了springboot2.0.4与Lcn的冲突 正常运行tx-manager和各个微服务。目前官方是没有整合的,大家下载以后 直接编译打包就行。

spring boot与TX-LCN框架整合实现分布式事务

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

kaijixin的博客 1194

SpringCloud2.0.5集成LCN分布式事物最新解决方案

SpringCloud2.0.5集成LCN分布式事物最新解决方案,内含tx-lcn运行tx-manager,然后运行lcn-cloud2.0我自己写的demo即可跑起来, maven jar包我都已经给打包好了加入到项目中即可应用 亲测不懂可以加我qq问329434396。

分布式事务LCN -- TM (服务端server ) + TC ( 客户端-spring-boot 使用)环境搭建及使用

转载:分布式事务LCN – TM (服务端server ) + TC ( 客户端-spring-boot 使用)环境搭建及使用 ...

明耀的博客 5491

如何设计一个低代码平台

近些年来,低代码发展火热,各种低代码平台如雨后春笋纷纷崛起,这些平台各定位不同,优劣不同,用户的选择空间很大。那么,如果用户想从零开始设计一个低代码平台,该如何做呢?

Jarod_Chou的博客 8256

【异常】Claude Code CLI工具 模型加载异常 /init报错排查与完整解决方案 There‘s an issue with the selected model (glm-5). It

此类跨厂商模型配置报错,核心诱因是API生态的兼容性不匹配。优先使用工具原生支持的模型体系,可快速解决90%以上的同类报错;若需跨厂商使用目标模型,需完成API端点、鉴权密钥、模型ID的全链路适配,确保全流程配置合规,即可完成异常修复。

奶爸的编程之路,也就一周冷个三天 3699

springboot2.0集成lcn5.0.2分布式事务

1、下载lcn源码,并导入eclipse中,记住选择导入为maven项目 git clone git@github.com:codingapi/tx-lcn.git 2、修改application.properties配置文件 spring.application.name=TransactionManager server.port=7970 spring.datasource.dri...

qq_42714869的博客 2596

软件需求规格说明书(SRS)标准模板

《软件需求规格说明书(SRS)框架解析》摘要: 本文档系统阐述了SRS的标准结构,包含7大核心部分:1)引言(目的、背景和术语);2)总体描述(产品定位与用户特征);3)功能需求(模块化功能说明);4)非功能需求(性能、安全等指标);5)接口需求(用户/硬件/软件接口);6)其他技术要求;7)附录(图表与参考资料)。重点突出了功能需求模块的标准化描述模板(FR-01),以及安全需求中的HTTPS通信、SHA-256加密等关键指标。该框架为软件开发提供了明确的需求基准,涵盖从业务背景到技术实现的完整链条,是确

moton2017的博客 2880

SpringBoot集成TX-LCN分布式事务框架

111

HMing的博客 2176

Logstash安装部署

1. 部署及安装所用的用户不能是root。

lmj3732018的博客 4290

OpenClaw人人养虾:发现与传输

客户端需要先"发现"Gateway 的地址和端口,才能建立连接。OpenClaw 支持多种发现(Discovery)和传输(Transport)机制。

王国平的博客 572

基于SpringBoot的分布式事务LCN整合分享

框架介绍 LCN分布式事务框架其本身并不创建事务,而是基于对本地事务的协调从而达到事务一致性的效果 核心步骤 创建事务组 是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。添加事务组 添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息添加通知给TxManager的操作。关闭事务组 是指在发起方执行完业务代码以后,...

数据与算法架构提升之路专栏 6482

STC单片机使用FatFs文件系统读取SD卡指定文件内容

STC单片机使用FatFs文件系统读取SD卡指定文件内容

perseverance51博客 2744

springcloud整合分布式事务LCN

springcloud整合分布式事务LCN 一、创建eureka注册中心 a、pom文件 1 <properties> 2 <java.version>1.8</java.version> 3 <spring-cloud.version>Greenwich.SR2</spring-cloud.version> 4 </properties> 5 6 <d

蓝天 318

COMSOL有限元仿真深度指南:为结构件添加预应变

一、什么是预应力和预应变? 我们知道,结构力学问题中,结构件在外载荷作用下产生变形响应以吸收外载荷做功带来的能量;而在结构内部,整体的受力和变形则是通过固体微元的应力与应变传递的。 对于线弹性材料来说,应力与应变的关系可以线性表达,也即 σ=Dεσ = Dεσ=Dε ;在该式中,无论固体微元的应变程度多大,弹性矩阵DDD都是一个不变的常值。而对于超弹性材料来说,应力与应变的关系则需要通过应变能密度函数WWW来表征(详细参加博客《COMSOL有限元仿真深度指南:超弹性模型有限元分析入门》)。 从上面我们也不难

忘了面孔的Batou 7170

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

springcloud分布式事务_SpringCloud 整合 TX-LCN分布式事务框架

微服务兴起,分布式事务也成为亟需解决的难题,业界解决方案很多,今天介绍一个我目前觉得最好用的TX-LCN。官网地址:http://www.txlcn.org/zh-cn/一、TX-LCN介绍TX-LCN由两大模块组成, TxClient、TxManager,TxClient就是你自己的服务,TxManager作为分布式事务的服务端。事务发起方或者参与反都由TxClient端来控制。ServerA调...

weixin_39635459的博客 882

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

springcloud整合分布式事务框架TX-LCN

springcloud整合分布式事务框架TX-LCN 作者小结:最近一直在搞分布式,整合分布式事务框架LCN遇到一大堆的坑,并且网上文档少之又少,费劲九牛二虎之力终于搞定,特此分享,希望对看到的朋友有所帮助! 搭建springcloud项目 开发环境:jdk1.8、idea2019.3、maven3.6.1 、mysql、redis 请先配置好开发环境 创建maven父工程,命名为 :sp...

华夏指挥官的博客 973

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

SpringCloud 整合 TX-LCN分布式事务框架

微服务兴起,分布式事务也成为亟需解决的难题,业界解决方案很多,今天介绍一个我目前觉得最好用的TX-LCN。 官网地址:http://www.txlcn.org/zh-cn/ 一、TX-LCN介绍 TX-LCN由两大模块组成, TxClient、TxManager,TxClient就是你自己的服务,TxManager作为分布式事务的服务端。事务发起方或者参与反都由TxClient端来控制。 ...

叭嘣的博客 3416

SpringCloud整合LCN分布式事务模式

前提 本文不介绍LCN理论知识,如不清楚,建议先通过文章进行了解,8种常用的分布式事务解决方案详细分析,该文章中有关于LCN模式的简要说明。 快速开始 1、环境准备 环境依赖: JDK1.8+、Mysql5.6+、Redis3.2+ 数据库初始化脚本: 创建数据库名称为:tx-manager,并在此数据库下新建t_tx_exception表。 DROP TABLE IF EXISTS `t_tx_exception`; CREATE TABLE `t_tx_exception` ( `id` bigi

自律使我自由 448

分布式事务-springcloud整合tx-lcn5.0实现分布式事务控制

spring cloud整合tx-lcn5.0实现分布式事务(代码+分析) 基础框架搭建 目录机构如下 代码就不再详细贴上,文章下方有git代码地址,可直接运行 代码地址

意田天的博客 2万+

spring cloud分布式事务 整合LCN5.0

1.应用场景 最近遇到分布式事务问题,首先想到了消息中间件(使用rabbitmq 利用事务和消息确认机制 ) ,还有一种就是今天要说明的LCN ,尤其升级到5.0后 增加了tcc和txc模式,本次使用的模式还是lcn模式。 2.GitHub地址 https://github.com/codingapi/tx-lcn 测试项目模块 3.配置本地tx-manager服务 maven依赖 <...

青尘醉博客 2271

springcloud分布式事务_springcloud整合分布式事务框架LCN

TX-LCN 主要有两个模块,Tx-Client(TC) Tx-Manager(TM). TC作为微服务下的依赖,TM是独立的服务。LCN原理如下 创建事务组是指在事务发起方开始执行业务代码之前先调用TxManager创建事务组对象,然后拿到事务标示GroupId的过程。 加入事务组添加事务组是指参与方在执行完业务方法以后,将该模块的事务信息通知给TxManager的操作。 通知事务组是指在发起方...

weixin_39855658的博客 261

springcloud 整合TX-LCN实现分布式事务

创建一个项目Tm 项目 导包pom <!-- 参照例子引入需要的依赖jar --> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tm</artifactId> <version>5.0.2.RELEASE</version>

astray的博客 1625

SpringCloud分布式事务解决方案 整合 TX-LCN分布式事务框架

第一章 分布式事务介绍 一、什么是分布式事务 分布式事务是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。 举个栗子: 电商系统中的订单系统与库存系统 图中包含了库存和订单两个独立的微服务,每个微服务维护了自己的数据库。 在交易系统的业务逻辑中,一个商品在下单之前需要先调用库存服务,进行扣除库存,再调用订单服务,创建订单记录。 正常情况下,两个数据库各自更新成功,两边数据维持着一致性。如果在非正常情况下,有可能库存的扣减完成了,随后的订单记录却因为某些原

生命不止摸鱼不止 1606
上一篇: springboot项目访问jsp页面报404
下一篇: 如何去掉代码中大量if-else之 多态
spring&fans
博客等级 码龄9年 9粉丝 16原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值