佛山房地產(chǎn)網(wǎng)站建設(shè)企業(yè)網(wǎng)址
1、SpringCloud組件有哪些
SpringCloud 是一系列框架的有序集合。它利用 SpringBoot 的開發(fā)便利性巧妙地簡化了分布式系統(tǒng)基礎(chǔ)設(shè)施的開發(fā),如服務(wù)發(fā)現(xiàn)注冊(cè)、配置中心、消息總線、負(fù)載均衡、斷路器、數(shù)據(jù)監(jiān)控等,都可以用 SpringBoot 的開發(fā)風(fēng)格做到一鍵啟動(dòng)和部署。
早期我們一般認(rèn)為的Spring Cloud五大組件是
- Eureka : 注冊(cè)中心
- Ribbon : 負(fù)載均衡
- Feign : 遠(yuǎn)程調(diào)用
- Hystrix : 服務(wù)熔斷
- Zuul/Gateway : 網(wǎng)關(guān)
隨著SpringCloudAlibba在國內(nèi)興起 , 我們項(xiàng)目中使用了一些阿里巴巴的組件
-
注冊(cè)中心/配置中心 Nacos
-
負(fù)載均衡 Ribbon
-
服務(wù)調(diào)用 Feign
-
服務(wù)保護(hù) sentinel
-
服務(wù)網(wǎng)關(guān) Gateway
2、Feign工作原理
Feign是SpringCloud技術(shù)棧中用于遠(yuǎn)程調(diào)用的一個(gè)HTTP客戶端,主要作用是將遠(yuǎn)程服務(wù)調(diào)用格式本地方法調(diào)用格式統(tǒng)一成一致的
Feign的工作步驟如下:
-
首先需要在SpringBoot的啟動(dòng)類上添加@EnableFeignClients 注解開啟對(duì)Feign的支持
-
當(dāng)程序啟動(dòng)時(shí),會(huì)掃描所有標(biāo)有@FeignClient的注解的類,并且將這些信息注入Spring IOC 容器中
-
當(dāng)定義的 Feign 接口中的方法被調(diào)用時(shí),通過JDK的代理方式,來生成具體的 RequestTemplate
-
RequestTemplate對(duì)象封裝了 HTTP 請(qǐng)求需要的全部信息,如請(qǐng)求參數(shù)名,請(qǐng)求方法等信息
-
然后RequestTemplate生成 Request,并將Request交給Client去處理,這里的 Client 可以是 JDK 原生的 URLConnection、Apache 的 HttpClient等
-
最后Client被封裝到LoadBalanceClient類,這個(gè)類結(jié)合Ribbon負(fù)載均衡發(fā)起服務(wù)之間的調(diào)用
3、什么是Hystrix
在微服務(wù)架構(gòu)中,我們會(huì)拆分出很多的服務(wù),服務(wù)之間存在復(fù)雜的調(diào)用關(guān)系,那么這些服務(wù)一旦會(huì)出現(xiàn)失敗的情況,就會(huì)導(dǎo)致服務(wù)雪崩
Hystrix就是來防止服務(wù)雪崩的工具,它具有服務(wù)降級(jí),服務(wù)熔斷,服務(wù)隔離,監(jiān)控等一些防止雪崩的技術(shù)。 它有四種防雪崩手段:
- 服務(wù)隔離:隔離服務(wù)之間相互影響
- 服務(wù)監(jiān)控:在服務(wù)發(fā)生調(diào)用時(shí),會(huì)將每秒請(qǐng)求數(shù)、成功請(qǐng)求數(shù)等運(yùn)行指標(biāo)記錄下來
- 服務(wù)熔斷:接口調(diào)用失敗就會(huì)進(jìn)入調(diào)用接口提前定義好的一個(gè)熔斷的方法,返回錯(cuò)誤信息
- 服務(wù)降級(jí):接口調(diào)用失敗就調(diào)用本地的方法返回一個(gè)空
4、Hystrix斷路器狀態(tài)有哪些
斷路器狀態(tài)機(jī)包括三個(gè)狀態(tài):
- closed:關(guān)閉狀態(tài),斷路器放行所有請(qǐng)求,并開始統(tǒng)計(jì)異常比例、慢請(qǐng)求比例。超過閾值則切換到open狀態(tài)
- open:打開狀態(tài),服務(wù)調(diào)用被熔斷,訪問被熔斷服務(wù)的請(qǐng)求會(huì)被拒絕,快速失敗,直接走降級(jí)邏輯。Open狀態(tài)5秒后(默認(rèn)值)會(huì)進(jìn)入half-open狀態(tài)
- half-open:半開狀態(tài),放行一次請(qǐng)求,根據(jù)執(zhí)行結(jié)果來判斷接下來的操作
- 請(qǐng)求成功:則切換到closed狀態(tài)
- 請(qǐng)求失敗:則切換到open狀態(tài)
5、Ribbon的工作原理
我們項(xiàng)目中使用的是Feign來進(jìn)行遠(yuǎn)程微服務(wù)的調(diào)用,Feign的底層是集成了Ribbon的,大體使用流程如下:
- 當(dāng)請(qǐng)求發(fā)出的時(shí)候,會(huì)被Ribbon的負(fù)載均衡攔截器所有攔截
- Ribbon會(huì)提取請(qǐng)求路徑中微服務(wù)的名稱,然后去服務(wù)治理中心中查找微服務(wù)的對(duì)應(yīng)的服務(wù)地址
- Ribbon會(huì)使用配置的負(fù)載均衡策略從眾多地址中選擇一個(gè),進(jìn)行調(diào)用
6、Ribbon的負(fù)載均衡策略有哪些
Ribbon官方提供了7種負(fù)載均衡策略
- 輪詢策略:按照一定的順序依次調(diào)用服務(wù)實(shí)例
- 權(quán)重策略:根據(jù)每個(gè)服務(wù)提供者的響應(yīng)時(shí)間分配一個(gè)權(quán)重,響應(yīng)時(shí)間越長,權(quán)重越小,被選中的可能性也就越低。它的實(shí)現(xiàn)原理是,剛開始使用輪詢策略并開啟一個(gè)計(jì)時(shí)器,每一段時(shí)間收集一次所有服務(wù)提供者的平均響應(yīng)時(shí)間,然后再給每個(gè)服務(wù)提供者附上一個(gè)權(quán)重,權(quán)重越高被選中的概率也越大。
- 隨機(jī)策略:從服務(wù)提供者的列表中隨機(jī)選擇一個(gè)服務(wù)實(shí)例
- 最小連接數(shù)策略:遍歷服務(wù)提供者列表,選取連接數(shù)最小的一個(gè)服務(wù)實(shí)例。如果有相同的最小連接數(shù),那么會(huì)調(diào)用輪詢策略進(jìn)行選取。
- 重試策略:按照輪詢策略來獲取服務(wù),如果獲取的服務(wù)實(shí)例為 null 或已經(jīng)失效,則在指定的時(shí)間之內(nèi)不斷地進(jìn)行重試來獲取服務(wù),如果超過指定時(shí)間依然沒獲取到服務(wù)實(shí)例則返回 null。
- 可用性敏感策略:先過濾掉非健康的服務(wù)實(shí)例,然后再選擇連接數(shù)較小的服務(wù)實(shí)例
- 區(qū)域敏感策略:根據(jù)服務(wù)所在區(qū)域(zone)的性能和服務(wù)的可用性來選擇服務(wù)實(shí)例,在沒有區(qū)域的環(huán)境下,該策略和輪詢策略類似。