學(xué)習(xí)記錄之注冊(cè)中心Nacos及Dubbo(1)
Dubbo實(shí)現(xiàn)微服務(wù)調(diào)用:
確定調(diào)用關(guān)系

order模塊調(diào)用stock模塊的減少庫(kù)存的功能
order模塊調(diào)用cart模塊的刪除購(gòu)物車的功能
business模塊調(diào)用order新增訂單的功能
要想實(shí)現(xiàn)Dubbo調(diào)用
必須按照Dubbo規(guī)定的配置和行業(yè)標(biāo)準(zhǔn)的結(jié)構(gòu)來(lái)實(shí)現(xiàn)
Dubbo調(diào)用的好處是直接將要消費(fèi)的目標(biāo)(例如order模塊中消費(fèi)stock的方法)編寫在當(dāng)前消費(fèi)者的業(yè)務(wù)邏輯層中,無(wú)需編寫新的代碼結(jié)構(gòu),開發(fā)流程不會(huì)因?yàn)镈ubbo而變化
修改stock模塊
?創(chuàng)建csmall-stock-service項(xiàng)目
如果當(dāng)前項(xiàng)目會(huì)成為Dubbo的生產(chǎn)者
需要將提供給別的服務(wù)調(diào)用的方法單獨(dú)編寫在一個(gè)項(xiàng)目中
這個(gè)項(xiàng)目中有的方法,別人才能調(diào)用到
????pom文件新增了Dubbo和當(dāng)前項(xiàng)目業(yè)務(wù)邏輯層接口的依賴,yml文件中要添加dubbo的配置信息:
將業(yè)務(wù)邏輯層實(shí)現(xiàn)類方法聲明為Dubbo可調(diào)用的方法:
如果當(dāng)前項(xiàng)目是服務(wù)的提供者(生產(chǎn)者)還需要在SpringBoot啟動(dòng)類上添加@EnableDubbo的注解,才能真正讓Dubbo功能生效
修改order模塊支持Dubbo,因?yàn)閛rder模塊在Dubbo的調(diào)用關(guān)系中,既是生產(chǎn)者又是消費(fèi)者
它消費(fèi)cart和stock的服務(wù),同時(shí)又為business模塊提供服務(wù)
因?yàn)閛rder模塊也是生產(chǎn)者@EnableDubbo注解仍然要寫
負(fù)載均衡:
在實(shí)際開發(fā)中,一個(gè)服務(wù)基本都是集群模式的,也就是多個(gè)功能相同的項(xiàng)目在運(yùn)行,這樣才能承受更高的并發(fā),這時(shí)一個(gè)請(qǐng)求到這個(gè)服務(wù),就需要確定訪問哪一個(gè)服務(wù)器.

Dubbo框架內(nèi)部支持負(fù)載均衡算法,能夠盡可能的讓請(qǐng)求在相對(duì)空閑的服務(wù)器上運(yùn)行
Dubbo內(nèi)部默認(rèn)支持負(fù)載均衡算法
在不同的項(xiàng)目中,可能選用不同的負(fù)載均衡策略,以達(dá)到最好效果
Loadbalance:就是負(fù)載均衡的意思
Dubbo內(nèi)置負(fù)載均衡策略算法
Dubbo內(nèi)置4種負(fù)載均衡算法
- **random loadbalance:隨機(jī)分配策略(默認(rèn))**
- round Robin Loadbalance:權(quán)重平均分配
- leastactive Loadbalance:活躍度自動(dòng)感知分配
- consistanthash Loadbalance:一致性hash算法分配
實(shí)際運(yùn)行過(guò)程中,每個(gè)服務(wù)器性能不同
在負(fù)載均衡時(shí),都會(huì)有性能權(quán)重,這些策略算法都考慮權(quán)重問題
隨機(jī)分配策略
隨機(jī)生成隨機(jī)數(shù),在哪個(gè)范圍內(nèi)讓哪個(gè)服務(wù)器運(yùn)行
優(yōu)點(diǎn):算法簡(jiǎn)單,效率高,長(zhǎng)時(shí)間運(yùn)行下,任務(wù)分配比例準(zhǔn)確
缺點(diǎn):偶然性高,如果連續(xù)的幾個(gè)隨機(jī)請(qǐng)求發(fā)送到性能弱的服務(wù)器,會(huì)導(dǎo)致異常甚至宕機(jī)
權(quán)重平滑分配:
如果幾個(gè)服務(wù)器權(quán)重一致,那么就是依次運(yùn)行
但是服務(wù)器的性能權(quán)重一致的可能性很小
所以我們需要權(quán)重評(píng)滑分配
一個(gè)優(yōu)秀的權(quán)重分配算法,應(yīng)該是讓每個(gè)服務(wù)器都有機(jī)會(huì)運(yùn)行的
如果一個(gè)集群服務(wù)器性能比為5:3:1
1>A? 2>A 3>A 4>A 5>A? 6>B? 7>B? 8>B 9>C10>A
上面的安排中,連續(xù)請(qǐng)求一個(gè)服務(wù)器肯定是不好的,我們希望所有的服務(wù)器都能夠穿插在一起運(yùn)行
Dubbo2.7之后更新了這個(gè)算法使用"**平滑加權(quán)算法**"優(yōu)化權(quán)重平均分配策略

