技术杂谈

fescar源码分析-项目简介

2019-01-23  本文已影响103人  do_young

前言

开源分布式事务中间件 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。

项目相关的文档,有兴趣的同志可以了解一下:

术语

TM&RM&Tc.png
TC : 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实现的分布式事务的测试案例。

上一篇下一篇

猜你喜欢

热点阅读