我的項目實踐地址: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地址