成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何在 Spring Boot 中集成 Seata,解決分布式事務?

云計算 分布式
本文將詳細介紹如何在 Spring Boot 項目中集成 Seata,并通過具體的代碼案例實現分布式事務管理。以下內容包括配置、代碼實現以及一些注意事項,幫助你快速上手。

在分布式系統中,服務之間往往涉及多個數據庫操作,這就需要一個可靠的分布式事務解決方案來確保數據的一致性。Seata(Simple Extensible Autonomous Transaction Architecture)是一個開源的分布式事務解決方案,提供了高性能和易用的分布式事務服務。

本文將詳細介紹如何在 Spring Boot 項目中集成 Seata,并通過具體的代碼案例實現分布式事務管理。以下內容包括配置、代碼實現以及一些注意事項,幫助你快速上手。

整體步驟

1、準備工作:

  • 搭建 Seata Server 環境
  • 創建兩個模擬服務 order-service 和 account-service,分別代表訂單和賬戶的服務
  • 準備一個 Eureka/Nacos 注冊中心(推薦 Nacos)

2、配置 Seata:

  • 在項目中引入 Seata 依賴
  • 配置 Seata 客戶端
  • 配置數據源代理

3、代碼實現:

  • 使用 @GlobalTransactional 注解實現全局事務管理
  • 編寫業務邏輯和分布式事務示例

環境搭建

1、下載并啟動 Seata Server

從 Seata 官方倉庫下載 Seata Server:https://github.com/seata/seata/releases。解壓后,修改 conf/registry.conf 文件,將注冊中心改為 Nacos:

registry {
  type = "nacos"

  nacos {
    serverAddr = "localhost:8848"  # Nacos 服務地址
    namespace = ""                 # Nacos 命名空間
    cluster = "default"
  }
}

config {
  type = "nacos"

  nacos {
    serverAddr = "localhost:8848"
    namespace = ""
    group = "SEATA_GROUP"
  }
}

啟動 Seata Server:

sh bin/seata-server.sh

依賴引入

在兩個 Spring Boot 項目中添加以下依賴:

<dependency>
    <groupId>io.seata</groupId>
    <artifactId>seata-spring-boot-starter</artifactId>
    <version>1.6.1</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <version>2021.0.4.0</version>
</dependency>
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    <version>2021.0.4.0</version>
</dependency>

配置文件詳解

以下是 application.yml 配置文件示例(order-service 和 account-service 的配置基本相同,區別僅在服務名上)。

order-service 配置

server:
  port: 8081

spring:
  application:
    name: order-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/order_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml

seata:
  enabled: true
  tx-service-group: my_tx_group  # 事務組名,與 Seata Server 配置一致

account-service 配置

server:
  port: 8082

spring:
  application:
    name: account-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/account_db?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
    username: root
    password: 123456
    type: com.zaxxer.hikari.HikariDataSource

