专注Java教育14年 全国咨询/投诉热线:444-1124-454
赢咖4LOGO图
始于2009,口口相传的Java黄埔军校
首页 hot资讯 NACOSeata集成SpringCloud分布式事务解决方案

NACOSeata集成SpringCloud分布式事务解决方案

更新时间:2022-03-28 10:09:34 来源:赢咖4 浏览1468次

前言:分布式系统架构,最难的是分布式事务,分布式事务解决方案大致可以分为两种

1.消息一致性

2.基于TCC分布式事务

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

有没有非侵入式的分布式事务解决方案,答案是肯定的。阿里·西塔

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

最重要的是非侵入性。不碰原代码逻辑,直接在方法体@GlobalTransactional添加注释,即可实现。

zipkin的依赖图如下

业务系统同时调用

订单服务 添加订单

客服 用户自有账户扣款

库存服务 库存减少

例子来自Seata官网下载,修改了inter服务调用,集成了Naco和链接追踪zipkin。

更重要的代码,先解释一下。

@GlobalTransactional 是 Seata 注释
orderFeignClient 订单微服务
accountFeignClient 客户微服务
storageFeignClient 库存微服务
@GlobalTransactional 
    public void purchase(String userId, String goodsCode, 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()< BigDecimal.ZERO.intValue()){ 
            throw new RuntimeException("缺乏余额"); 
        }  
        accountDAO.save(account);  
        if (ERROR_USER_ID.equals(userId)) { 
            throw new RuntimeException("账户分支异常"); 
        } 
    }

配置的时候注意下面的说明,很重要

application.properties 文件

文件.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 链接分析

相关截图

测试

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

http://localhost:8084/test/purchase/rollback 采购订单,当请求超时,库存不足,或者金额不足时,全局事务回滚。

提交申请后,顾问老师会电话与您沟通安排学习

免费课程推荐 >>
技术文档推荐 >>