- 學(xué)習(xí)項(xiàng)目:https://github.com/14251104246/spring-cloud-rest-tcc
- 下載源碼奔誓,進(jìn)入源碼目錄運(yùn)行:
mvn clean package
- Docker Compose運(yùn)行
docker-compose -f infrastructure-compose.yml up -d
docker-compose -f basic-ms-compose.yml up -d
docker-compose -f monitor-ms-compose.yml up -d
docker-compose -f business-ms-compose.yml up -d
全部運(yùn)行后發(fā)現(xiàn)內(nèi)存不夠(電腦沒超過(guò)16g內(nèi)存的就可以放棄了)- 只用docker-compose運(yùn)行前兩個(gè)次和,剩下選擇性通過(guò)源碼啟動(dòng)
- 發(fā)現(xiàn)mysql沒啟動(dòng)成功一姿,改用本地mysql
- 本地?cái)?shù)據(jù)庫(kù)執(zhí)行如下腳本
CREATE USER 'chris' IDENTIFIED BY '123123'; CREATE SCHEMA IF NOT EXISTS `account` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `product` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `order` DEFAULT CHARACTER SET utf8; CREATE SCHEMA IF NOT EXISTS `membership` DEFAULT CHARACTER SET utf8; GRANT ALL ON `account`.* TO 'chris'; GRANT ALL ON `product`.* TO 'chris'; GRANT ALL ON `order`.* TO 'chris'; GRANT ALL ON `membership`.* TO 'chris';
- 首先添加host
## solar
127.0.0.1 eureka1
127.0.0.1 eureka2
127.0.0.1 rabbitmq
127.0.0.1 zipkin_server
127.0.0.1 solar_mysql
127.0.0.1 gitlab
- 進(jìn)入源碼啟動(dòng)
ZipkinMsApplication
- 進(jìn)入源碼啟動(dòng)
OrderMsApplication
發(fā)現(xiàn)控制臺(tái)只輸出banner
,且沒注冊(cè)到eureka
修改spring cloud配置中心的eureka配置(已上傳到示例項(xiàng)目)關(guān)閉加密(已上傳到示例項(xiàng)目)
- 進(jìn)入源碼啟動(dòng)
- 進(jìn)入源碼啟動(dòng)
- 打開訂單服務(wù)的swagger測(cè)試api
深入了解
- 示例項(xiàng)目中子項(xiàng)目間依賴(使用網(wǎng)關(guān)的情況):
image.png
-
Try Confirm Cancel 補(bǔ)償模式在示例項(xiàng)目中的應(yīng)用
- RESTful TCC模式分3個(gè)階段執(zhí)行
graph LR try階段-->Confirm階段 Confirm階段-->Cancel階段-失敗時(shí)才有
- 示例項(xiàng)目中的RESTful TCC模式
- 由
order
訂單對(duì)account
和product
發(fā)起嘗試摘仅,再向tcc
協(xié)調(diào)器發(fā)起確認(rèn); -
tcc
協(xié)調(diào)器對(duì)account
和product
進(jìn)行確認(rèn) - 如果失敗則進(jìn)入
cancel
階段
- 由
- 示例項(xiàng)目中的RESTful TCC模式圖例
image.png- 示例項(xiàng)目整體架構(gòu)
image.png
各服務(wù)解析
首次啟動(dòng)時(shí)通過(guò)Flyway自動(dòng)初始化數(shù)據(jù)庫(kù)靶庙。
對(duì)spring cloud config server采用fail fast策略,一旦遠(yuǎn)程配置服務(wù)無(wú)法連接則無(wú)法啟動(dòng)業(yè)務(wù)服務(wù)娃属。
account
用于獲取用戶信息六荒,用戶注冊(cè),修改用戶余額矾端,預(yù)留余額資源掏击,確認(rèn)預(yù)留余額,撤銷預(yù)留余額秩铆。
product
用于獲取產(chǎn)品信息砚亭,變更商品庫(kù)存,預(yù)留庫(kù)存資源殴玛,確認(rèn)預(yù)留庫(kù)存捅膘,撤銷預(yù)留庫(kù)存。
tcc coordinator
TCC資源協(xié)調(diào)器滚粟,其職責(zé)如下:
- 對(duì)所有參與者發(fā)起Confirm請(qǐng)求寻仗。
- 無(wú)論是協(xié)調(diào)器發(fā)生的錯(cuò)誤還是調(diào)用參與者所產(chǎn)生的錯(cuò)誤,協(xié)調(diào)器都必須有自動(dòng)恢復(fù)重試功能凡壤,尤其是在確認(rèn)的階段愧沟,以防止網(wǎng)絡(luò)抖動(dòng)的情況。
order
order
服務(wù)是本項(xiàng)目的入口鲤遥,盡管所提供的功能很簡(jiǎn)單:
- 下單. 即生成預(yù)訂單沐寺,為了更好地測(cè)試TCC功能,在下單時(shí)就通過(guò)Feign向服務(wù)
account
與product
發(fā)起預(yù)留資源請(qǐng)求盖奈,并且記錄入庫(kù)混坞。 - 確認(rèn)訂單. 確認(rèn)訂單時(shí)根據(jù)訂單ID從庫(kù)中獲取訂單,并獲取預(yù)留資源確認(rèn)的URI,交由服務(wù)
tcc
統(tǒng)一進(jìn)行確認(rèn)究孕,如果發(fā)生沖突即記錄入庫(kù)啥酱,等待人工處理。