赞
踩
前言:分布式系统架构中,最最费劲的是分布式事务,分布式事务解决方案网上大致分为两种
不管基于那种解决方案,都是对侵入的代码植入,以大量的代码或者消息来作为代价,来实现分布式事务。
有没有一种可以非侵入的分布式事务解决方案,答案是有的。 阿里Seata
Seata 是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务。Seata 将为用户提供了 AT、TCC、SAGA 和 XA 事务模式,为用户打造一站式的分布式解决方案。
最重要的是非侵入性的。不用动原有的代码逻辑,直接在方法体上加入注解@GlobalTransactional,就可以实现。
zipkin 依赖图如下
业务系统同时调用
订单服务 新增一条订单
客户服务 用户自己账户扣费
库存服务 库存减少
例子是从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()< 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`作为服务名注册到 Seata Server上,如果和`file.conf`中的配置不一致,会提示 `no available server to connect`错误
-
- 也可以通过配置 `spring.cloud.alibaba.seata.tx-service-group`修改后缀,但是必须和`file.conf`中的配置保持一致
代码如下
springcloud-jpa-seata这是代码根路径。
代码集成Naco Seata OpenFeign zipkin 链路分析
相关截图
测试
http://localhost:8084/test/purchase/commit 购买下单,模拟全局事务提交
http://localhost:8084/test/purchase/rollback 购买下单,当发生请求超时,库存不足,或者金额不足的时候,全局事务回滚。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。