Seata1.3+nacos+mysql8.x整合配置
1.先確定Seata版本
- spring-cloud-alibaba使用2.2.1.RELEASE版
- seata使用1.3版本,包括
seata服務端
(就是seata-server)、使用seata的各種微服務端(后面統稱seata客戶端
),都使用1.3版本
2.下載Seata1.3版本的源碼和Server版
- https://github.com/seata/seata/releases/download/v1.3.0/seata-server-1.3.0.zip
- https://github.com/seata/seata/archive/v1.3.0.zip
- 兩個文件解壓到不含有中文、沒有空格的路徑下(如果有空格會在后面配置推送到nacos報錯)
3.配置Seata服務端的mysql數據庫
- 先去mysql創建數據庫seata
- 去源碼目錄
/script/server/db
找到mysql.sql,在seata數據庫下執行 - 執行成功,可以看到多出了3張表
4.配置Seata服務端的配置列表
-
到源碼目錄
/script/config-center
中配置config.txt -
config.txt列表很長,都是默認配置,不需要全部保留,只保留修改項即可。我們是用mysql進行數據存儲,所以可以保留如下配置。注意:筆者下面文件的注釋是方便讀者理解的,實際上不能保留,自己配置的時候請刪除(否則后面推送到nacos會報錯)。
# 【重要】my_test_tx_group這個事務分組所使用的seata-server的集群名稱,要與后面seata-server中registry.conf的registry.nacos.cluster保持一致 service.vgroupMapping.my_test_tx_group=testCluster # 使用db存儲 store.mode=db store.db.datasource=druid store.db.dbType=mysql # 因為是mysql8.x版本,驅動位置發生了改變(有了.cj) store.db.driverClassName=com.mysql.cj.jdbc.Driver # mysql8.x版本serverTimezone需要按照下面設定(否則會報serverTimezone錯誤,一堆亂碼)。另外 這個屬性在推送到nacos之后參數可能會消失,需要手動修改以下 store.db.url=jdbc:mysql://127.0.0.1:3306/seata?useUnicode=true&serverTimezone=GMT%2B8 store.db.user=root store.db.password=root
-
到源碼目錄
/script/config-center/nacos
目錄下,執行nacos-config.sh
腳本(此命令依賴於git,可能需要讀者自己安裝)sh nacos-config sh -h nacos的Ip地址 -p nacos的端口號 -u nacos用戶名 -w nacos密碼 -g 本配置列表的所屬分組(要與后面seata服務端config.nacos.group保持一致,默認為SEATA_GROUP)
例如筆者命令為
sh nacos-config sh -h localhost -p 1111 -u nacos -w nacos -g SEATA_GROUP
推送之后,可以查看nacos的配置列表
另外需要查看store.db.url中參數是否丟失,如果丟失要重新配置一下
5.配置Seata服務端並啟動
-
到seata-server目錄
/conf/
中 -
配置registry.conf
# 注冊中心 registry { # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa # 如果是file,則需要配置file.conf # 因為本例使用nacos,此處填寫nacos type = "nacos" # 【重要】此處是nacos中的服務注冊配置 nacos { # 【重要】本服務端在nacos中的微服務名稱,后面seata客戶端的application.yml中要用到 application = "seata-server" # nacos地址(默認為8848,筆者此處做了負載均衡改了端口) serverAddr = "localhost:1111" # seata-server微服務的分組 group = "SEATA_GROUP" # seata-server微服務的命名空間,此處省略,使用默認值public namespace = "" # 【重要】seata-server作為集群時的集群名字,與前面nacos中設定事務分組屬性(service.vgroupMapping.my_test_tx_group)保持一致 cluster = "testCluster" # nacos1.2加入了鑒權,賬號密碼不可省略 username = "nacos" password = "nacos" } } # 配置中心 config { # file、nacos 、apollo、zk、consul、etcd3 # 因為本例使用nacos,此處填寫nacos type = "nacos" nacos { serverAddr = "localhost:1111" namespace = "" # 【重要】本服務端的配置在nacos配置列表哪個分組下,要與上面推送到nacos的分組列表保持一致,默認是SEATA_GROUP。 group = "SEATA_GROUP" username = "nacos" password = "nacos" } }
-
因為服務注冊和服務配置都是使用的nacos,所以讀者這里並不需要file.conf中的任何屬性,自然也不需要改動。后面需要修改配置直接在nacos中修改,SEATA_GROUP分組。
-
切換到
/bin/
文件夾下,准備啟動seata服務端,命令如下.\seata-server.bat -p 要使用的端口號
筆者默認8091端口被占用了,所以使用了8093端口,命令如下
.\seata-server.bat -p 8093
-
沒有報錯,則去查看nacos服務列表
並且也要確認集群名稱是否正確
6.配置Seata客戶端並啟動
-
引入POM依賴,因為
spring-cloud-starter-alibaba-seata
集成的1.1版本的seata,所以需要排除之后引入1.3版本的。筆者此處只寫了spring-cloud-alibaba下的seata的依賴,其余依賴請讀者自己配置。<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <exclusions> <exclusion> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.3.0</version> </dependency>
-
配置application.yml。同樣筆者只寫了seata配置,其余配置請讀者自己寫。
seata: # 開啟自動裝配 enabled: true # 本客戶端的微服務名稱 application-id: seata-order-service # 讀取哪個事務分組 # 例如此時會讀取 SEATA_GROUP 這個分組下的 service.vgroupMapping.my_test_tx_group 這個屬性的值。從上面的配置可以知道筆者此處的最終值為 testCluster。后面程序運行會找到 testCluster 這個集群的seata服務端,進行通訊。 tx-service-group: my_test_tx_group # 配置中心設置 config: type: nacos nacos: username: nacos password: nacos server-addr: localhost:1111 # 讀取的配置分組 group: SEATA_GROUP # 注冊中心設置 registry: type: nacos nacos: # SEATA服務中心的微服務名,此處與服務端保持一致 application: seata-server server-addr: localhost:1111 username: nacos password: nacos
-
因為筆者的seata客戶端配置也是使用的nacos,所以項目中並不需要file.conf這個文件。后面需要修改配置直接在nacos中修改,SEATA_GROUP分組。
-
增加seata代理數據源的配置
-
添加DataSourceProxyConfig類
package com.zhoushiya.springcloud.alibaba.config; import com.alibaba.druid.pool.DruidDataSource; import io.seata.rm.datasource.DataSourceProxy; import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.spring.transaction.SpringManagedTransactionFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.core.io.support.PathMatchingResourcePatternResolver; import javax.sql.DataSource; /** * 使用seata對數據源進行代理 * @author zhoushiya * @date 2020/10/4 16:12 */ @Configuration public class DataSourceProxyConfig { // mybatis的mapper文件夾地址 @Value("${mybatis.mapper-locations}") private String mapperLocations; @Bean @ConfigurationProperties(prefix = "spring.datasource.druid") public DataSource druidDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); return druidDataSource; } @Bean public SqlSessionFactory sqlSessionFactory(DataSource dataSource) throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource); factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(mapperLocations)); return factoryBean.getObject(); } }
-
修改主啟動類
@EnableDiscoveryClient @EnableFeignClients // 取消數據源的自動創建,使用Seata對數據源進行代理 @SpringBootApplication(exclude = DataSourceAutoConfiguration.class) // 導入自定義數據源配置 @Import({DataSourceProxyConfig.class}) public class OrderServiceMain2001 { public static void main(String[] args) { SpringApplication.run(OrderServiceMain2001.class,args); } }
-
-
啟動seata客戶端,檢查狀態是否成功
-
控制台輸出連上服務端
-
seata服務端顯示已連上
-
nacos中服務已注冊
-