失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > springcloud分布式事务_Springcloud 分布式事务集成Naco Seata

springcloud分布式事务_Springcloud 分布式事务集成Naco Seata

时间:2024-03-13 03:50:40

相关推荐

springcloud分布式事务_Springcloud 分布式事务集成Naco Seata

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

消息一致性 基于TCC分布式事务

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

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

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

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

zipkin 依赖图如下

业务系统同时调用

订单服务 新增一条订单

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

库存服务 库存减少

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

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

@GlobalTransactional 是Seata的注释

orderFeignClient 订单微服务

accountFeignClient 客户微服务

storageFeignClient 库存微服务

@GlobalTransactionalpublicvoidpurchase(StringuserId,StringcommodityCode,intorderCount){//创建订单orderFeignClient.create(userId,commodityCode,orderCount);//金额减少accountFeignClient.debit(userId,orderCount);//库存服务减少库存storageFeignClient.deduct(commodityCode,orderCount);}

@FeignClient(name="account-service")publicinterfaceAccountFeignClient{@GetMapping("/test/debit")Booleandebit(@RequestParam("userId")StringuserId,@RequestParam("count")intcount);}

@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("account branch exception");

}

}

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

application.properties文件

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`作为服务名注册到SeataServer上,如果和`file.conf`中的配置不一致,会提示`noavailableservertoconnect`错误也可以通过配置`spring.cloud.alibaba.seata.tx-service-group`修改后缀,但是必须和`file.conf`中的配置保持一致

代码如下

/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 购买下单,当发生请求超时,库存不足,或者金额不足的时候,全局事务回滚。

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

本文链接:

/yaobo2816/article/details/111127301

如果觉得《springcloud分布式事务_Springcloud 分布式事务集成Naco Seata》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。