分佈式事務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地址

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