SpringCloudAlibaba之Seata-2pc源码剖析

seata客户端启动流程

本章大部分是源码,源码下面都会有对其大概意思的介绍,如果源码看着头疼,可以直接看下面的介绍,可以整体对2pc有个轮廓,如果经常阅读源码的朋友,肯定能够想到入口是利用springboot的starter来做客户端相关组件的初始化,立马就能想到starter下META-INFO/spring.factories。# Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=io.seata.spring.boot.autoconfigure.SeataAutoConfiguration

自动启动类:SeataAutoConfiguration

@ComponentScan(    basePackages = {"io.seata.spring.boot.autoconfigure.properties"})@ConditionalOnProperty(    prefix = "seata",    name = {"enabled"},    havingValue = "true",    matchIfMissing = true)@Configuration@EnableConfigurationProperties({SeataProperties.class})public class SeataAutoConfiguration {
      private static final Logger LOGGER = LoggerFactory.getLogger(SeataAutoConfiguration.class);
    public SeataAutoConfiguration() {
      }
    @Bean({"springApplicationContextProvider"})    @ConditionalOnMissingBean(        name = {"springApplicationContextProvider"}    )    public SpringApplicationContextProvider springApplicationContextProvider() {
          return new SpringApplicationContextProvider();    }
    @Bean({"failureHandler"})    @ConditionalOnMissingBean({FailureHandler.class})    public FailureHandler failureHandler() {
          return new DefaultFailureHandlerImpl();    }
    @Bean    @DependsOn({"springApplicationContextProvider", "failureHandler"})    @ConditionalOnMissingBean({GlobalTransactionScanner.class})    public GlobalTransactionScanner globalTransactionScanner(SeataProperties seataProperties, FailureHandler failureHandler) {
          if (LOGGER.isInfoEnabled()) {
              LOGGER.info("Automatically configure Seata");        }
        return new GlobalTransactionScanner(seataProperties.getApplicationId(), seataProperties.getTxServiceGroup(), failureHandler);    }
    @Bean({"seataAutoDataSourceProxyCreator"})    @ConditionalOnProperty(        prefix = "seata",        name = {"enableAutoDataSourceProxy", "enable-auto-data-source-proxy"},        havingValue = "true",        matchIfMissing = true    )    @ConditionalOnMissingBean({SeataAutoDataSourceProxyCreator.class})    public SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {
          return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(), seataProperties.getExcludesForAutoProxying());    }}

从上面的注解@ConditionOnProperties可以看出,seata的starter默认是自动开启,不需要人为在进行配置,如果要关闭seata的默认开启功能,可以这样配置

seata.enabled=false

再来看下注解,配置项相关属性,在上文中我们在配置微服务的时候,指定了事务相关的分组,可以看到下面的属性与之对应,还有一些默认的属性配置。

@EnableConfigurationProperties({SeataProperties.class})

除了属性配置外,可以看到SeataAutoConfiguration还做了一些bean的初始化,其中GlobalTransactionScanner和

SeataAutoDataSourceProxyCreater是我们重点分析的两个类,从字面上看一个是全局事务扫描器,一个是seata的数据源代理的创建者。

public class GlobalTransactionScanner extends AbstractAutoProxyCreator    implements InitializingBean, ApplicationContextAware,    DisposableBean 

可以看到全局事务扫描器的继承关系,其中利用到了spring容器相关组件,初始化Bean、spring上下文注入、销毁Bean和自动代理创建,先来看下spring相关初始化做了什么?​​​​​​​

public void afterPropertiesSet() {
      if (disableGlobalTransaction) {
          if (LOGGER.isInfoEnabled()) {
              LOGGER.info("Global transaction is disabled.");        }        return;    }    initClient();}

还记的我们在介绍Seata的模式中的角色吗?TM、RM和TC,TM是事务管理者:作用是开启事务、提交事务和回滚事务等。RM是资源管理器:也就是对应的微服务的数据源。TC事务协调器:seata-server事务状态管理。​​​​​​​

public class TMClient {
      /**     * Init.     *     * @param applicationId           the application id     * @param transactionServiceGroup the transaction service group     */    public static void init(String applicationId, String transactionServiceGroup) 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山竹之七语

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值