项目组件
与seata相关组件:
- 注册中心:consul
- 网关:zuul
- 微服务调用:feign
- 数据库中间件:mybatis (单实例,无读写分离)
项目需求
多个微服务存在协同操作,需要事务控制保证数据一致性
配置集成方式
- 安装seata:githubSeata 没有代理的同学我在附上栏有提供附件
- 配置注册中心: registry.conf 中,选择注册中心为consul,自己的微服务名:microservice-seata-server(可自定义)
- 配置seata数据库:registry.conf中,配置选为file,name= “file.conf”,在file.conf中 store属性选db,db中配置数据库信息
- 启动seata注册到注册中心,连接数据库 我这里测试为windows版本,seata-server.bat 启动时最好加本地ip,否者seata识别为客户端地址,会使用局域网(172.*),对应启动时加入参数 -h ${ip}
- 微服务springboot项目main类修改注解(数据源动态代理)
- 编写数据库config类
付上
数据源动态配置类
/**
* 数据源代理
*/
@Configuration
public class DataSourceConfiguration {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
DruidDataSource druidDataSource = new DruidDataSource();
return druidDataSource;
}
@Primary
@Bean("dataSource")
public DataSourceProxy dataSource(DataSource druidDataSource){
return new DataSourceProxy(druidDataSource);
}
@Bean
public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSourceProxy);
sqlSessionFactoryBean.setMapperLocations(
new PathMatchingResourcePatternResolver()
.getResources("classpath*:/mapper/*.xml"));
sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
return sqlSessionFactoryBean.getObject();
}
在启动类上添加上以下注解
@Import(DataSourceConfig.class) //DataSourceConfig是上面配置文件的
同时在@SpringBootApplication注解上排除自动加载数据源
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
pom依赖
<!-- https://mvnrepository.com/artifact/io.seata/seata-spring-boot-starter -->
<dependency>
<groupId>io.seata</groupId>
<artifactId>seata-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.1.RELEASE</version>
<exclusions>
<exclusion>
<artifactId>io.seata</artifactId>
<groupId>seata-spring-boot-starter</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- api需至1.4.5版本 -->
<dependency>
<groupId>com.ecwid.consul</groupId>
<artifactId>consul-api</artifactId>
<version>1.4.5</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.3</version>
</dependency>
application增加配置
这部分配置也可以写在file.conf中
seata:
enabled: true
application-id: applicationName
tx-service-group: microservice-zgh-fescar-service-group
enable-auto-data-source-proxy: false
use-jdk-proxy: false
registry:
type: consul
consul:
cluster: microservice-seata-server
server-addr: consul-server.zgh-dev.svc.cluster.local:8500
# config:
# file:
# name: file.conf
transport:
# tcp, unix-domain-socket
type: tcp
#NIO, NATIVE
server: nio
#enable heartbeat
heartbeat: true
# the client batch send request enable
enable-client-batch-send-request: false
#thread factory for netty
thread-factory:
boss-thread-prefix: NettyBoss
worker-thread-prefix: NettyServerNIOWorker
server-executor-thread-prefix: NettyServerBizHandler
share-boss-worker: false
client-selector-thread-prefix: NettyClientSelector
client-selector-thread-size: 1
client-worker-thread-prefix: NettyClientWorkerThread
# netty boss thread size
boss-thread-size: 1
#auto default pin or 8
worker-thread-size: default
# when destroy server, wait seconds
shutdown:
wait: 3
serialization: seata
compressor: none
service:
vgroup-mapping:
microservice-zgh-fescar-service-group: default
grouplist:
zgh-dev-consul.sco.inossem.com:30820: default
enable-degrade: true
disable-global-transaction: false
`