更新時間:2022-03-28 10:09:34 來源:動力節點 瀏覽2129次
前言:分布式系統架構,最難的是分布式事務,分布式事務解決方案大致可以分為兩種
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 采購訂單,當請求超時,庫存不足,或者金額不足時,全局事務回滾。
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習