我的项目实践地址:spring-cloud-seata
Seata-Server
1.下载地址:http://seata.io/zh-cn/blog/download.html ,目前最新版本是1.1.0
2.下载完成之后可以适当修改/seata/config/file.conf 关于数据库部分:
## database store property
db {
## the implement of javax.sql.DataSource, such as DruidDataSource(druid)/BasicDataSource(dbcp) etc.
datasource = "dbcp"
## mysql/oracle/h2/oceanbase etc.
dbType = "mysql"
driverClassName = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://127.0.0.1:3306/seata"
user = "root"
password = ""
minConn = 1
maxConn = 10
globalTable = "global_table"
branchTable = "branch_table"
lockTable = "lock_table"
queryLimit = 100
}
3.上述数据库可以有源码(https://github.com/seata/seata),\seata\script\server\db\mysql.sql执行创建;
4.windows只需要执行\seata\bin\seata-server.bat即可启动seata-server服务
Spring Cloud服务搭建
使用Spring Cloud + Mybatisplus + Mysql构建服务,需要四个服务,以官网给出的案例参考,account-server, order-server,storge-server,business-app.可以查阅:https://gitee.com/kevin1992/opensource-learn/tree/master/spring-cloud-seata,我就不在这里沾源码了。
示例过程中遇到的问题
1.application.properties中tx-service-group与file.conf中vgroupMapping后面的一致。否则会报错,如第三个图下图:
2.看官网案例都是需要进行代理数据源配置,但是MybatisPlus配置如下才可以,否则直接使用其他官网参考会出一些错误,不过这块还需要回过头来再重新审查一下是什么道理。
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import javax.sql.DataSource;
@Configuration
public class DataSourceProxyConfiguration {
@Autowired
private DataSourceProperties dataSourceProperties;
/**
* 数据源对象
*
* @return
*/
@Bean
public DataSource dataSource() {
return dataSourceProperties.initializeDataSourceBuilder().build();
}
@Bean
public SqlSessionFactory sqlSessionFactoryBean(DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean sqlSessionFactory = new MybatisSqlSessionFactoryBean();
sqlSessionFactory.setDataSource(dataSource);
MybatisConfiguration configuration = new MybatisConfiguration();
configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
configuration.setJdbcTypeForNull(JdbcType.NULL);
sqlSessionFactory.setConfiguration(configuration);
sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/**Mapper.xml"));
sqlSessionFactory.setPlugins(new Interceptor[]{
new PaginationInterceptor(),
new OptimisticLockerInterceptor()
});
return sqlSessionFactory.getObject();
}
}
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@ComponentScan("com.account.**")
@EnableEurekaClient
@EnableFeignClients
@Import(DataSourceProxyConfiguration.class)
@MapperScan("com.account.mapper*")
public class AccountApplication {
public static void main(String[] args) {
SpringApplication.run(AccountApplication.class);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
3.所有服务调用使用的application.properties中tx-service-group需要配置一致,否则order调用account时,seata没起作用。
4.全局异常拦截导致全局事务失效
被调用服务,如果是异常拦截处理,非直接抛出错误,在fegin调用的时候会认为是成功,从而达不到数据一致的效果。关于在Spring Cloud和seata结合上我还需要继续探索怎么使用。
5.版本问题导致fegin调用报错
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-seata</artifactId>
<version>2.2.1.RELEASE</version>
</dependency>
2.2.1版本的spring-cloud-starter-alibaba-seata需要依赖不低于org.springframework.cloud:spring-cloud-starter-openfeign:2.2.2.RELEASE,Spring Cloud需要依赖:
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR3</spring-cloud.version>
</properties>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
学习参考:
1.seata官网地址
2.seeta代码案例
3.seata github地址