mybatis-plus:
  mapper-locations: classpath:/mapper/*.xml

seata:
  enabled: true
  tx-service-group: my_tx_group  # 事務組名

數據庫表設計

訂單表 order_tbl

CREATE TABLE order_tbl (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id VARCHAR(64) NOT NULL,
  product_id VARCHAR(64) NOT NULL,
  count INT NOT NULL,
  money DECIMAL(10,2) NOT NULL,
  status INT DEFAULT 0 COMMENT '0:待支付, 1:已支付'
);

賬戶表 account_tbl

CREATE TABLE account_tbl (
  id BIGINT AUTO_INCREMENT PRIMARY KEY,
  user_id VARCHAR(64) NOT NULL,
  total DECIMAL(10,2) NOT NULL,
  used DECIMAL(10,2) NOT NULL,
  residue DECIMAL(10,2) NOT NULL
);

核心代碼實現

1、全局事務注解

Seata 提供了 @GlobalTransactional 注解,用于在分布式事務中管理多個服務調用。

2、OrderService 示例

OrderService 中模擬訂單創建邏輯,同時調用 AccountService 扣減賬戶余額。

代碼實現
@Service
@Slf4j
public class OrderService {

    @Autowired
    private OrderMapper orderMapper;

    @Autowired
    private AccountClient accountClient; // Feign 客戶端調用 AccountService

    @GlobalTransactional(name = "create-order-transaction", rollbackFor = Exception.class)
    public void createOrder(String userId, String productId, int count, BigDecimal money) {
        log.info("-----> 開始新建訂單");
        Order order = new Order();
        order.setUserId(userId);
        order.setProductId(productId);
        order.setCount(count);
        order.setMoney(money);
        order.setStatus(0);
        orderMapper.insert(order);

        log.info("-----> 訂單服務調用賬戶,開始扣減余額");
        accountClient.decreaseAccount(userId, money);
        log.info("-----> 訂單服務調用賬戶,扣減余額完成");

        log.info("-----> 修改訂單狀態為已完成");
        order.setStatus(1);
        orderMapper.updateById(order);

        log.info("-----> 訂單處理結束");
    }
}
Mapper 層
@Mapper
public interface OrderMapper extends BaseMapper<Order> {}

3、AccountService 示例

AccountService 中實現賬戶余額的扣減邏輯。

代碼實現
@Service
@Slf4j
public class AccountService {

    @Autowired
    private AccountMapper accountMapper;

    public void decreaseAccount(String userId, BigDecimal money) {
        log.info("-----> 扣減賬戶余額開始");
        accountMapper.decrease(userId, money);
        log.info("-----> 扣減賬戶余額結束");
    }
}
Mapper 層
@Mapper
public interface AccountMapper {

    @Update("UPDATE account_tbl SET residue = residue - #{money}, used = used + #{money} WHERE user_id = #{userId}")
    void decrease(@Param("userId") String userId, @Param("money") BigDecimal money);
}

4、Feign Client 示例

@FeignClient(name = "account-service")
public interface AccountClient {

    @PostMapping("/account/decrease")
    void decreaseAccount(@RequestParam("userId") String userId, @RequestParam("money") BigDecimal money);
}

測試分布式事務

啟動服務后,通過 Postman 或其他工具發送請求:

curl -X POST http://localhost:8081/order/create \
     -H "Content-Type: application/json" \
     -d '{
           "userId": "1",
           "productId": "1",
           "count": 10,
           "money": 100.00
         }'

重要注意事項

1、Seata Undo Log 表: 在每個數據庫中創建 undo_log 表,供 Seata 記錄回滾日志。

CREATE TABLE undo_log (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    branch_id BIGINT NOT NULL,
    xid VARCHAR(128) NOT NULL,
    context VARCHAR(128) NOT NULL,
    rollback_info LONGBLOB NOT NULL,
    log_status INT NOT NULL,
    log_created DATETIME NOT NULL,
    log_modified DATETIME NOT NULL,
    UNIQUE KEY ux_undo_log (xid, branch_id)
);

2、Seata 配置中心: 確保 Seata Server 的配置與服務端一致,事務組名必須統一。

總結

通過以上配置和代碼示例,我們實現了基于 Seata 的分布式事務管理。在實際項目中,可以根據業務需求靈活調整服務和表設計,確保數據一致性。

如果需要更深入的優化或其他集成方法,可以進一步研究 Seata 的 AT、TCC 模式以及高可用配置。

責任編輯:武曉燕 來源: 架構師秋天
相關推薦

2022-03-24 07:51:27

seata分布式事務Java

2022-06-27 08:21:05

Seata分布式事務微服務

2025-04-30 10:44:02

2024-10-09 14:14:07

2022-06-21 08:27:22

Seata分布式事務

2025-04-28 00:44:04

2020-12-09 09:14:57

SpringCloudSeata 分布式

2022-07-10 20:24:48

Seata分布式事務

2025-05-07 00:10:00

分布式事務TCC模式

2020-12-08 11:43:03

Spring Clou分布式Seata

2021-04-23 08:15:51

Seata XA AT

2023-11-06 13:15:32

分布式事務Seata

2022-06-14 10:47:00

分布式事務數據

2024-08-19 09:05:00

Seata分布式事務

2020-04-28 12:18:08

Seata模式分布式

2022-01-12 10:02:02

TCC模式 Seata

2023-01-06 09:19:12

Seata分布式事務

2022-07-03 14:03:57

分布式Seata

2020-05-28 09:35:05

分布式事務方案

2023-08-17 10:23:07

擴展方案
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 免费成人在线网站 | 欧美在线视频观看 | 黄色网址免费在线观看 | 九九热在线观看视频 | h视频免费看 | 成年人免费网站 | 一区二区三区视频 | 一区二区三区免费 | 精品国产一区二区在线 | 国产一区二区不卡 | 日本午夜在线视频 | 亚洲欧美中文日韩在线v日本 | 国产精品免费一区二区 | 亚洲男人网 | 人干人操 | 日韩天堂av| 日韩免费av网站 | 91五月天 | 国产色婷婷精品综合在线播放 | www.一级片 | 婷婷午夜天 | 欧美日韩亚洲国产综合 | 国产精品久久久久久中文字 | 日韩欧美1区2区 | 国产成人精品午夜视频免费 | 伊人网在线看 | 成人h动漫精品一区二区器材 | 91毛片网| 色婷婷婷婷色 | a黄视频| 国产精品日韩高清伦字幕搜索 | 国产中的精品av涩差av | 91亚洲国产 | 成人高清在线 | 中文成人无字幕乱码精品 | 欧美1区2区 | 一区二区三区精品视频 | 乱码av午夜噜噜噜噜动漫 | 日韩毛片播放 | 国产精品一区二区三区在线 | 黄网站在线观看 |