SpringCloud各組件的主要功能及底層實(shí)現(xiàn)原理

Spring cloud組件

Eureka 注冊(cè)中心
Ribbon 本質(zhì)是一個(gè)帶有負(fù)載均衡功能的http客戶端
Feign 服務(wù)調(diào)用(消費(fèi)者調(diào)用提供者)
Hystrix 解決高并發(fā)
Zuul 服務(wù)網(wǎng)關(guān)

還有一種

Netflix Eureka 注冊(cè)中心
Netflix Ribbon 客服端負(fù)載均衡
Netflix Hystrix 斷路器解決高并發(fā)
Netflix Zuul 服務(wù)網(wǎng)關(guān)
Spring Cloud Config 分布式配置

Eureka

負(fù)責(zé)各個(gè)服務(wù)的注冊(cè)于發(fā)現(xiàn),分為服務(wù)端和客戶端

  1. 在每個(gè)客戶端啟動(dòng)的時(shí)候,會(huì)自動(dòng)的將自己的服務(wù)名稱,ip地址,端口號(hào)等信息注冊(cè)注冊(cè)中心。
  2. 服務(wù)端是一個(gè)注冊(cè)中心,里面有一個(gè)注冊(cè)表,保存了各服務(wù)所在的機(jī)器和端口號(hào),供所有的客戶端查詢。

Ribbon

本質(zhì)是一個(gè)帶有負(fù)載均衡功能的http客戶端,在每次請(qǐng)求的時(shí)候會(huì)選擇一臺(tái)機(jī)器,均勻的把請(qǐng)求分發(fā)到各臺(tái)機(jī)器上。Ribbon的負(fù)載均衡默認(rèn)使用的最經(jīng)典的Round Robin輪詢算法。

Ribbon的工作流程:

  1. 首先Ribbon會(huì)從 Eureka Client里獲取到對(duì)應(yīng)的服務(wù)注冊(cè)表,也就知道了所有的服務(wù)都部署在了哪些機(jī)器上,在監(jiān)聽(tīng)哪些端口號(hào);
  2. 然后Ribbon就可以使用默認(rèn)的Round Robin算法,從中選擇一臺(tái)機(jī)器。

Feign

Feign的一個(gè)關(guān)鍵機(jī)制就是使用了動(dòng)態(tài)代理,F(xiàn)eign默認(rèn)集成了Ribbon

Feign的工作原理:

  1. 如果你對(duì)某個(gè)接口定義了@FeignClient注解,F(xiàn)eign就會(huì)針對(duì)這個(gè)接口創(chuàng)建一個(gè)動(dòng)態(tài)代理;
  2. 接著你要是調(diào)用那個(gè)接口,本質(zhì)就是會(huì)調(diào)用 Feign創(chuàng)建的動(dòng)態(tài)代理,這是核心中的核心;
  3. Feign的動(dòng)態(tài)代理會(huì)根據(jù)你在接口上的@RequestMapping等注解,來(lái)動(dòng)態(tài)構(gòu)造出你要請(qǐng)求的服務(wù)的地址;
  4. 最后聰明從Ribbon中拿到對(duì)應(yīng)的IP地址個(gè)端口號(hào),針對(duì)這個(gè)地址,發(fā)起請(qǐng)求、解析響應(yīng)。

Hystrix

分布式系統(tǒng)中某個(gè)服務(wù)掛掉后,如果系統(tǒng)處于高并發(fā)的場(chǎng)景下,大量請(qǐng)求涌過(guò)來(lái)的時(shí)候,上游的服務(wù)會(huì)因?yàn)闆](méi)有一個(gè)線程可以處理請(qǐng)求,就會(huì)導(dǎo)致上游的服務(wù)也跟著掛掉,這就是微服務(wù)架構(gòu)中恐怖的服務(wù)雪崩問(wèn)題。Hystrix是隔離、熔斷以及降級(jí)的一個(gè)框架。Hystrix會(huì)搞很多個(gè)小小的線程池,比如訂單服務(wù)請(qǐng)求庫(kù)存服務(wù)是一個(gè)線程池,請(qǐng)求倉(cāng)儲(chǔ)服務(wù)是一個(gè)線程池,請(qǐng)求積分服務(wù)是一個(gè)線程池。每個(gè)線程池里的線程就僅僅用于請(qǐng)求那個(gè)服務(wù)。

熔斷
下游的服務(wù)掛掉后,每次在上游的服務(wù)調(diào)用它的時(shí)候都會(huì)卡住幾秒鐘,這沒(méi)有任何意義,可以直接都掛掉的服務(wù)熔斷處理。比如在5分鐘內(nèi)請(qǐng)求該服務(wù)直接就返回了,不要去走網(wǎng)絡(luò)請(qǐng)求卡住幾秒鐘,這個(gè)過(guò)程,就是所謂的熔斷!

降級(jí)
降級(jí)(比如積分服務(wù)掛了):每次調(diào)用積分服務(wù),你就在數(shù)據(jù)庫(kù)里記錄一條消息,說(shuō)給某某用戶增加了多少積分,因?yàn)榉e分服務(wù)掛了,導(dǎo)致沒(méi)增加成功!這樣等積分服務(wù)恢復(fù)了,你可以根據(jù)這些記錄手工加一下積分。這個(gè)過(guò)程,就是所謂的降級(jí)。

Zuul

這個(gè)組件是負(fù)責(zé)網(wǎng)絡(luò)路由的,一般微服務(wù)架構(gòu)中都必然會(huì)設(shè)計(jì)一個(gè)網(wǎng)關(guān)在里面,像android、ios、pc前端、微信小程序、H5等等,不用去關(guān)心后端的幾百個(gè)服務(wù),就知道有一個(gè)網(wǎng)關(guān),所有請(qǐng)求都往網(wǎng)關(guān)走,網(wǎng)關(guān)會(huì)根據(jù)請(qǐng)求中的一些特征,將請(qǐng)求轉(zhuǎn)發(fā)給后端的各個(gè)服務(wù)。而且有一個(gè)網(wǎng)關(guān)之后,還有很多好處,比如可以做統(tǒng)一的降級(jí)、限流、認(rèn)證授權(quán)、安全,等等。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容