基于Seata中间件,微服务模式下事务管理

本文涉及的产品
Serverless 应用引擎 SAE,800核*时 1600GiB*时
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。

一、Seata简介

1、Seata组件

Seata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata将为用户提供了AT、TCC、SAGA、XA事务模式,为用户打造一站式的分布式解决方案。

2、支持模式

AT 模式

  • 基于支持本地 ACID 事务的关系型数据库。
  • Java应用,通过 JDBC 访问数据库。

一阶段:业务数据和回滚日志记录在同一个本地事务中提交,释放本地锁和连接资源。

二阶段:提交异步化,非常快速地完成。回滚通过一阶段的回滚日志进行反向补偿。

TCC模式

一个分布式的全局事务,整体是两阶段提交的模型,全局事务是由若干分支事务组成的,分支事务要满足两阶段提交的模型要求,即需要每个分支事务都具备自己的:

一阶段 prepare 行为

二阶段 commit 或 rollback 行为

Saga模式

Saga模式是SEATA提供的长事务解决方案,在Saga模式中,业务流程中每个参与者都提交本地事务,当出现某一个参与者失败则补偿前面已经成功的参与者,一阶段正向服务和二阶段补偿服务都由业务开发实现。

XA模式

XA是一个分布式事务协议,对业务无侵入的分布式事务解决方案,XA提交协议需要事务参与者的数据库支持,XA事务具有强一致性,在两阶段提交的整个过程中,一直会持有资源的锁,性能不理想的缺点很明显。

二、服务端部署

1、下载组件包

1.2版本:seata-server-1.2.0.zip

解压目录

  • bin:存放服务端运行启动脚本;
  • lib:存放服务端依赖的资源jar包;
  • conf:配置文件目录。

2、修改配置

file.conf配置

mode:db 即使用数据库存储事务信息,这里还可以选择file存储方式。

file模式为单机模式,全局事务会话信息内存中读写并持久化本地文件root.data,性能较高;

db模式为高可用模式,全局事务会话信息通过db共享,相应性能差些;

redis模式Seata-Server 1.3及以上版本支持,性能较高,存在事务信息丢失风险,请提前配置合适当前场景的redis持久化配置.

store {
  ## store mode: file、db
  mode = "db"
  db {
    datasource = "druid"
    dbType = "mysql"
    driverClassName = "com.mysql.jdbc.Driver"
    url = "jdbc:mysql://127.0.0.1:3306/seata_server"
    user = "root"
    password = "123456"
    minConn = 5
    maxConn = 30
    globalTable = "global_table"
    branchTable = "branch_table"
    lockTable = "lock_table"
    queryLimit = 100
    maxWait = 5000
  }
}

registry.conf配置

这里选择eureka作为注册中心,seata-server也要作为一个服务添加到注册中心,不使用配置中心所以config配置默认即可。

registry {
  # file 、nacos 、eureka、redis、zk、consul、etcd3、sofa
  type = "eureka"

  eureka {
    serviceUrl = "http://localhost:8761/eureka"
    application = "default"
    weight = "1"
  }
}

3、事务管理表

需要在seata-server即上述配置的MySQL库中建立3张事务管理表:

  • 全局事务:global_table
  • 分支事务:branch_table
  • 全局锁:lock_table
  • 事务回滚:undo_log
  • SQL脚本:mysql-script目录

4、启动命令

Linux环境:sh seata-server.sh

三、业务服务搭建

1、代码结构

12-1.png

  • seata-eureka:注册中心
  • seata-order:订单服务
  • seata-account:账户服务
  • seata-inventor:库存服务
  • seata-client:客户端服务
  • account-feign:账户Feign接口
  • inventory-feign:库存Feign接口
  • order-feign:订单Feign接口

请求链路:客户端->订单->账户+库存,测试整个流程的分布式事务问题。

2、数据库结构

12-2.png

  • seata_server:seata组件服务端依赖库
  • seata_account:模拟账户数据库
  • seata_inventor:模拟库存数据库
  • seata_order:模拟订单数据库

各个库脚本位置:mysql-script/data-biz.sql

3、启动服务

依次启动:注册中心,库存服务,账户服务,订单服务,客户端服务;

Eureka服务列表如下:

12-3.png

四、Seata用法详解

1、Seata基础配置

12-4.png

几个基础服务的配置方式一样。

conf配置

file.conf重点关注下面内容,事务组的名称,需要在yml文件中使用。

my_test_tx_group = "default"

registry.conf:是注册中心的选择。

2、数据库配置

注意这里的事务组名称配置。

spring:
  # 事务组的名称
  cloud:
    alibaba:
      seata:
        tx-service-group: my_test_tx_group
  # 数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driverClassName: com.mysql.jdbc.Driver
      url: jdbc:mysql://127.0.0.1:3306/seata_account
      username: root
      password: 123456

将数据库整体由Seata进行代理管理,核心API:DataSourceProxy。

@Configuration
public class SeataAccountConfig {

    @Value("${spring.application.name}")
    private String applicationName;

    @Bean
    public GlobalTransactionScanner globalTransactionScanner() {
        return new GlobalTransactionScanner(applicationName, "test-tx-group");
    }

    @Bean
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    public DruidDataSource druidDataSource() {
        return new DruidDataSource() ;
    }

