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)