ByteTCC 源码分析 - 核心组件

362 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天

ByteTCC Quick Start

User Guide 0.4.x

  1. LocalXADataSource
  2. @Compensable注解
  3. @Import(SpringCloudConfiguration.class)
  4. @ImportResource({ "classpath:bytetcc-supports-springcloud.xml" })

LocalXADataSource封装底层的数据源,捕获在一个分布式事务中对哪些数据库执行了哪些SQL操作。

在分布式事务中操作的各个库,都要创建一个bytejta表,LocalXADataSource记录分布式事务中执行的各个SQL语句,记录一下状态,插入到底层的各个库的bytejta表中,记录分布式事务的状态。

@Compensable将每个接口定义成tcc接口

@Import和@ImportResource定义ByteTCC的Bean以及组件,在系统启动的时候bean和组件就会开始工作。

CompensableFeignBeanPostProcessor,实现BeanPostProcessor接口,处理feign里面的FeignInvocationHandler。针对feign的一个bean,创建了一个自己的动态代理,然后自己的动态代理就可以去拦截spring cloud底层对feign的一些执行和机制,可以在你执行feign进行接口调用的时候,干一些事情。

如果是使用了hystrix之后,会拦截hytrixInvocationHandler,创建自己的动态代理拦截相关的bean的调用

在SpringCloudConfiguration里面是对spring cloud原生的一些组件,比如说feign执行过程中涉及到的一些bean组件创建了自己的动态代理以及拦截器,可以在spring cloud进行服务调用的时候,进行一些自己的特殊的处理。

组件分类:

BeanFactoryPostProcessor
    校验、注入
Work
    定时任务
HandlerInterceptor
    ByteTCC 拦截器
Controller
    ByteTCC web请求
MethodInterceptor
    ByteTCC 方法拦截器

SpringCloudConfiguration

public class SpringCloudConfiguration extends WebMvcConfigurerAdapter implements BeanFactoryPostProcessor, InitializingBean,
      CompensableEndpointAware, EnvironmentAware, ApplicationContextAware {

}

bytetcc-supports-springcloud.xml

bytetcc-disable-tx-advice.xml

TransactionConfigPostProcessor

CompensableAnnotationValidator

校验 try/confirm/cancel 类定义的TCC方法。 SimplifiedCompensable: DeclaredRemotingException:校验不能声明RemotingException TransactionalPropagation:校验异常传播机制必须是存在事务 TransactionalRollbackFor:校验事务回滚异常必须包含方法签名异常

// @Compensable
this.validateSimplifiedCompensable(method, clazz);
this.validateDeclaredRemotingException(method, clazz);
this.validateTransactionalPropagation(method, clazz);
String confirmableKey = compensable.confirmableKey();
String cancellableKey = compensable.cancellableKey();

this.validateDeclaredRemotingException(method, clazz);
this.validateTransactionalPropagation(method, clazz);
this.validateTransactionalRollbackFor(method, clazz, confirmableKey);

CompensableContextPostProcessor

处理CompensableContextAware的BeanFactoryPostProcessor

SpringCloudEndpointPostProcessor

处理SpringCloudEndpoint的BeanFactoryPostProcessor

TransactionDebuggablePostProcessor

CompensableBeanPostProcessor

CompensableFeignBeanPostProcessor

ManagedConnectionFactoryPostProcessor

XADataSource --> LocalXADataSource
XAConnectionFactory
ManagedConnectionFactory

ManagedConnectionFactoryHandler & InvocationHandler
classDiagram
class XADataSource

class XAConnectionFactory

class ManagedConnectionFactory

class InvocationHandler
class ManagedConnectionFactoryHandler
ManagedConnectionFactoryHandler:+delegate Object
ManagedConnectionFactoryHandler:+identifier String

InvocationHandler <|.. ManagedConnectionFactoryHandler : 动态代理

ManagedConnectionFactoryHandler <-- XADataSource : delegate
ManagedConnectionFactoryHandler <-- XAConnectionFactory : delegate
ManagedConnectionFactoryHandler <-- ManagedConnectionFactory : delegate

ResourceAdapterImpl & ResourceAdapter

总结:

1. 扫描@Compensable
2. LocalXADataSource动态代理

ResourceAdapterImpl & ResourceAdapter

负责运行后台线程任务的组件

SimpleWorkManager

CompensableWork & Work

后台线程

系统启动恢复事务

系统运行期间定时尝试恢复事务

CleanupWork & Work

后台线程

系统运行期间定时尝试清除已完成的ByteTCC相关的分布式事务数据

SampleCompensableLogger & Work

CompensableCoordinatorController

ByteTCC框架的Controller,提供prepare、commit、rollback、recover、forget等接口。

CompensableFeignBeanPostProcessor

CompensableFeignHandler

封装feign原生的InvocationHandler(feign.ReflectiveFeign$FeignInvocationHandler),所有对@FeignClient接口的调用,首先都会先进入ByteTCC框架扩展的Feign处理逻辑中。

处理Ribbon负责均衡相关问题

CompensableHandlerInterceptor & org.springframework.web.servlet.HandlerInterceptor

MVC拦截器:获取并解析请求头的HEADER_TRANCACTION_KEY值,维护一个分布式事务。

CompensableMethodInterceptor & org.aopalliance.intercept.MethodInterceptor

解析目标Controller的@Compensable注解、@Transactional注解及其他信息

TransactionInterceptor & TransactionAspectSupport & MethodInterceptor

事务处理流程正式开始。。。。。

================================================================

音之呼吸 - 十一之型 - 华丽的结束了 ----------------------------------

================================================================