<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
分散式事務通常採用2PC協定,全稱Two Phase Commitment Protocol。該協定主要為了解決在分散式資料庫場景下,所有節點間資料一致性的問題。分散式事務通過2PC協定將提交分成兩個階段:
2PC和3PC的區別就是解決參與者超時的問題和多加了一層詢問,保證資料的傳輸可靠性。
LCN並不生產事務,LCN只是本地事務的協調工,TX-LCN定位於一款事務協調性框架,框架其本身並不操作事務,而是基於對事務的協調從而達到事務一致性的效果。
參考檔案:https://www.codingapi.com/docs/txlcn-preface/
1、在github上面下載 Lcn 原始碼
倉庫地址:https://github.com/codingapi/tx-lcn,注意下載版本。
2、將專案匯入idea中,啟動對應的專案
修改對應的組態檔:
spring.application.name=TransactionManager
server.port=7970
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://www.kaicostudy.com:3306/transaction_lcn?characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456mybatis.configuration.map-underscore-to-camel-case=true
mybatis.configuration.use-generated-keys=true# TxManager Host Ip
tx-lcn.manager.host=127.0.0.1
# TxClient連線請求埠
tx-lcn.manager.port=8070
# 心跳檢測時間(ms)
tx-lcn.manager.heart-time=15000
# 分散式事務執行總時間
tx-lcn.manager.dtx-time=30000
#引數延遲刪除時間單位ms
tx-lcn.message.netty.attr-delay-time=10000
tx-lcn.manager.concurrent-level=128
# 開啟紀錄檔
tx-lcn.logger.enabled=true
logging.level.com.codingapi=debug#redis 連線資訊
spring.redis.host=www.kaicostudy.com
spring.redis.port=6379
redisu5BC6u7801
#spring.redis.password=
將專案中提供的SQL語句在資料庫中執行,建立對應的表。
請求路徑:http://127.0.0.1:7970/admin/index.html
預設登入密碼:codingapi
登入成功頁面
埠介紹:
8070:TM事務訊息埠
7970:後臺管理頁面登入頁面
在分散式系統A系統呼叫B系統服務介面的時候時候,兩個服務的都需要使用 LCN 來控制分散式事務。
使用步驟:
1、引入lcn 相關的maven依賴
<dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-tc</artifactId> <version>5.0.2.RELEASE</version> </dependency> <dependency> <groupId>com.codingapi.txlcn</groupId> <artifactId>txlcn-txmsg-netty</artifactId> <version>5.0.2.RELEASE</version> </dependency>
2、yml 組態檔增加 lcn 的設定
tx-lcn: client: manager-address: www.kaicostudy.com:8070 logger: enabled: true
3、使用
springboot專案主類上加上註解:@EnableDistributedTransaction
參與方與發起方都要加上該註解
@LcnTransaction
@Transactional
呼叫案例:
A服務的方法,需要去呼叫B服務方法
@Service public class ServiceA { @Autowired private ValueDao valueDao; //本地db操作 @Autowired private ServiceB serviceB;//遠端B模組業務 @LcnTransaction //分散式事務註解 @Transactional //本地事務註解 public String execute(String value) throws BusinessException { // step1. call remote service B String result = serviceB.rpc(value); // (1) // step2. local store operate. DTX commit if save success, rollback if not. valueDao.save(value); // (2) valueDao.saveBackup(value); // (3) return result + " > " + "ok-A"; } }
B服務的方法,被A服務的方法呼叫
@Service public class ServiceB { @Autowired private ValueDao valueDao; //本地db操作 @LcnTransaction //分散式事務註解 @Transactional //本地事務註解 public String rpc(String value) throws BusinessException { valueDao.save(value); // (4) valueDao.saveBackup(value); // (5) return "ok-B"; } }
一個請求一個執行緒
程式碼執行邏輯:
1、判斷方法是否有加上@L cnTransaction, 如果有加上該註解則直接會走 切面類 TransactionAspect
2、判斷當前執行緒快取中是否有事務分組id,如果沒有快取則是為發起方,如果有快取則是為參與方
3、隨機的建立分組的id,將該分組id註冊到協調者中。
4、本地 threadLock 快取該事務分組id
5、A服務(發起方)呼叫B(參與方)服務的介面,重寫了 RequestInterceptor(該介面是feign框架提供的攔截器,基本上每個rpc框架都會提供類似的攔截器) feign 使用者端,將該事務分組id設定到請求中
6、執行到B服務介面,Spring TracingApplier實現,在請求之前攔截,從請求頭中獲取事務分組id,放入到當前執行緒快取中
7、B服務介面走到aop裡面程式碼時,會先判斷是發起方還是參與方。
8、從快取中獲取該事務分組id,當前派單服務則是為參與方,在告訴給協調者加入該事務分組。.
Lcn 如何判斷自己是發起方還是參與方?
根據當前的執行緒threadlocal 中獲取事務分組id, 如果能夠成功獲取到則是為參與方,沒有能夠獲取到就是為發起方。
參與方如何加入LCN全域性協調者?
發起方會把事務id註冊到協調者裡面去,參與方根據請求頭裡面的事務分組id加入該事務。
發起方如何通知全域性回滾還是提交?
發起方的方法執行完成之後,會修改事務狀態,再根據全域性協調者通知其他參與者事務執行完成。反之,如果發起方的方法執行方法異常,事務狀態改為錯誤狀態,再通過全域性協調者傳送給其他參與者,參與者再回滾事務即可。
A呼叫B,B呼叫C 到底會生產幾次事務id?
每次原遠端呼叫介面都會生成一個事務id,但是一條呼叫鏈上只有一個事務分組id(全域性id)。只有A是發起方,B和C都是參與方。可以從請求頭中獲取到事務分組id就是參與方,表示加入到這個分組裡面去的。
入口:@LcnTransaction,TransactionAspect 切面類。
feign 重寫的攔截器,給請求頭新增資訊,事務分組id
到此這篇關於Java詳細分析LCN框架分散式事務的文章就介紹到這了,更多相關Java LCN框架內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45