SpringBoot整合Hmily實(shí)現(xiàn)TCC分布式事務(wù)
今天是分布式事務(wù)系列的第二篇,springBoot整合Hmily實(shí)現(xiàn)TCC分布式事務(wù)
第一篇鏈接:springBoot整合atomikos實(shí)現(xiàn)分布式事務(wù)
首先我們創(chuàng)建三個(gè)springboot項(xiàng)目
- eureka-server:eureka注冊(cè)中心
- test-server:服務(wù)一
- cpy-server:服務(wù)二
大家不要在意項(xiàng)目名稱了,我就隨意取的,大家好創(chuàng)建好三個(gè)服務(wù)
然后在 test-server 和 cpy-server服務(wù)的resources目錄下創(chuàng)建 hmily.yml 文件,文件內(nèi)容如下:
hmily: server: configMode: local appName: test-server # 如果server.configMode eq local 的時(shí)候才會(huì)讀取到這里的配置信息. config: appName: test-server repository: mysql ribbon: rule: enabled: true repository: database: driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/hmily?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true username: root password: 12345 metrics: metricsName: prometheus //注意:test-server和cpy-server的端口號(hào)要不一樣 port: 8801
然后我們需要?jiǎng)?chuàng)建一個(gè)hmily 的數(shù)據(jù)庫(kù)
test-server服務(wù)改造
現(xiàn)在我們要實(shí)現(xiàn)微服務(wù)之間的服務(wù)調(diào)用,在這里我們使用openfeign來調(diào)用cpy-server服務(wù)的接口
在test-server服務(wù)的TestServiceImpl類中實(shí)現(xiàn)具體的業(yè)務(wù)邏輯
@Service public class TestServiceImpl implements TestService{ @Resource private TestDao testDao; @Resource private CypFeign cypFeign; //在需要事務(wù)的方法上加上 @HmilyTCC注解 @HmilyTCC(confirmMethod = "confirm",cancelMethod = "cancel") @Override public String insert(Test test) { //本地服務(wù)調(diào)用 testDao.insert(test); //調(diào)用cyp-server服務(wù)的接口 cypFeign.insert(); //模擬拋出異常 int i = 1/ 0; return "success"; } // confirm名字要與@HmilyTCC中的confirmMethod中配置的值一樣,而是參數(shù)要與方法一致 public String confirm(Test test) { //修改狀態(tài)為1 System.out.println("test - confirm執(zhí)行了"); testDao.update(test.getId()); return "confirm"; } // cancel名字要與@HmilyTCC中的cancelMethod中配置的值一樣,而是參數(shù)要與方法一致 public String cancel(Test test) { System.out.println("test - cancel執(zhí)行了"); testDao.del(test.getId()); return "cancel"; }
然后在openFeign的接口也要加上 @Hmily 注解
@FeignClient(value = "cpy-server") public interface CypFeign { @PostMapping("/cyp/insert") @Hmily String insert(); }
cpy-server服務(wù)改造
@Service public class CypServiceImpl implements CypService{ @Resource private CypDao cypDao; //在test-server調(diào)用的方法上加上 @HmilyTCC @HmilyTCC(confirmMethod = "confirm",cancelMethod = "cancel") public String insert(Cyp cyp) { cypDao.insert(cyp); return "success"; } // confirm名字要與@HmilyTCC中的confirmMethod中配置的值一樣,而是參數(shù)要與方法一致 public String confirm(Cyp cyp) { System.out.println("confirm執(zhí)行了"); cypDao.update(cyp.getId()); return "confirm"; } // cancel名字要與@HmilyTCC中的cancelMethod中配置的值一樣,而是參數(shù)要與方法一致 public String cancel(Cyp cyp) { System.out.println("cancel執(zhí)行了"); cypDao.del(cyp.getId()); return "cancel"; } }
在有異常的時(shí)候,兩個(gè)服務(wù)都執(zhí)行了cancel階段的方法
當(dāng)把模擬異常的代碼去掉,發(fā)現(xiàn)兩個(gè)服務(wù)都正常的執(zhí)行了提交方法
到此,springboot微服務(wù)整合Hmily實(shí)現(xiàn)TCC分布式事務(wù)已經(jīng)完成了
但是TCC服務(wù)還是要有一些問題需要考慮的,主要有以下幾個(gè)
- 1:try階段異常
- 2:cancel階段異常
- 3:comfirm階段異常
- 4:本地事務(wù)與TCC事務(wù)沖突
- 5:空回滾
- 6:事務(wù)懸掛
至于如何解決以上問題,可以參考:TCC分布式事務(wù)七種異常情況小結(jié)
以上就是SpringBoot整合Hmily實(shí)現(xiàn)TCC分布式事務(wù)的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot Hmily TCC分布式事務(wù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- Springboot-dubbo-fescar 阿里分布式事務(wù)的實(shí)現(xiàn)方法
- SpringBoot+Dubbo+Seata分布式事務(wù)實(shí)戰(zhàn)詳解
- 詳解SpringBoot基于Dubbo和Seata的分布式事務(wù)解決方案
- springboot cloud使用eureka整合分布式事務(wù)組件Seata 的方法
- springboot整合rocketmq實(shí)現(xiàn)分布式事務(wù)
- springboot整合shardingsphere和seata實(shí)現(xiàn)分布式事務(wù)的實(shí)踐
- java?SpringBoot?分布式事務(wù)的解決方案(JTA+Atomic+多數(shù)據(jù)源)
- springboot整合Atomikos的示例詳解
相關(guān)文章
ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法
ThreadLocal 的內(nèi)存泄漏問題通常發(fā)生在使用 ThreadLocal 存儲(chǔ)對(duì)象時(shí),尤其是在多線程環(huán)境中,線程池中的線程復(fù)用可能導(dǎo)致一些資源沒有及時(shí)清理,從而引發(fā)內(nèi)存泄漏,所以本文給大家介紹了ThreadLocal內(nèi)存泄露的產(chǎn)生原因和處理方法,需要的朋友可以參考下2024-12-12Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息
最近在開發(fā)中需要從request中獲取操作系統(tǒng),瀏覽器及瀏覽器版本信息,所以下面這篇文章主要給的大家介紹了關(guān)于Java基礎(chǔ)教程之獲取操作系統(tǒng)及瀏覽器信息的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-10-10Spring純注解開發(fā)模式讓開發(fā)簡(jiǎn)化更簡(jiǎn)化
Spring3.0引入了純注解開發(fā)的模式,框架的誕生是為了簡(jiǎn)化開發(fā),那注解開發(fā)就是簡(jiǎn)化再簡(jiǎn)化。Spring的特性在整合MyBatis方面體現(xiàn)的淋漓盡致哦2022-08-08Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域匯總
這篇文章主要給大家介紹了關(guān)于Java虛擬機(jī)運(yùn)行時(shí)數(shù)據(jù)區(qū)域的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08Idea啟動(dòng)SpringBoot程序報(bào)錯(cuò):Veb server failed to&nbs
這篇文章主要介紹了Idea啟動(dòng)SpringBoot程序報(bào)錯(cuò):Veb server failed to start. Port 8082 was already in use;端口沖突的原理與解決方案,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下2024-10-10Java多線程程序中synchronized修飾方法的使用實(shí)例
synchronized關(guān)鍵字主要北用來進(jìn)行線程同步,這里我們主要來演示Java多線程程序中synchronized修飾方法的使用實(shí)例,需要的朋友可以參考下:2016-06-06SpringBoot實(shí)現(xiàn)文件上傳與下載功能的示例代碼
文件上傳與下載是Web應(yīng)用開發(fā)中常用的功能之一。接下來我們將討論如何在Spring?Boot的Web應(yīng)用開發(fā)中,如何實(shí)現(xiàn)文件的上傳與下載,感興趣的可以了解一下2022-06-06java以json格式向后臺(tái)服務(wù)器接口發(fā)送請(qǐng)求的實(shí)例
下面小編就為大家分享一篇java以json格式向后臺(tái)服務(wù)器接口發(fā)送請(qǐng)求的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-01-01