fescar源码分析-项目简介
前言
开源分布式事务中间件 Fescar 自1月10日上线v0.1版本(项目地址)
在该文篇写时间为止(2019年1月23日),最新版本为v0.1.1。
从CHANGELOG.md
来看,已经实现以下特征:
## 0.1.0 (Jan. 9, 2019)
#### [](https://github.com/alibaba/fescar/blob/v0.1.1/CHANGELOG.md#features)FEATURES:
* support standalone fescar-server. //独立部署的fescar-server
* support mysql automatic transaction.//mysql的AT模式
* support @GlobalTransactional spring annotation. //spring工程通过注解实现全局事务控制
* support dubbo on filter. //dubbo实现filter实现全局事务传递给dubbo的RPC
* support mybatis ORM framework.//支持mybatis框架
* support api&template.//支持JDBC & spring Template
* support dubbo,springcloud,motan ect. //说是使用dubbo,springcloud,motan通讯方式对全局事务的支持,但到目前为此只实现了dubbo。
项目相关的文档,有兴趣的同志可以了解一下:
- 关于fescar项目的简介,可以查看项目概览。
- 项目的部署与测试可以参考该文档
- 关于开源分布式事务中间件Fescar,我们总结了开发者关心的13个问题
- fescar锁设计和隔离级别的理解
术语
TM&RM&Tc.pngTC
: Transaction Coordinator 事务协调器TM
: Transaction Manager 事务管理器RM
: Resource Manager 资源管理器
工程结构分析
下载源码,将工程导入IDE中,会有以下工程:
fescar-project.png
fescar-common 公共组件
基本其它所有组件都会依赖,主要实现了:
com.alibaba.fescar.common //常量
com.alibaba.fescar.common.exception //异常封装
com.alibaba.fescar.common.loader //扩展class加载方式,通过jar包中的/META-INF/下的路径指定的接口实现类进行加载
com.alibaba.fescar.common.thread //线程扩展:线程工厂类的扩展,可以定义线程名称。
com.alibaba.fescar.common.util //工具类:BlobUtils.java;NetUtil.java;StringUtils.java
fescar-config 配置组件
依赖公共组件
,主要实现对工程下application.conf文件的读取与解析,配置文件结构如下:
transport {
# tcp udt unix-domain-socket
type = "TCP"
#NIO NATIVE
server = "NIO"
#enable heartbeat
heartbeat = true
#thread factory for netty
thread-factory {
boss-thread-prefix = "NettyBoss"
worker-thread-prefix = "NettyServerNIOWorker"
server-executor-thread-prefix = "NettyServerBizHandler"
share-boss-worker = false
client-selector-thread-prefix = "NettyClientSelector"
client-selector-thread-size = 1
client-worker-thread-prefix = "NettyClientWorkerThread"
# netty boss thread size,will not be used for UDT
boss-thread-size = 1
#auto default pin or 8
worker-thread-size = 8
}
}
service {
#vgroup->rgroup
vgroup_mapping.my_test_tx_group = "localRgroup"
#only support single node
localRgroup.grouplist = "127.0.0.1:8091"
#degrade current not support
enableDegrade = false
#disable
disable = false
}
client {
async.commit.buffer.limit = 10000
lock {
retry.internal = 10
retry.times = 30
}
}
fescar-core 核心组件
依赖公共组件
和配置组件
,主要实现TC与TM及RM通讯的功能:
com.alibaba.fescar.core.context //上下文的实现,主要是为了在上下文中获取XID
com.alibaba.fescar.core.model //主要定义TM,RM对象模型及状态
com.alibaba.fescar.core.protocol //主要定义通讯对象
com.alibaba.fescar.core.rpc //远程通讯模型及基于netty实现
fescar-tm 事务管理组件
依赖核心组件
包,主要对TM(事务管理)接口的实现。
fescar-rm-datasource 数据源资源管理组件
依赖核心组件
包,主要对数据源AT模式资源管理的实现。由于AT模式实现的原理是在SQL语句执行的时候做拦截,生成相应UNDO的SQL语句,所以该组件中有很多的SQL语句操作的类。
com.alibaba.fescar.rm.datasource.undo.mysql //对应的UNDO操作的MYSQL实现,其它类型的数据源可以针对该包路径下的实现类做扩展。
fescar-dubbo 'fescar对dubbo的支持组件'
依赖 事务管理组件
,该组件当前只有dubbo过滤器(com.alibaba.dubbo.rpc.Filter
)的实现类(com.alibaba.fescar.dubbo.TransactionPropagationFilter
)。该过滤器的功能就是在dubbo发启调用的时候,将事务(XID)传播到dubbo服务中。
if (xid != null) {
RpcContext.getContext().setAttachment(RootContext.KEY_XID, xid); //事务传播
} else {
if (rpcXid != null) {
RootContext.bind(rpcXid);
bind = true;
if (LOGGER.isDebugEnabled()) {
LOGGER.debug("bind[" + rpcXid + "] to RootContext");
}
}
}
try {
return invoker.invoke(invocation);
fescar-server 'fescar服务器'
依赖核心组件
包,主要是对TC的实现。
com.alibaba.fescar.server //实现TC
com.alibaba.fescar.server.lock //实现了资源锁
com.alibaba.fescar.server.session //会话管理,及tm,rm连接在server的会话信息。
com.alibaba.fescar.server.store //对服务端的所持有的状态信息进行持久化,如:将事务信息存储在文件中。
fescar-spring 'fescar对spring的支持组件'
依赖 事务管理组件
,数据源资源管理组件
,fescar对dubbo的支持组件
。
主要实现通过注解@GlobalTransactional
,实现对分布式事务的控制功能。
fescar-test
为方便测试,提供的工具类。
fescar-examples
基于spring及dubbo实现的分布式事务的测试案例。