更新時(shí)間:2022-03-28 10:09:34 來(lái)源:動(dòng)力節(jié)點(diǎn) 瀏覽2735次
前言:分布式系統(tǒng)架構(gòu),最難的是分布式事務(wù),分布式事務(wù)解決方案大致可以分為兩種
1.消息一致性
2.基于TCC分布式事務(wù)
不管是基于哪種解決方案,都是侵入式代碼植入,以大量代碼或消息為代價(jià),來(lái)實(shí)現(xiàn)分布式事務(wù)。
有沒(méi)有非侵入式的分布式事務(wù)解決方案,答案是肯定的。阿里·西塔
Seata是一個(gè)開(kāi)源的分布式事務(wù)解決方案,致力于提供高性能和易用的分布式事務(wù)服務(wù)。Seata將為用戶提供AT、TCC、SAGA和XA事務(wù)模式,為用戶打造一站式分布式解決方案。
最重要的是非侵入性。不碰原代碼邏輯,直接在方法體@GlobalTransactional添加注釋?zhuān)纯蓪?shí)現(xiàn)。
zipkin的依賴(lài)圖如下

業(yè)務(wù)系統(tǒng)同時(shí)調(diào)用
訂單服務(wù) 添加訂單
客服 用戶自有賬戶扣款
庫(kù)存服務(wù) 庫(kù)存減少

例子來(lái)自Seata官網(wǎng)下載,修改了inter服務(wù)調(diào)用,集成了Naco和鏈接追蹤zipkin。
更重要的代碼,先解釋一下。
@GlobalTransactional 是 Seata 注釋
orderFeignClient 訂單微服務(wù)
accountFeignClient 客戶微服務(wù)
storageFeignClient 庫(kù)存微服務(wù)
@GlobalTransactional
public void purchase(String userId, String goodsCode, int orderCount) {
// 創(chuàng)建訂單
orderFeignClient.create(userId,commodityCode, orderCount);
// 金額減少
accountFeignClient.debit(userId, orderCount);
// 庫(kù)存服務(wù)減少庫(kù)存
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("賬戶分支異常");
}
}
配置的時(shí)候注意下面的說(shuō)明,很重要

application.properties 文件

文件.conf 文件
紅色區(qū)域 business-service 必須相同。
這是一個(gè)解釋。:
- file.conf 的 service.vgroup_mapping 配置必須和`spring.application.name`協(xié)議
在`org.springframework.cloud:spring-cloud-starter-alibaba-seata`的`org.springframework.cloud.alibaba.seata。 GlobalTransactionAutoConfiguration`類(lèi),默認(rèn)`${spring.application.name}-fescar-service-group`注冊(cè)為服務(wù)名到Seata Server上,如果和`file.conf`中的配置不一致,會(huì)提示`no available server to connect`報(bào)錯(cuò)
你也可以配置`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 鏈接分析
相關(guān)截圖


測(cè)試
http://localhost:8084/test/purchase/commit 采購(gòu)訂單,模擬全局事務(wù)提交
http://localhost:8084/test/purchase/rollback 采購(gòu)訂單,當(dāng)請(qǐng)求超時(shí),庫(kù)存不足,或者金額不足時(shí),全局事務(wù)回滾。
Java實(shí)驗(yàn)班
0基礎(chǔ) 0學(xué)費(fèi) 15天面授
Java就業(yè)班
有基礎(chǔ) 直達(dá)就業(yè)
Java夜校直播班
業(yè)余時(shí)間 高薪轉(zhuǎn)行
Java在職加薪班
工作1~3年,加薪神器
Java架構(gòu)師班
工作3~5年,晉升架構(gòu)
提交申請(qǐng)后,顧問(wèn)老師會(huì)電話與您溝通安排學(xué)習(xí)