【分布式事务系列】Spring Cloud集成Seata 实现分布式事务(六)

这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战

  • 在spring-cloud-ozx-account、spring-cloud-ozx-repo、spring-cloud-ozx-order三个服务中添加一个配置类SeataAutoConfig,主要实现如下:
  1. 配置数据源代理DataSourceProxy
  2. 初始化GlobalTransactionScanner,装载到Spring IOC容器中。

下面配置类是手动配置完成,GlobalTransactionScanner中的两个参数分别是applicationId(应用名称)和txServiceGroup(事务分组),但是seata-spring-boot-starter主动完成了这些功能,并且Seata自动完成了数据源的代理

@Configuration
@EnableConfigurationProperties({SeataProperties.class})
public class SeataAutoConfig{
    @Autowired
    private DataSourceProperties dataSourceProperties;
    @Autowired
    private ApplicationContext applicationContext;
    @Autowired
    private SeataProperties seataProperties;
    
    public SeataAutoConfig(SeataProperties seataProperties,ApplicationContext applicationContext){
        this.applicationContext=applicationContext;
        this.seataProperties=seataProperties;
    }
    @Bean
    public DruidDataSource druidDataSource(){
       DruidDataSource druidDataSource= new DruidDataSource();
        druidDataSource.setUrl(dataSourceProperties.getUrl());
        druidDataSource.setUsername(dataSourceProperties.getUsername());
        druidDataSource.setPassword(dataSourceProperties.getPassword());
        druidDataSource.setDriverClassName(dataSourceProperties.getDriverClassName());
        return druidDataSource;
    }
    
    @Bean
    public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){
        return new DataSourceProxy(druidDataSource);
    }
    
    @Bean
    public DataSourceTransactionManager transactionManager(DataSourceProxy dataSourceProxy){
        return new DataSourceTransactionManager(dataSourceProxy);
    }
    
    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy) throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:com/ozx/springcloud/seata/orderprovider/mappper/*Mapper.xml"));
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagerTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }
    
    @Bean
   	public GlobalTransactionScanner globalTransactionScanner(){
        String applicationName=this.applicationContext.getEnvironment().getProperty("spring.application.name");
        String txServiceGroup=this.seataProperties.getTxServiceGroup();
        if(StringUtils.isEmpty(txServiceGroup)){
            txServiceGroup= applicationName +"-seata-service-group";
            this.seataProperties.setTxServiceGroup(txServiceGroup);
            
        }
        return new GlobalTransactionScanner(applicaitonName,txServiceGroup);
    }
}
复制代码

注意点:

2.1.1.RELEASE版本的内嵌的seata的版本是0.9.0,所以它无法和seata-spring-boot-starter兼容。

采用自定义配置类SeataAutoConfig,需要在@SpringBootApplication注解内exclude去掉spring-cloud-alibaba-seata内的GlobalTransactionAutoConfiguration,否则两个配置类会产生冲突。

`@SpringBootApplication(exclude=GlobalTransactionAutoConfiguration.class)

spring-cloud-ozx-rest项目配置类如下,它没有关联数据源,所以只需要装载GlobalTransactionScanner,它自动扫描包含GlobalTransactional注解的代码

@EnableConfigurationProperties({SeataProperties.class})
@Configuration
public class SeataAutoConfig{
    @Autowired
	private ApplicationContext applicationContext;
    @Autowired
    private SeataProperties seataProperites;
    
    public SeataAutoConfig(SeataProperties seataProperties,ApplicationContext applicationContext){
        this.seataProperties=seataProperties;
        this.applicationContext=applicationContext;
    }
    
    @Bean
    @Bean
   	public GlobalTransactionScanner globalTransactionScanner(){
        String applicationName=this.applicationContext.getEnvironment().getProperty("spring.application.name");
        String txServiceGroup=this.seataProperties.getTxServiceGroup();
        if(StringUtils.isEmpty(txServiceGroup)){
            txServiceGroup= applicationName +"-seata-service-group";
            this.seataProperties.setTxServiceGroup(txServiceGroup);
            
        }
        return new GlobalTransactionScanner(applicaitonName,txServiceGroup);
    }
}
复制代码

基于Spring Cloud框架集成Seata框架配置完成,由于Spring Cloud没有提供分布式事务处理规范,它不能像配置中心插拔式集成各种主流的解决方案,而Spring Cloud Alibaba Seata本质是基于Spring Boot 自动装配来整合的。`

猜你喜欢

转载自juejin.im/post/7031184268688785438