【分布式事务系列】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自动完成了数据源的代理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
java复制代码@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注解的代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
java复制代码@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 自动装配来整合的。`

本文转载自: 掘金

开发者博客 – 和开发相关的 这里全都有

0%