springcloud 分布式事务_Springcloud 分布式事务解决方案 集成Naco Seata

本文介绍了Seata作为一款非侵入式的分布式事务解决方案,它提供了AT、TCC、SAGA和XA事务模式。通过在方法上添加@GlobalTransactional注解即可实现分布式事务,无需改动原有代码。文中还分享了如何集成Naco、OpenFeign和Zipkin进行链路追踪,并提供了测试用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:分布式系统架构中,最最费劲的是分布式事务,分布式事务解决方案网上大致分为两种

  1.    消息一致性

  2.   基于TCC分布式事务   

   不管基于那种解决方案,都是对侵入的代码植入,以大量的代码或者消息来作为代价,来实现分布式事务。

   有没有一种可以非侵入的分布式事务解决方案,答案是有的。阿里Seata

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

  最重要的是非侵入性的。不用动原有的代码逻辑,直接在方法体上加入注解@GlobalTransactional,就可以实现。

 zipkin  依赖图如下

bae24314a96a060d8e3c53b1c9d3b1a4.png

业务系统同时调用

订单服务    新增一条订单

 客户服务    用户自己账户扣费

库存服务    库存减少

1956d85542d2fcd87beb6011ea27499b.png

 例子是从Seata官网下载,自己修改了服务间调用,集成了Naco和链路追追zipkin。

 比较重要的代码, 先解释。

@GlobalTransactional 是Seata的注释
orderFeignClient 订单微服务
accountFeignClient 客户微服务
storageFeignClient 库存微服务
@GlobalTransactional
    public void purchase(String userId, String commodityCode, int orderCount) {
 
        // 创建订单
        orderFeignClient.create(userId, commodityCode, orderCount);
        // 金额减少
        accountFeignClient.debit(userId, orderCount);
        // 库存服务 减少库存
        storageFeignClient.deduct(commodityCode, orderCount);
    }
@FeignClient(name = "account-service")
public interface AccountFeignClient {
 
    @GetMapping("/test/debit")
    Boolean debit(@RequestParam("userId") String userId, @RequestParam("count") int count);
}
 @Transactional(rollbackFor = Exception.class)
    public void debit(String userId, BigDecimal num) {
        Account account = accountDAO.findByUserId(userId);
        account.setMoney(account.getMoney().subtract(num));
        if(account.getMoney().intValue()            throw new RuntimeException("余额不足");
        }
 
        accountDAO.save(account);
 
        if (ERROR_USER_ID.equals(userId)) {
            throw new RuntimeException("account branch exception");
        }
    }

配置的时候几点注意说明,非常重要

f084fb08cea0453f7201274b3bcdbcbe.png

application.properties文件

5d90b93aed6a94fb0f375ef85f12babe.png

file.conf 文件


其中红色区域 business-service 一定一定一定要一样。

这是解释:

- file.conf 的 service.vgroup_mapping 配置必须和`spring.application.name`一致
 
在 `org.springframework.cloud:spring-cloud-starter-alibaba-seata`的`org.springframework.cloud.alibaba.seata.GlobalTransactionAutoConfiguration`类中,默认会使用 `${spring.application.name}-fescar-service-group`作为服务名注册到 Seata Server上,如果和`file.conf`中的配置不一致,会提示 `no available server to connect`错误
 
也可以通过配置 `spring.cloud.alibaba.seata.tx-service-group`修改后缀,但是必须和`file.conf`中的配置保持一致

代码如下

https://gitee.com/yaobo2816/springcloud-AlibabaNaco/tree/master/seata-samples-master/springcloud-jpa-seata

springcloud-jpa-seata这是代码根路径。

代码集成Naco  Seata OpenFeign  zipkin 链路分析

相关截图

2d7c1e74406c0ce5a2c4b0d7a774223c.png

 

eeaddb08ff561232cfb717f069eeb228.png

测试 

http://localhost:8084/test/purchase/commit  购买下单,模拟全局事务提交     

http://localhost:8084/test/purchase/rollback   购买下单,当发生请求超时,库存不足,或者金额不足的时候,全局事务回滚。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

本文链接:

https://blog.youkuaiyun.com/yaobo2816/article/details/111127301

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值