基于Dubbo的分布式事务框架(LCN)
原文地址:http://原文地址:https://github.com/1991wangliang/transaction
基于Dubbo的分布式事务框架(LCN)
该框架依赖Redis/dubbo/txManager服务。依赖第三方框架lorne_core
原理与功能
基于对spring tx PlatformTransactionManager的本地模块事务控制从而达到全局控制事务的目的。该框架兼容任何依赖PlatformTransactionManager的DB框架。利用三阶段提交的方式来确保事务的一致性,支持本地事务和分布式事务框架共存,当方法进入的是本地事务方法,框架将不做任何分布式事务处理。当需要用到分布式事务的时候只需要在方法上添加分布式事务的注解即可。框架由于基于Spring本地事务做的封装,基本支持依赖spring的所有db框架。并在帖子底部提供了对springjdbc/hibernate/mybatis的演示demo。
该框架在设计时就考虑到大型分布式的应用场景,因此框架支持对于dubbo单个模块的集群化。并且TxManager也支持集群化。
框架基于三阶段提交:
锁定事务单元
确认事务模块状态
通知事务
关于LCN框架的详细设计请见txManager说明
框架使用教程
需要先部署redis服务。
部署TxManager全局事务协调管理器。
本地项目依赖transaction库.
maven仓库地址
<repositories>
<repository>
<id>lorne</id>
<url>https://1991wangliang.github.io/repository</url>
</repository>
</repositories>
maven transaction 配置
<dependency>
<groupId>com.lorne.tx</groupId>
<artifactId>transaction</artifactId>
<version>1.0.0.RELEASE</version>
</dependency>
配置dubbo服务
<dubbo:application name="tx-transaction-test" />
<!--所有参与分布式事务的模块以及TxManager都必须要在同一个服务下-->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" />
<!--依赖TxManager服务-->
<dubbo:reference timeout="3000" interface="com.lorne.tx.mq.service.MQTxManagerService" id="managerService" />
<dubbo:protocol accesslog="true" name="dubbo" port="20882" />
<!--所有需要分布式事务的模块也都必须对外提供服务-->
<!--1. 用户自定义的服务-->
<dubbo:service interface="com.demo.service.MQTestService" ref="testService" />
<bean id="testService" class="com.demo.service.impl.MQTestServiceImpl" />
<!--2. 当用户没有需要对外提供的服务时-->
<!--<dubbo:service interface="com.lorne.tx.mq.service.MQTransactionService" ref="transactionService" />-->
<!--<bean id="transactionService" class="com.lorne.tx.mq.service.impl.MQTransactionServiceImpl" />-->
若用户是自定义的服务,则服务必须要实现MQTransactionService接口如下:
public interface MQTestService extends MQTransactionService{
String test(String name);
}
MQTransactionService的实现:第一种方式
@Service
public class MQTestServiceImpl extends MQTransactionServiceImpl implements MQTestService {
@Override
public String test(String name) {
//todo 用户业务处理
return "";
}
}
MQTransactionService的实现:第二种方式
@Service
public class MQTestServiceImpl implements MQTestService {
@Autowired
private MQTransactionService transactionService;
@Override
public boolean notify(String kid, boolean state) {
return transactionService.notify(kid, state);
}
@Override
public boolean checkRollback(String kid) {
return transactionService.checkRollback(kid);
}
@Override
public String test(String name) {
//todo 用户业务处理
return "";
}
}
分布式事务的切面配置
<!--本地事务manager -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!--本地事务切面 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
<!--切面 advice 定义-->
<tx:advice id="txAdvice">
<tx:attributes>
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true"/>
<tx:method name="load*" read-only="true"/>
<tx:method name="query*" read-only="true"/>
<tx:method name="select*" read-only="true"/>
<tx:method name="*" rollback-for="com.le.core.framework.exception.LEException"/>
</tx:attributes>
</tx:advice>
<!--分布式事务拦截器-->
<bean id="txTransactionInterceptor" class="com.lorne.tx.interceptor.TxManagerInterceptor"/>
<aop:config>
<aop:pointcut id="allManagerMethod" expression="execution(* com.**.service.impl.*Impl.*(..))"/>
<!--本地事务拦截-->
<aop:advisor order="100" advice-ref="txAdvice" pointcut-ref="allManagerMethod"/>
<!--分布式事务拦截-->
<aop:advisor order="10" advice-ref="txTransactionInterceptor" pointcut-ref="allManagerMethod"/>
</aop:config>
分布式事务注解(@TxTransaction)
@Override
@TxTransaction
public String test() {
//todo 业务处理
return "";
}
关于@TxTransaction的补充说明: 当添加事务注解时方法将开启分布式事务处理方式。当尽当开始方法是分布式事务方法时才进入分布式事务处理逻辑。 若存在业务方法A调用了业务方法B,当分布式事务注解添加在A上,那么整个A方法将被分布式事务所管理,若注解添加在B上,当调用A时将不会被启用分布式事务,尽当业务启动时的方法添加分布式事务注解时方可开启分布式事务注解。
演示demo:
spring-jdbc版本: transaction_demo1 transaction_demo2
transaction_demo1是发起方,transaction_demo2是被调用方。
hibernate版本:
transaction_hibernate_demo1 transaction_hibernate_demo2
transaction_hibernate_demo1是发起方,transaction_hibernate_demo2是被调用方。
mybatis版本:
transaction_mybatis_demo1 transaction_mybatis_demo2
transaction_mybatis_demo1是发起方,transaction_mybatis_demo2是被调用方。
参考更多免费教程请加入Dubbo技术交流:548209960
Java高并发高可用架构:632103578
基于Dubbo的分布式事务框架(LCN)的更多相关文章
- tcc分布式事务框架解析
前言碎语 楼主之前推荐过2pc的分布式事务框架LCN.今天来详细聊聊TCC事务协议. 2pc实现:https://github.com/codingapi/tx-lcn tcc实现:https://g ...
- 终于跑通分布式事务框架tcc-transaction的示例项目
1.背景 前段时间在看项目代码的时候,发现有些接口的流程比较长,在各个服务里面都有通过数据库事务保证数据的一致性,但是在上游的controller层并没有对一致性做保证. 网上查了下,还没找到基于Go ...
- TX-LCN 分布式事务框架
第十章 TX-LCN 分布式事务框架 (Spring Cloud 高级) 一. 什么是分布式事务 分布式事务是指事务的参与者.支持事务的服务器.资源服务器以及事务管理器分别位 于不同的分布式系统的不同 ...
- 分布式事务框架-Litx补偿事务框架源码解析
前言 之前某段时间在研究分布式事务过程中,对实现原理比较好奇,于是去Gitee上找了几个人气比较高的框架进行学习,其中印象深刻的有Litx,因为Litx源码不多,且都是基于Spring和Dubbo底层 ...
- 基于dubbo的分布式项目实例应用
本文主要学习dubbo服务的启动检查.集群容错.服务均衡.线程模型.直连提供者.只定阅.只注册等知识点,希望通过实例演示进一步理解和掌握这些知识点. 启动检查 Dubbo缺省会在启动消费者时检查依赖的 ...
- 基于 dubbo 的分布式架构
前言 现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一个趋势,就这个点再凭借之前的 SSM 项目来让第一次接触的同学能快速上手. 浅谈分布式架构 分布式架构单看这个名字 ...
- 分布式事务、多数据源、分库分表中间件之spring boot基于Atomikos+XADataSource分布式事务配置(100%纯动态)
本文描述spring boot基于Atomikos+DruidXADataSource分布式事务配置(100%纯动态),也就是增加.减少数据源只需要修改application.properties文件 ...
- 分布式事务框架&解决方案参考
两种开源解决方案框架介绍: https://blog.csdn.net/zyndev/article/details/79604395#_97 LCN: https://www.jianshu.com ...
- Dubbo 支持分布式事务吗?
目前暂时不支持,可与通过 tcc-transaction 框架实现 介绍:tcc-transaction 是开源的 TCC 补偿性分布式事务框架 Git 地址:https://github.com/c ...
随机推荐
- win10 64位下装Virtual Box安装Linux(centOS)配置联网
第一步:安装VritualBox 百度"VritualBox"下载安装即可: 第二步:下载Linux镜像系统并安装 这里写出我参照的博客,很详细,我就不累赘了! 原文地址:http ...
- 用ajax判断用户是否已存在?----2017-05-12
首先在用ajax之前,先说一下JSON: JSON:javascript object notation js对象标记 对于json,我们只需要知道如何定义json?如何输出?怎么遍历? 1.定义 ...
- linux防火墙基本操作
1.查看防火墙运行状态 # firewall-cmd --state 或者 # systemctl status firewalld.service .关闭防火墙 # systemctl stop f ...
- 一分钟应对勒索病毒WannaCry
一.WannaCry 勒索病毒 勒索病毒WannaCry肆虐全球,利用Windows操作系统漏洞,因链式反应迅猛自动传播,校园电脑.个人电脑.政府机关都是重灾区.中毒电脑所有文档被加密,将被勒索高达3 ...
- 1.Tsung介绍(翻译)
1.介绍 1.1什么是Tsung? Tsung(以前是IDX-Tsunami)是一种分布式负载测试工具.它是基于协议的,并且通常被用于压测HTTP, WebDAV, SOAP, PostgreSQL, ...
- 重新绑定ItemsSource先设置ItemsSource = null;的原因
即报错信息为:在使用 ItemsSource 之前,项集合必须为空. 原因:Items和ItemSource,只能有一个生效,想用其中一个,另一个必须是空. 重新绑定ItemSource,虽然 ...
- [原创]Nexus5 内核编译烧录过程记录
参考Android系统源代码情况分析第二章进行实践,为了提高效率,也为了增加实践机会,使用Nexus5进行内核编译.需要说明的是,Android源代码工程默认是不包含它所使用的Linux内核源码,如果 ...
- 无锁atomicInteger
AtomicInteger可以保证硬件上的原子操作 1.主要原理 CAS操作 在进行数据更新的时候,会进行与内存中的地址进行比较,若预期值与内存中的值相同,则进行数据上的更新,若值不同,则更新失败, ...
- struts2.1.6教程四、OGNL与ValueStack(VS)
1.值栈入门 下面我们建立struts2ognl项目来练习ognl的使用. 步骤一.搭建strust2的开发环境 步骤二.建立LoginAction,主要代码如下: package com.asm; ...
- Centos7下安装部署MXNET
Centos下安装MXNET,参考官方文档http://mxnet.io/get_started/setup.html#prerequisites, 一.安装python的mxnet步骤如下: #!/ ...