spring bootSpringSpring Boot

(四)从0开始写框架—V1.0说明文档

2019-02-11  本文已影响183人  LuoHaiPeng

概述

  通过前几章的技术铺垫和思路设计,我们最终把该分布式事务框架实现出来了,但由于以文章的形式很难描述整个写代码的过程,所以我们采取的方式是:先把框架写完,然后大家下载源码,结合说明文档一起阅读的方式了解整个框架。该框架的GitHub地址为:

https://github.com/luohaipeng/rmdt

  该框架取名为:RMDT,意思其实是:可靠消息分布式事务(Reliable Message Distributed Transaction)的英文首字母简写。

技术选型

开发工具

框架

中间件

其他工具

补充说明
  对于技术选型有几点需要说明的,第一点是:该框架直接使用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。

项目模块
我们来看看每个模块的作用:

功能演示说明

  我们可以运行框架中的demo项目,了解框架的功能效果。但在运行前,先简单解析一下这个demo项目的业务(注意:demo只是模拟业务需求,并发真实逻辑):客户端发起RPC请求,调用远程订单系统中的付款方法makePayment。在makePayment方法中有两个操作:分别是发送两个RPC请求,调用远程会员系统的付款方法payment,和远程商品系统的扣库存方法decrease,在这个模拟的业务需求中,我们可以测试出分布式事务的问题,因为payment和decrease分别做付款和扣库存的操作,这两个操作是同一个事务的,要么两个都成功,要么两个都失败,但是由于现在的架构是分布式应用,他们各自都运行在自己的JVM中,这就不能确保事务一致性了。而使用了RMDT框架后,就能确保分布式事务的一致性了,实现原理在之前的分析文章中已经讲过了,这里就不再提及。那么接下来,我们来启动demo项目。

使用说明

  功能效果刚刚已经看到了,那接下来看看如何使用。RMDT框架使用起来比较简单,我们还是通过内置的demo项目来看看框架的使用。

扩展说明

  框架中的事务日志存储组件使用的是JDBC操作mysql,而MQ消息组件使用的是ActiveMQ,但框架中并没有硬编码的写死这些实现,而是以SPI的方式动态扩展,尽量做到黑盒扩展,而不是白盒修改。具体看以下扩展说明:

事务日志存储组件扩展

1、创建一个配置Bean类,继承框架的BaseRepositoryConfig,给该类添加存储技术需要的属性,比如连接地址,用户名、密码和连接池大小等。
2、创建一个类,实现事务日志存储组件SPI(RmdtTransactionRepository),该实现类需要自己写代码,实现数存储。
3、然后在resources/META-INF目录下,创建services子目录,在services目录中新建名为org.rmdt.core.repository.RmdtTransactionRepository的文本文件。
4、该文件内容为实现了RmdtTransactionRepository接口的类全限定名。
5、在初始化配置类RmdtConfig中,设置repositoryName的值为实现类中,与getRepositoryName方法返回值相同的字符串。并且new出自定义的BaseRepositoryConfig子类配置对象,设置好RmdtTransactionRepository实现类需要的相关属性。
具体操作如下:

MQ消息组件扩展

MQ消息组件扩展的方式与事务日志存储组件扩展的方式是一样的,这里就不详细说明了,类比学习即可。

架构说明

总体执行流程
流程图说明:
上一篇下一篇

猜你喜欢

热点阅读