seata學(xué)習(xí)-數(shù)據(jù)源代理
代理的動(dòng)機(jī)
AT 模式下
- 執(zhí)行 undo-log 回滾日志
代理的是 DateSource 這個(gè)類
手動(dòng)代理
即手動(dòng)注入一個(gè)DataSourceProxy,如下
@Bean
public DataSource druidDataSource() {
return new DruidDataSource()
}
// 這里會(huì)返回名字為 "dataSource" 的 Bean, 這里
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource) {
return new DataSourceProxy(druidDataSource);
}
即使在生成這個(gè)類的時(shí)候,手動(dòng)返回一個(gè) proxy
自動(dòng)代理
針對(duì)DataSource創(chuàng)建一個(gè)代理類,在代理類里面基于DataSource獲取DataSourceProxy(如果沒有就創(chuàng)建),然后調(diào)用DataSourceProxy的相關(guān)方法。核心邏輯在SeataAutoDataSourceProxyCreator中
public class SeataAutoDataSourceProxyCreator extends AbstractAutoProxyCreator {
...
}
其中 AbstractAutoProxyCreator 來(lái)自 spring-aop 包
其他 : 自動(dòng)代理是如何調(diào)用的呢 ?
本人的項(xiàng)目是 spring cloud 的依賴如下
<!-- 阿里相關(guān)依賴 -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<exclusions>
<exclusion>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
</exclusion>
</exclusions>
</dependency>
這里使用的 seata 版本是 1.7 , 之前用 1.6 以及 1.4 有很多 bug , 從官網(wǎng)可以看到 1.7作為一個(gè)大版本更新 ,更新了很多bug提升了性能.
回到上面的問題 : 自動(dòng)代理是如何調(diào)用的呢 ?
即是 SeataAutoDataSourceProxyCreator 是如何給調(diào)用的呢 ? 在 seata-spring-boot-starter 這里依賴?yán)锩嬗幸粋€(gè) SeataDataSourceAutoConfiguration , 該類將會(huì)引入 SeataAutoDataSourceProxyCreator 完成代理 .
@ConditionalOnBean({DataSource.class})
@ConditionalOnExpression("${seata.enabled:true} && ${seata.enableAutoDataSourceProxy:true} && ${seata.enable-auto-data-source-proxy:true}")
@AutoConfigureOrder(2147483647)
@AutoConfigureAfter(
value = {SeataCoreAutoConfiguration.class},
name = {"org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration"}
)
public class SeataDataSourceAutoConfiguration {
public SeataDataSourceAutoConfiguration() {
}
// 這里注入的
@Bean({"seataAutoDataSourceProxyCreator"})
@ConditionalOnMissingBean({SeataAutoDataSourceProxyCreator.class})
public static SeataAutoDataSourceProxyCreator seataAutoDataSourceProxyCreator(SeataProperties seataProperties) {
return new SeataAutoDataSourceProxyCreator(seataProperties.isUseJdkProxy(), seataProperties.getExcludesForAutoProxying(), seataProperties.getDataSourceProxyMode());
}
}
參考資料
- 數(shù)據(jù)源代理 數(shù)據(jù)源代理 (這篇文件對(duì)理解 AT 模式非常有幫助 )

浙公網(wǎng)安備 33010602011771號(hào)