分布式事务Seata框架学习记录

我的项目实践地址: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地址

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章