Dubbo整合seata实现分布式事务

简介: Dubbo整合seata实现分布式事

概览

本篇文章,根据官网代码demo演示而来

springboot、dubbo、seata实现分布式事务整合 DEMO


操作步骤如下:

  • 1.seata-server端,修改server配置
  • 2.client端(你自己的项目),引入配置文件,修改配置文件
  • 3.数据源代理设置
  • 4.创建数据库表
  • 5.启动注册中心(ZK),启动server,启动client(包括订单服务,库存服务)


1.此demo技术选型及版本信息

运行环境 版本要求
jdk 1.8+
Spring Boot 1.5+
MySQL 5.7+
ZooKeeper 3.4+
Seata 1.0.0
Dubbo 2.6.5


2.demo概况

  • springboot-base:存储公共调用的基类接口,mapper接口,Model层的类等,可mvn install后,供另外三个module调用。
  • springboot-dubbo-storage:库存服务;
  • springboot-dubbo-order:订单服务;
  • springboot-dubbo-client:RPC消费者,提供对外接口;

order服务关键代码如下:

    @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void createOrder(OrderDTO orderDTO) {
        //1、远程方法 扣减库存
        storageService.decreaseStorage(storageDTO);
        //2、本地方法 创建订单
        orderMapper.createOrder(order);
    }


3.创建业务数据库

  • seata_order:存储订单的数据库;
  • seata_storage:存储库存的数据库;


4.seata 组件

1,配置Seata数据源

/**
 * seata数据源
 *
 * init datasource proxy
 * @Param: druidDataSource  datasource bean instance
 * @Return: DataSourceProxy  datasource proxy
 */
@Bean
public DataSourceProxy dataSourceProxy(DruidDataSource druidDataSource){
    return new DataSourceProxy(druidDataSource);
}


2,Seata初始化

/**
 * 配置全局事务扫描器。有两个参数,一个是应用名称,一个是事务分组
 *
 * @return
 */
@Bean
public GlobalTransactionScanner globalTransactionScanner() {
    return new GlobalTransactionScanner("springboot-dubbo-storage", "my_test_tx_group");
}

3,配置注册中心,内容在file.conf和registry.conf。

4,注解标记事务方法,在订单创建的方法上,加上@GlobalTransactional注解即可。


5.启动测试(注意先后顺序)

依次启动Seata、springboot-dubbo-storage、springboot-dubbo-order、springboot-dubbo-client后,打开postman测试,配置测试参数为:

正常情况:

请求地址:http://localhost:18090/order/create

请求方式:post

请求内容(body):

{
    "userId":1,
    "productId":1,
    "count":10,
    "money":100
}

通过我们访问/order下单接口,根据响应的内容我们确定商品已经购买成功

数据库内的商品库存有所扣减


6.测试异常情况

我们模拟userId为666时,会出现异常

请求地址:http://localhost:18090/order/create

请求方式:post

请求内容(body):

{
    "userId":666,
    "productId":8,
    "count":5,
    "money":50
}
 @Override
    @GlobalTransactional(rollbackFor = Exception.class)
    public void createOrder(OrderDTO orderDTO) {
        log.info("开始全局事务。XID=" + RootContext.getXID());
        // 库存
        StorageDTO storageDTO = new StorageDTO();
        storageDTO.setTotal(orderDTO.getCount());
        storageDTO.setProductId(orderDTO.getProductId());
        //1、远程方法 扣减库存
        storageService.decreaseStorage(storageDTO);
        //2、本地方法 创建订单
        orderDTO.setId(order_id.incrementAndGet());
        Order order = new Order();
        BeanUtils.copyProperties(orderDTO,order);
        orderMapper.createOrder(order);
        // 构造异常抛出 在addOrder报错后,会有全局事务的rollback过程
        if (orderDTO.getUserId() == 666) {
            throw new RuntimeException("分布式事务异常..." + orderDTO.getId());
        }
    }

此时我们可以发现下单后数据库数据并没有任何改变 ,扣减的库存和创建的订单都回滚了


参考链接



相关文章
|
10月前
|
Java 数据库
在Java中使用Seata框架实现分布式事务的详细步骤
通过以上步骤,利用 Seata 框架可以实现较为简单的分布式事务处理。在实际应用中,还需要根据具体业务需求进行更详细的配置和处理。同时,要注意处理各种异常情况,以确保分布式事务的正确执行。
|
6月前
|
SQL
seata是怎么进行分布式事务控制的
seata是怎么进行分布式事务控制的
|
10月前
|
数据库
如何在Seata框架中配置分布式事务的隔离级别?
总的来说,配置分布式事务的隔离级别是实现分布式事务管理的重要环节之一,需要认真对待和仔细调整,以满足业务的需求和性能要求。你还可以进一步深入研究和实践 Seata 框架的配置和使用,以更好地应对各种分布式事务场景的挑战。
290 63
|
10月前
|
存储 Java 关系型数据库
在Spring Boot中整合Seata框架实现分布式事务
可以在 Spring Boot 中成功整合 Seata 框架,实现分布式事务的管理和处理。在实际应用中,还需要根据具体的业务需求和技术架构进行进一步的优化和调整。同时,要注意处理各种可能出现的问题,以保障分布式事务的顺利执行。
643 53
|
8月前
|
Java 关系型数据库 数据库
微服务SpringCloud分布式事务之Seata
SpringCloud+SpringCloudAlibaba的Seata实现分布式事务,步骤超详细,附带视频教程
536 1
|
10月前
|
消息中间件 运维 数据库
Seata框架和其他分布式事务框架有什么区别
Seata框架和其他分布式事务框架有什么区别
187 1
|
12月前
|
SQL NoSQL 数据库
SpringCloud基础6——分布式事务,Seata
分布式事务、ACID原则、CAP定理、Seata、Seata的四种分布式方案:XA、AT、TCC、SAGA模式
SpringCloud基础6——分布式事务,Seata
|
关系型数据库 MySQL 数据库
SpringCloud2023中使用Seata解决分布式事务
对于分布式系统而言,需要保证分布式系统中的数据一致性,保证数据在子系统中始终保持一致,避免业务出现问题。分布式系统中对数据的操作要么一起成功,要么一起失败,必须是一个整体性的事务。Seata简化了这个使用过程。
283 2
|
Java 关系型数据库 MySQL
(二十七)舞动手指速写一个Seata-XA框架解决棘手的分布式事务问题
相信大家对于事务问题都不陌生,在之前《MySQL事务篇》中曾详解过MySQL的事务机制,在传统的单库环境下开发,咱们可依赖于MySQL所提供的事务机制,来确保单个事务内的一组操作,要么全部执行成功,要么全部执行失败。
187 2