活躍度自動(dòng)感知:
記錄每個(gè)服務(wù)器處理一次請(qǐng)求的時(shí)間,安裝時(shí)間比例來(lái)分配任務(wù)數(shù),運(yùn)行一次需要時(shí)間多的分配的請(qǐng)求數(shù)較少
一致性Hash算法:
根據(jù)請(qǐng)求的參數(shù)進(jìn)行hash運(yùn)算
以后每次相同參數(shù)的請(qǐng)求都會(huì)訪問固定服務(wù)器
因?yàn)楦鶕?jù)參數(shù)選擇服務(wù)器,不能平均分配到每臺(tái)服務(wù)器上
Seata概述:
Seata 是一款開源的分布式事務(wù)解決方案,致力于在微服務(wù)架構(gòu)下提供高性能和簡(jiǎn)單易用的分布式事務(wù)服務(wù),也是Spring Cloud Alibaba提供的組件
Seata官方文檔??https://seata.io/zh-cn/??更多信息可以通過(guò)官方文檔獲取
單體項(xiàng)目中的事務(wù),使用的技術(shù)叫Spring聲明式事務(wù)能夠保證一個(gè)業(yè)務(wù)中所有對(duì)數(shù)據(jù)庫(kù)的操作要么都成功,要么都失敗,來(lái)保證數(shù)據(jù)庫(kù)的數(shù)據(jù)完整性,但是在微服務(wù)的項(xiàng)目中,業(yè)務(wù)邏輯層涉及遠(yuǎn)程調(diào)用,當(dāng)前模塊發(fā)生異常,無(wú)法操作遠(yuǎn)程服務(wù)器回滾,這時(shí)要想讓遠(yuǎn)程調(diào)用也支持事務(wù)功能,就需要使用分布式事務(wù)組件Seata
事務(wù)的4個(gè)特性:ACID特性
- 原子性
- 一致性
- 隔離性
- 永久性
Seata保證微服務(wù)遠(yuǎn)程調(diào)用業(yè)務(wù)的原子性
Seata將為用戶提供了 AT、TCC、SAGA 和 XA 事務(wù)模式,為用戶打造一站式的分布式解決方案。
Seata的運(yùn)行原理(AT模式)
觀察下面事務(wù)模型

上面結(jié)構(gòu)是比較典型的遠(yuǎn)程調(diào)用結(jié)構(gòu)
如果account操作數(shù)據(jù)庫(kù)失敗需要讓order模塊和storage模塊撤銷(回滾)操作,聲明式事務(wù)不能完成這個(gè)操作,需要使用Seata來(lái)解決

Seata構(gòu)成部分包含
* 事務(wù)協(xié)調(diào)器TC
* 事務(wù)管理器TM
* 資源管理器RM
我們使用AT(自動(dòng))模式完成分布式事務(wù)的解決
AT模式運(yùn)行過(guò)程
1.事務(wù)的發(fā)起方(TM)會(huì)向事務(wù)協(xié)調(diào)器(TC)申請(qǐng)一個(gè)全局事務(wù)id,并保存
2.Seata會(huì)管理事務(wù)中所有相關(guān)的參與方的數(shù)據(jù)源,將數(shù)據(jù)操作之前和之后的鏡像都保存在undo_log表中,這個(gè)表是seata組件規(guī)定的表,沒有它就不能實(shí)現(xiàn)效果,依靠它來(lái)實(shí)現(xiàn)提交(commit)或回滾(roll back)的操作
3.事務(wù)的發(fā)起方(TM)會(huì)連同全局id一起通過(guò)遠(yuǎn)程調(diào)用運(yùn)行資源管理器(RM)中的方法
4.RM接收到全局id,去運(yùn)行指定方法,并將運(yùn)行結(jié)果的狀態(tài)發(fā)送給TC
5.如果所有分支運(yùn)行都正常,事務(wù)管理器(TM)會(huì)通過(guò)事務(wù)協(xié)調(diào)器通知所有模塊執(zhí)行數(shù)據(jù)庫(kù)操作,真正影響數(shù)據(jù)庫(kù)內(nèi)容,反之如果有任何一個(gè)分支模塊運(yùn)行異常,都會(huì)通知TC,再由TC通知所有分支將數(shù)據(jù)庫(kù)操作回滾,恢復(fù)成運(yùn)行之前的樣子