    @Primary
    @Bean("dataSource")
    public DataSourceProxy dataSourceProxy(DataSource druidDataSource) {
        return new DataSourceProxy(druidDataSource);
    }

    @Bean
    public SqlSessionFactory sqlSessionFactory(DataSourceProxy dataSourceProxy)throws Exception{
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSourceProxy);
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources("classpath*:/mapper/*.xml"));
        sqlSessionFactoryBean.setTransactionFactory(new SpringManagedTransactionFactory());
        return sqlSessionFactoryBean.getObject();
    }
}

3、业务代码

核心注解:GlobalTransactional,管理整体的分布式事务。

@Service
public class OrderServiceImpl implements OrderService {
    private final Logger LOGGER = LoggerFactory.getLogger(OrderServiceImpl.class);

    @Resource
    private OrderMapper orderMapper ;
    @Resource
    private AccountFeign accountFeign ;
    @Resource
    private InventoryFeign inventoryFeign ;

    @GlobalTransactional
    @Override
    public Integer createOrder(String orderNo) {
        LOGGER.info("Order 生成中 "+orderNo);
        // 本服务下订单库
        Integer insertFlag = orderMapper.insert(orderNo) ;
        // 基于feign接口处理账户和库存
        accountFeign.updateAccount(10L) ;
        inventoryFeign.updateInventory(10) ;
        return insertFlag ;
    }
}

测试流程:在任意服务下抛出异常,观察整体的事务状态,观察是否有整体的事务控制效果。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
14天前
|
存储 消息中间件 Apache
比较微服务中的分布式事务模式
比较微服务中的分布式事务模式
31 2
|
12天前
|
负载均衡 前端开发 API
我希望在系统设计面试之前知道的 12 种微服务模式
我希望在系统设计面试之前知道的 12 种微服务模式
|
9天前
|
设计模式 监控 API
探索微服务架构中的API网关模式
在微服务的宇宙里,API网关是连接星辰的桥梁。它不仅管理着服务间的通信流量,还肩负着保护、增强和监控微服务集群的重任。本文将带你走进API网关的世界,了解其如何成为微服务架构中不可或缺的一环,以及它在实际应用中扮演的角色和面临的挑战。
|
17天前
|
设计模式 中间件 测试技术
PHP中的中间件模式:简化代码与增强可维护性
【8月更文挑战第2天】 在PHP开发中,中间件模式是一种优雅的设计模式,它允许开发者通过定义一系列可重用的过滤和处理层来构建复杂的请求处理流程。本文将深入探讨如何在PHP应用程序中实现中间件模式,并辅以实际代码示例,展示如何利用这一模式简化代码结构,提高应用的可读性、可测试性和可维护性。通过阅读本文,你将学会创建自己的中间件,并将其集成到你的PHP项目中,从而提升你的开发效率和项目质量。
|
15天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
在微服务架构的海洋中,API网关扮演着枢纽的角色。它不仅是客户端请求的接收者,也是各个微服务间通信的协调者。本文将深入探讨API网关的设计原则、实现策略以及它在微服务生态中的重要性。我们将通过实际案例分析,了解API网关如何优化系统性能、提高安全性和简化客户端与服务的交互。
31 4
|
15天前
|
设计模式 中间件 PHP
探索PHP中的中间件模式
【8月更文挑战第4天】在现代Web开发中,设计模式的应用对于代码的可读性、可维护性和扩展性至关重要。本文将通过实例探讨PHP中如何实现和使用中间件模式,旨在为开发者提供一种灵活处理HTTP请求和响应的方法。我们将从中间件的基本概念入手,逐步深入到实际的代码实现,并讨论其在项目中的应用场景。
|
20天前
|
负载均衡 监控 API
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构的复杂网络中,API网关扮演着交通枢纽的角色,不仅简化了客户端与各微服务的交互,还提升了系统的安全性和可维护性。本文将深入探讨API网关的设计原则、核心功能以及在实际应用中的部署策略,旨在为后端开发者提供一套完整的API网关解决方案。
|
17天前
|
运维 负载均衡 监控
探索微服务架构中的API网关模式
在当今分布式系统和微服务架构日益盛行的背景下,API网关作为一种重要的设计模式,承担着请求路由、负载均衡、认证授权、监控统计等关键职责。本文将深入探讨API网关在微服务架构中的作用,分析其实现机制,以及如何在实际应用中高效地部署和管理API网关,从而提升系统的可扩展性、安全性和可维护性。
20 2
|
20天前
|
运维 监控 负载均衡
探索微服务架构中的API网关模式
【7月更文挑战第30天】在微服务架构中,API网关扮演着至关重要的角色。本文将深入探讨API网关的设计原则、实现方式以及其在微服务生态中的作用。我们将从API网关的基本概念出发,逐步展开其核心功能和优势,并通过实例分析如何在实际应用中有效部署API网关以提升系统的可维护性、可扩展性和安全性。
30 3
|
20天前
|
监控 负载均衡 API
探索微服务架构中的API网关模式
在现代后端开发中,微服务架构因其灵活性和可扩展性而受到青睐。然而,随着服务的增多,如何有效管理和路由请求变得至关重要。API网关作为微服务架构中的一个关键组件,承担着请求转发、负载均衡和服务聚合等职责。本文将深入探讨API网关的设计原则、实现技术以及在实际应用中面临的挑战和解决方案。