SpringCloud集成Seata並使用Nacos做注冊中心與配置中心


本文為博主原創,未經允許不得轉載:

目錄:

  1. 下載並啟動Seata Server,並指定nacos作為配置中心和注冊中心

  2. 同步seata server的配置到nacos

  3. 啟動Seata Server

  4. Seata整合到Spring Cloud微服務

  5. 接入問題總結:

  6.demo項目gitee 鏈接: https://gitee.com/xiangbaxiang/seata-nacos-demo

1. 下載並啟動Seata Server,並指定nacos作為配置中心和注冊中心

  1.1 下載地址:http://seata.io/zh-cn/blog/download.html

     

  1.2 通過 seata 的 conf 目錄下的 file.conf 指定server 端存儲模式:

    支持 file ,db , redis 三種方式:

      file:(默認)單機模式,全局事務會話信息內存中讀寫並持久化本地文件root.data,性能較高(默認)

      db:(5.7+)高可用模式,全局事務會話信息通過db共享,相應性能差些

      redis:Seata-Server 1.3及以上版本支持,性能較高,存在事務信息丟失風險,請提前配置適合當前場景的redis持久化配置

  1.3 在 register.conf 指定注冊中心:

                             

   1.4 在 register.conf 指定配置中心:

       

   注意:客戶端配置registry.conf使用nacos時也要注意group要和seata server中的 group 一致,默認group是"DEFAULT_GROUP"

2. 同步seata server的配置到nacos

  先啟動本地的nacos  

  獲取/seata/script/config-center/config.txt,修改配置信息

    

   seata 從1.4 之后,seata 的安裝包中去除了 同步的配置文件,可以從這個目錄中獲取: https://github.com/seata/seata/tree/1.3.0/script 

   配置事務分組, 要與客戶端配置的事務分組一致

    (客戶端properties配置:spring.cloud.alibaba.seata.tx‐service‐group=my_test_tx_group)

                         

  通過腳本 配置參數同步到Nacos
 sh ${SEATAPATH}/script/config‐center/nacos/nacos‐config.sh ‐h localhost ‐p 8848 ‐g SEATA_GROUP ‐t 5a3c7d6c‐f497‐4d68‐a71a‐2e5e3340b3ca

    參數說明:

      -h: host,默認值 localhost
      -p: port,默認值 8848
      -g: 配置分組,默認值為 'SEATA_GROUP'
      -t: 租戶信息,對應 Nacos 的命名空間ID字段, 默認值為空。
   也可以直接使用以下命令進行同步 
sh nacos‐config.sh ‐h localhost ‐p 8848 ‐g SEATA_GROUP

3. 啟動Seata Server

    啟動Seata Server命令

bin/seata‐server.sh

    啟動成功,默認端口8091

4. Seata整合到Spring Cloud微服務

  業務場景:
    用戶下單,整個業務邏輯由三個微服務構成:
    倉儲服務:對給定的商品扣除庫存數量。
    訂單服務:根據采購需求創建訂單。
    帳戶服務:從用戶帳戶中扣除余額。

   4.1導入依賴:

<!‐‐ seata‐‐> 
 <dependency>
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring‐cloud‐starter‐alibaba‐seata</artifactId> 
    <exclusions> 
        <exclusion> 
            <groupId>io.seata</groupId> 
            <artifactId>seata‐all</artifactId> 
        </exclusion> 
    </exclusions> 
</dependency> 
 <dependency> 
    <groupId>io.seata</groupId> 
    <artifactId>seata‐all</artifactId> 
    <version>1.4.0</version> 
 </dependency> 
 <!‐‐nacos 注冊中心‐‐> 
 <dependency> 
    <groupId>com.alibaba.cloud</groupId> 
    <artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId> 
 </dependency> 
 <dependency>
    <groupId>org.springframework.cloud</groupId> 
    <artifactId>spring‐cloud‐starter‐openfeign</artifactId> 
    </dependency> 
<dependency> 
    <groupId>com.alibaba</groupId> 
    <artifactId>druid‐spring‐boot‐starter</artifactId> 
    <version>1.1.21</version> 
</dependency> 
<dependency> 
    <groupId>mysql</groupId> 
    <artifactId>mysql‐connector‐java</artifactId> 
    <scope>runtime</scope> 
    <version>8.0.16</version> 
</dependency> 
<dependency> 
    <groupId>org.mybatis.spring.boot</groupId> 
    <artifactId>mybatis‐spring‐boot‐starter</artifactId> 
    <version>2.1.1</version> 
</dependency>

<dependency>
  <groupId>io.seata</groupId>
  <artifactId>seata‐spring‐boot‐starter</artifactId>
  <version>1.4.0</version>
</dependency>

  4.2 微服務對應數據庫中添加undo_log

CREATE TABLE `undo_log` ( 
 `id` bigint(20) NOT NULL AUTO_INCREMENT, 
 `branch_id` bigint(20) NOT NULL, 
 `xid` varchar(100) NOT NULL, 
 `context` varchar(128) NOT NULL, 
 `rollback_info` longblob NOT NULL, 
 `log_status` int(11) NOT NULL, 
 `log_created` datetime NOT NULL, 
 `log_modified` datetime NOT NULL, 
 0 PRIMARY KEY (`id`), 
 UNIQUE KEY `ux_undo_log` (`xid`,`branch_id`) 
 ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

  4.3 在yml中配置

seata:
  enabled: true
  application-id: ${spring.application.name}
  # seata 服務分組,要與服務端nacos‐config.txt中service.vgroup_mapping的后綴對應 
  tx-service-group: my_test_tx_group
  config:
   # 指定nacos作為配置中心 
    type: nacos
    nacos:
      namespace:
      serverAddr: 127.0.0.1:8848
      group: SEATA_GROUP

  registry:
    # 指定nacos作為注冊中心 
    type: nacos
    nacos:
      application: seata-server
      server-addr: 127.0.0.1:8848
      namespace:
    

  在事務發起者中添加@GlobalTransactional注解

@GlobalTransactional

5. 接入問題總結:

  一般大多數情況下都是因為配置不匹配導致的:
  1.檢查現在使用的seata服務和項目maven中seata的版本是否一致
  2.檢查tx-service-group,nacos.cluster,nacos.group參數是否和Seata Server中的配置一致
  跟蹤源碼:seata/discover包下實現了RegistryService#lookup,用來獲取服務列表

 6.demo項目gitee 鏈接: https://gitee.com/xiangbaxiang/seata-nacos-demo

  在查看並使用該項目時,請先查看 ReadMe.md中的相關介紹。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM