该框架是基于消息队列的分布式事务解决方案.zip
立即下载
资源介绍:
该框架是基于消息队列的分布式事务解决方案.zip
## 概述
该框架是基于消息队列的分布式事务解决方案(Reliable Message Distributed Transaction),框架名简称为RMDT。主要是为了解决分布式应用服务化后,事务不能保持一致性的问题。框架详情和架构设计可查看我的个人博客:
> http://blog.iloveyoubaby.online/space/java?currentPage=1&tag=%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A1
或者简书账号:LuoHaiPeng
码云地址:luohiapeng/rmdt
## 技术选型
**开发工具**
- IDEA
- Maven
- Git
**框架**
- SpringBoot
- Dubbo
- Mybatis
**中间件**
- MySQL
- Zookeeper
- ActiveMQ
**其他工具**
- Lombok
- Disruptor
**补充说明**
对于技术选型有几点需要说明的,第一点是:该框架直接使用Springboot构建,简化了我们构建项目和开发过程。同时使用了Spring IOC,并没有自己实现IOC,虽然这样会对Spring框架强依赖,但是我们要关注的核心是分布式事务,而不是IOC。
第二点是:我们知道,市面上流行的分布式应用框架有很多,比如Dubbo、SpringCloud、Motan等,不同的框架有不同的实现细节,要让我们这个分布式事务框架支持市面上流行的分布式应用框架,那就必须做很多对应的适配工作,而我们时间有限,第一个版本先支持Dubbo,后续有时间再做扩展,或者大家可以贡献适配的代码。
第三点是:Mybatis和Zookeeper并不是框架本身使用的,而是Demo项目使用的,框架本身操作关系型数据库没有依赖任何第三方ORM框架,而是直接使用JDBC操作。至于Zookeeper,就是Demo项目使用Dubbo搭建的一个分布式应用,服务的发现和注册使用Zookeeper中间件。
第四点是:框架本身需要MySQL和ActiveMQ中间件支持,MySQL用于存储事务日志数据,ActiveMQ用于发送事务消息,但是框架内部并没有使用硬编码的方式集成这两个中间件,而是支持动态扩展,换句话说就是:存储事务日志的中间件可以通过配置的方式,切换为任意的存储技术,比如可以切换为Redis、MangoDB等。同理,消息中间件也是可以通过配置切换为常用的RabbitMQ、RocketMQ、Kafka等。具体如何配置看下文。
## 模块说明
整个项目包含以下几个子模块:rmdt-core,rmdt-common, rmdt-annotation,rmdt-dubbo,rmdt-demo。
![项目模块](https://upload-images.jianshu.io/upload_images/10574922-135075f68fe9027f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们来看看每个模块的作用:
- rmdt-core
顾名思义,它就是存放核心代码的模块,整个项目所有处理流程和逻辑类都放到这里。
- rmdt-common
存放一些各个子模块有可能会用到的公共文件,公共类和公共的配置。
- rmdt-annotation
存放注解的模块,我们之前说了,要让别人用起来简单,最好贴个注解就能有对应的功能,所以我们涉及到的注解的定义都放到这里。但实际上,整个项目肯定不可能有很多注解,把这为数不多的注解放到一个模块中,最主要的目的是,别人在使用框架时,可以导入最少依赖。什么意思呢?举个例子:如果是使用Dubbo作为分布式框架,那么肯定会有API这样的子项目,API项目中放的是对外提供服务的接口类,那就有可能我们的注解就需要贴在这些接口类的抽象方法上,而这种API项目是不会有具体实现逻辑的,所以它能用的上的就只有注解,不会使用我们的core、common,这些模块中的类,那这样的话,这个API项目就只导入annotation这个模块的依赖就行了。所以,这就是为什么几个注解类,也要单独放一个模块。
- rmdt-dubbo
我们在之前的设计稿中可以知道,调用远程RPC方法前,需要给RPC地址添加参数,但是每种具体的分布式应用框架传参都是不一样的,比如Dubbo和SpringCloud就有很大的区别,SpringCloud相对来说要简单很多,因为它就是一个RESTful资源路径而已,往该资源路径再追加一个参数很简单,而如果大家对Dubbo的源码有了解的话,就知道往RPC地址加参数,需要做比较多的事情。所以,为了后面框架的扩展,每一种分布式应用框架的支持,都单独创建一个模块,比如,现在我们框架需要支持Dubbo,那么就创建一个rmdt-dubbo的模块,用户存放处理远程方法调用和参数传递的类和文件。同理,如果对框架扩展,让它也能支持SpringCloud,就需要再创建一个rmdt-springcloud的模块。
- rmdt-demo
该模块主要是用于方便测试功能的,其实就是我们经常说的业务项目了,它不是框架的一部分,但为了能让自己开发方便,和别人测试使用方便,就把demo放到了框架中。其中,我们可以看到,rmdt-demo模块下多了7个子模块,对Dubbo项目比较熟悉的小伙伴,应该不用过多的解析了,这7个模块都是业务类的项目,他们分别为:
- rmdt-demo-client
作为服务消费者项目,也就是我们说的客户端。
- rmdt-demo-goods-api和rmdt-demo-goods-server
共同构成商品系统项目,其中api为对外提供的服务接口,server为具体的服务实现。
- rmdt-demo-member-api和rmdt-demo-member-server
共同构成会员系统项目,其中api为对外提供的服务接口,server为具体的服务实现。
- rmdt-demo-order-api和rmdt-demo-order-server
共同构成订单系统项目,其中api为对外提供的服务接口,server为具体的服务实现。
## 功能演示说明
我们可以运行框架中的demo项目,了解框架的功能效果。但在运行前,先简单解析一下这个demo项目的业务(注意:demo只是模拟业务需求,并发真实逻辑):*客户端发起RPC请求,调用远程订单系统中的付款方法makePayment。在makePayment方法中有两个操作:分别是发送两个RPC请求,调用远程会员系统的付款方法payment,和远程商品系统的扣库存方法decrease*,在这个模拟的业务需求中,我们可以测试出分布式事务的问题,因为payment和decrease分别做付款和扣库存的操作,这两个操作是同一个事务的,要么两个都成功,要么两个都失败,但是由于现在的架构是分布式应用,他们各自都运行在自己的JVM中,这就不能确保事务一致性了。而使用了RMDT框架后,就能确保分布式事务的一致性了,**实现原理在之前的分析文章中已经讲过了,这里就不再提及**。那么接下来,我们来启动demo项目。
- 1、导入代码
把GitHub上的该项目clone下来,导入到IDEA或者Eclipse(推荐使用IDEA),稍等片刻,让开发工具把环境build好。
- 2、导入测试数据
项目clone下来后,在rmdt-demo模块中下有3个SQL文件:
![](https://upload-images.jianshu.io/upload_images/10574922-9266fe706c909670.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
在自己本地MySQL服务创建3个数据库rmdt-demo-goods,rmdt-demo-member,rmdt-demo-order,分别是给商品系统,会员系统和订单系统使用,创建好这3个数据库后,把这3个SQL文件分别导入到以上3个数据库中:
![](https://upload-images.jianshu.io/upload_images/10574922-b3f16dbdf7f8f45d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 3、启动zookeeper
由于使用到了zookeeper作为服务发现和注册中心,而配置文件中,连接的zookeeper地址是本地,所以需要在自己本地电脑启动zookeeper服务
![](https://upload-images.jianshu.io/upload_images/10574922-40a70c334d332878.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 4、启动ActiveMQ
ActiveMQ用于发送事务消息,给框架�
资源文件列表:
该框架是基于消息队列的分布式事务解决方案(ReliableMessageDistributedTransaction),框架.zip 大约有220个文件